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_COMMON_AUDIO_SPARSE_FIR_FILTER_H_
12 : #define WEBRTC_COMMON_AUDIO_SPARSE_FIR_FILTER_H_
13 :
14 : #include <cstring>
15 : #include <vector>
16 :
17 : #include "webrtc/base/constructormagic.h"
18 :
19 : namespace webrtc {
20 :
21 : // A Finite Impulse Response filter implementation which takes advantage of a
22 : // sparse structure with uniformly distributed non-zero coefficients.
23 0 : class SparseFIRFilter final {
24 : public:
25 : // |num_nonzero_coeffs| is the number of non-zero coefficients,
26 : // |nonzero_coeffs|. They are assumed to be uniformly distributed every
27 : // |sparsity| samples and with an initial |offset|. The rest of the filter
28 : // coefficients will be assumed zeros. For example, with sparsity = 3, and
29 : // offset = 1 the filter coefficients will be:
30 : // B = [0 coeffs[0] 0 0 coeffs[1] 0 0 coeffs[2] ... ]
31 : // All initial state values will be zeros.
32 : SparseFIRFilter(const float* nonzero_coeffs,
33 : size_t num_nonzero_coeffs,
34 : size_t sparsity,
35 : size_t offset);
36 : ~SparseFIRFilter();
37 :
38 : // Filters the |in| data supplied.
39 : // |out| must be previously allocated and it must be at least of |length|.
40 : void Filter(const float* in, size_t length, float* out);
41 :
42 : private:
43 : const size_t sparsity_;
44 : const size_t offset_;
45 : const std::vector<float> nonzero_coeffs_;
46 : std::vector<float> state_;
47 :
48 : RTC_DISALLOW_COPY_AND_ASSIGN(SparseFIRFilter);
49 : };
50 :
51 : } // namespace webrtc
52 :
53 : #endif // WEBRTC_COMMON_AUDIO_SPARSE_FIR_FILTER_H_
|