Line data Source code
1 : /*
2 : * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 : *
4 : * Use of this source code is governed by a BSD-style license
5 : * that can be found in the LICENSE file in the root of the source
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 :
11 : #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_THREE_BAND_FILTER_BANK_H_
12 : #define WEBRTC_MODULES_AUDIO_PROCESSING_THREE_BAND_FILTER_BANK_H_
13 :
14 : #include <cstring>
15 : #include <memory>
16 : #include <vector>
17 :
18 : #include "webrtc/common_audio/sparse_fir_filter.h"
19 :
20 : namespace webrtc {
21 :
22 : // An implementation of a 3-band FIR filter-bank with DCT modulation, similar to
23 : // the proposed in "Multirate Signal Processing for Communication Systems" by
24 : // Fredric J Harris.
25 : // The low-pass filter prototype has these characteristics:
26 : // * Pass-band ripple = 0.3dB
27 : // * Pass-band frequency = 0.147 (7kHz at 48kHz)
28 : // * Stop-band attenuation = 40dB
29 : // * Stop-band frequency = 0.192 (9.2kHz at 48kHz)
30 : // * Delay = 24 samples (500us at 48kHz)
31 : // * Linear phase
32 : // This filter bank does not satisfy perfect reconstruction. The SNR after
33 : // analysis and synthesis (with no processing in between) is approximately 9.5dB
34 : // depending on the input signal after compensating for the delay.
35 0 : class ThreeBandFilterBank final {
36 : public:
37 : explicit ThreeBandFilterBank(size_t length);
38 : ~ThreeBandFilterBank();
39 :
40 : // Splits |in| into 3 downsampled frequency bands in |out|.
41 : // |length| is the |in| length. Each of the 3 bands of |out| has to have a
42 : // length of |length| / 3.
43 : void Analysis(const float* in, size_t length, float* const* out);
44 :
45 : // Merges the 3 downsampled frequency bands in |in| into |out|.
46 : // |split_length| is the length of each band of |in|. |out| has to have at
47 : // least a length of 3 * |split_length|.
48 : void Synthesis(const float* const* in, size_t split_length, float* out);
49 :
50 : private:
51 : void DownModulate(const float* in,
52 : size_t split_length,
53 : size_t offset,
54 : float* const* out);
55 : void UpModulate(const float* const* in,
56 : size_t split_length,
57 : size_t offset,
58 : float* out);
59 :
60 : std::vector<float> in_buffer_;
61 : std::vector<float> out_buffer_;
62 : std::vector<std::unique_ptr<SparseFIRFilter>> analysis_filters_;
63 : std::vector<std::unique_ptr<SparseFIRFilter>> synthesis_filters_;
64 : std::vector<std::vector<float>> dct_modulation_;
65 : };
66 :
67 : } // namespace webrtc
68 :
69 : #endif // WEBRTC_MODULES_AUDIO_PROCESSING_THREE_BAND_FILTER_BANK_H_
|