b7a675e6b85fa3472f9e6d9ffd2aaaed42fb6975
[dcpomatic.git] / src / lib / audio_filter.h
1 /*
2     Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef DCPOMATIC_AUDIO_FILTER_H
21 #define DCPOMATIC_AUDIO_FILTER_H
22
23 #include <boost/shared_ptr.hpp>
24
25 class AudioBuffers;
26 struct audio_filter_impulse_input_test;
27
28 /** An audio filter which can take AudioBuffers and apply some filtering operation,
29  *  returning filtered samples
30  */
31 class AudioFilter
32 {
33 public:
34         AudioFilter (float transition_bandwidth)
35                 : _ir (0)
36         {
37                 _M = 4 / transition_bandwidth;
38                 if (_M % 2) {
39                         ++_M;
40                 }
41         }
42
43         virtual ~AudioFilter ();
44
45         boost::shared_ptr<AudioBuffers> run (boost::shared_ptr<const AudioBuffers> in);
46
47         void flush ();
48
49 protected:
50         friend struct audio_filter_impulse_kernel_test;
51         friend struct audio_filter_impulse_input_test;
52
53         float* sinc_blackman (float cutoff, bool invert) const;
54
55         float* _ir;
56         int _M;
57         boost::shared_ptr<AudioBuffers> _tail;
58 };
59
60 class LowPassAudioFilter : public AudioFilter
61 {
62 public:
63         /** Construct a windowed-sinc low-pass filter using the Blackman window.
64          *  @param transition_bandwidth Transition bandwidth as a fraction of the sampling rate.
65          *  @param cutoff Cutoff frequency as a fraction of the sampling rate.
66          */
67         LowPassAudioFilter (float transition_bandwidth, float cutoff);
68 };
69
70 class HighPassAudioFilter : public AudioFilter
71 {
72 public:
73         /** Construct a windowed-sinc high-pass filter using the Blackman window.
74          *  @param transition_bandwidth Transition bandwidth as a fraction of the sampling rate.
75          *  @param cutoff Cutoff frequency as a fraction of the sampling rate.
76          */
77         HighPassAudioFilter (float transition_bandwidth, float cutoff);
78 };
79
80 class BandPassAudioFilter : public AudioFilter
81 {
82 public:
83         /** Construct a windowed-sinc band-pass filter using the Blackman window.
84          *  @param transition_bandwidth Transition bandwidth as a fraction of the sampling rate.
85          *  @param lower Lower cutoff frequency as a fraction of the sampling rate.
86          *  @param higher Higher cutoff frequency as a fraction of the sampling rate.
87          */
88         BandPassAudioFilter (float transition_bandwidth, float lower, float higher);
89 };
90
91 #endif