1 /*******************************************************************************
2 * Copyright 2009-2016 Jörg Müller
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 ******************************************************************************/
16
17 #include "fx/IIRFilterReader.h"
18
19 AUD_NAMESPACE_BEGIN
20
IIRFilterReader(std::shared_ptr<IReader> reader,const std::vector<float> & b,const std::vector<float> & a)21 IIRFilterReader::IIRFilterReader(std::shared_ptr<IReader> reader, const std::vector<float>& b, const std::vector<float>& a) :
22 BaseIIRFilterReader(reader, b.size(), a.size()), m_a(a), m_b(b)
23 {
24 if(m_a.empty() == false)
25 {
26 for(int i = 1; i < m_a.size(); i++)
27 m_a[i] /= m_a[0];
28 for(int i = 0; i < m_b.size(); i++)
29 m_b[i] /= m_a[0];
30 m_a[0] = 1;
31 }
32 }
33
filter()34 sample_t IIRFilterReader::filter()
35 {
36 sample_t out = 0;
37
38 for(int i = 1; i < m_a.size(); i++)
39 out -= y(-i) * m_a[i];
40 for(int i = 0; i < m_b.size(); i++)
41 out += x(-i) * m_b[i];
42
43 return out;
44 }
45
setCoefficients(const std::vector<float> & b,const std::vector<float> & a)46 void IIRFilterReader::setCoefficients(const std::vector<float>& b, const std::vector<float>& a)
47 {
48 setLengths(b.size(), a.size());
49 m_a = a;
50 m_b = b;
51 }
52
53 AUD_NAMESPACE_END
54