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