X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Faudio_filter.cc;h=10f3849dffa3aa271b9521b14c4af24d9f1533e0;hp=59b5684ea62e2cd7e447599b215c6d1b6a44fc0e;hb=aeb835a18c8df347e0ed68fb24631b320abeb611;hpb=2d24bc7aaed800415bce4fffe06f261d5e9e464a diff --git a/src/lib/audio_filter.cc b/src/lib/audio_filter.cc index 59b5684ea..10f3849df 100644 --- a/src/lib/audio_filter.cc +++ b/src/lib/audio_filter.cc @@ -17,9 +17,9 @@ */ -#include #include "audio_filter.h" #include "audio_buffers.h" +#include using std::vector; using std::min; @@ -29,9 +29,9 @@ vector AudioFilter::sinc_blackman (float cutoff, bool invert) const { vector ir (_M + 1); - + /* Impulse response */ - + for (int i = 0; i <= _M; ++i) { if (i == (_M / 2)) { ir[i] = 2 * M_PI * cutoff; @@ -42,40 +42,40 @@ AudioFilter::sinc_blackman (float cutoff, bool invert) const ir[i] *= (0.42 - 0.5 * cos (2 * M_PI * i / _M) + 0.08 * cos (4 * M_PI * i / _M)); } } - + /* Normalise */ - + float sum = 0; for (int i = 0; i <= _M; ++i) { sum += ir[i]; } - + for (int i = 0; i <= _M; ++i) { ir[i] /= sum; } - + /* Frequency inversion (swapping low-pass for high-pass, or whatever) */ - + if (invert) { for (int i = 0; i <= _M; ++i) { ir[i] = -ir[i]; } ir[_M / 2] += 1; } - + return ir; } shared_ptr -AudioFilter::run (shared_ptr in) +AudioFilter::run (shared_ptr in) { shared_ptr out (new AudioBuffers (in->channels(), in->frames())); - + if (!_tail) { _tail.reset (new AudioBuffers (in->channels(), _M + 1)); _tail->make_silent (); } - + for (int i = 0; i < in->channels(); ++i) { for (int j = 0; j < in->frames(); ++j) { float s = 0; @@ -86,17 +86,17 @@ AudioFilter::run (shared_ptr in) s += in->data(i)[j - k] * _ir[k]; } } - + out->data(i)[j] = s; } } - + int const amount = min (in->frames(), _tail->frames()); if (amount < _tail->frames ()) { _tail->move (amount, 0, _tail->frames() - amount); } _tail->copy_from (in.get(), amount, in->frames() - amount, _tail->frames () - amount); - + return out; } @@ -124,16 +124,16 @@ BandPassAudioFilter::BandPassAudioFilter (float transition_bandwidth, float lowe { vector lpf = sinc_blackman (lower, false); vector hpf = sinc_blackman (higher, true); - + _ir.resize (_M + 1); for (int i = 0; i <= _M; ++i) { _ir[i] = lpf[i] + hpf[i]; } - + /* We now have a band-stop, so invert for band-pass */ for (int i = 0; i <= _M; ++i) { _ir[i] = -_ir[i]; } - + _ir[_M / 2] += 1; }