2727#include < audioapi/core/effects/IIRFilterNode.h>
2828#include < audioapi/utils/AudioArray.h>
2929#include < audioapi/utils/AudioBus.h>
30- #include < iostream>
3130
3231namespace audioapi {
3332
3433IIRFilterNode::IIRFilterNode (
3534 BaseAudioContext *context,
3635 const std::vector<float > &feedforward,
3736 const std::vector<float > &feedback)
38- : AudioNode(context) {
37+ : AudioNode(context), feedforward_(feedforward), feedback_(feedback) {
3938 isInitialized_ = true ;
4039 channelCountMode_ = ChannelCountMode::MAX;
4140
4241 x_.resize (IIRFilterNode::bufferLength, 0 .0f );
4342 y_.resize (IIRFilterNode::bufferLength, 0 .0f );
43+
44+ size_t feedforwardLength = feedforward_.size ();
45+ size_t feedbackLength = feedback_.size ();
46+
47+ if (feedback_[0 ] != 1 ) {
48+ float scale = feedback_[0 ];
49+ for (unsigned k = 1 ; k < feedbackLength; ++k)
50+ feedback_[k] /= scale;
51+
52+ for (unsigned k = 0 ; k < feedforwardLength; ++k)
53+ feedforward_[k] /= scale;
54+
55+ feedback_[0 ] = 1 .0f ;
56+ }
4457}
4558
4659// Compute Z-transform of the filter
@@ -77,8 +90,8 @@ void IIRFilterNode::getFrequencyResponse(
7790 continue ;
7891 }
7992
80- double omega = -PI * normalizedFreq;
81- auto z = std::complex <double >(std::cos (omega), std::sin (omega));
93+ float omega = -PI * normalizedFreq;
94+ auto z = std::complex <float >(std::cos (omega), std::sin (omega));
8295
8396 auto numerator = IIRFilterNode::evaluatePolynomial (
8497 feedforward_, z, feedforward_.size () - 1 );
@@ -98,29 +111,40 @@ void IIRFilterNode::getFrequencyResponse(
98111std::shared_ptr<AudioBus> IIRFilterNode::processNode (
99112 const std::shared_ptr<AudioBus> &processingBus,
100113 int framesToProcess) {
101-
102- std::cout<<" processing" <<std::endl;
103114 int numChannels = processingBus->getNumberOfChannels ();
104115
105- size_t forwardLength = feedforward_.size ();
116+ size_t feedforwardLength = feedforward_.size ();
106117 size_t feedbackLength = feedback_.size ();
118+ int minLength = std::min (feedbackLength, feedforwardLength);
107119
108120 for (int c = 0 ; c < numChannels; ++c) {
121+ // for (int c = 0; c < 1; ++c) {
109122 auto channelData = processingBus->getChannel (c)->getData ();
123+ // auto channelData2 = processingBus->getChannel(1)->getData();
110124
111125 for (int n = 0 ; n < framesToProcess; ++n) {
112- float yn = 0.0 ;
113- for ( int k = 0 ; k < forwardLength; ++k) {
114- yn += feedforward_[k] * x_[(n - k) & (IIRFilterNode::bufferLength - 1 )];
115- }
116- for ( int k = 1 ; k < feedbackLength; ++k) {
117- yn -= feedback_[k] * y_[(n - k) & (IIRFilterNode::bufferLength - 1 ) ];
126+ float yn = feedforward_[ 0 ] * channelData[n] ;
127+
128+ for ( int k = 1 ; k < minLength; ++ k) {
129+ int m = (m_bufferIndex - k) & (bufferLength - 1 );
130+ yn += feedforward_[k] * x_[m];
131+ yn -= feedback_[k] * y_[m ];
118132 }
119133
120- x_[n & (IIRFilterNode::bufferLength - 1 )] = channelData[n];
121- y_[n & (IIRFilterNode::bufferLength - 1 )] = yn;
134+ for (int k = minLength; k < feedforwardLength; ++k) {
135+ yn += feedforward_[k] * x_[(m_bufferIndex - k) & (bufferLength - 1 )];
136+ }
137+ for (int k = minLength; k < feedbackLength; ++k) {
138+ yn -= feedback_[k] * y_[(m_bufferIndex - k) & (bufferLength - 1 )];
139+ }
122140
123141 channelData[n] = yn;
142+ // channelData2[n] = yn;
143+
144+ x_[m_bufferIndex] = channelData[n];
145+ y_[m_bufferIndex] = yn;
146+
147+ m_bufferIndex = (m_bufferIndex + 1 ) & (bufferLength - 1 );
124148 }
125149 }
126150 return processingBus;
0 commit comments