@@ -41,6 +41,7 @@ IIRFilterNode::IIRFilterNode(
4141 int maxChannels = 32 ; // TODO: magic number, jaki jest faktyczy Channels?
4242 xBuffers_.resize (maxChannels);
4343 yBuffers_.resize (maxChannels);
44+ bufferIndices.resize (maxChannels, 0 );
4445
4546 for (int c = 0 ; c < maxChannels; ++c) {
4647 xBuffers_[c].resize (bufferLength, 0 .0f );
@@ -128,34 +129,37 @@ std::shared_ptr<AudioBus> IIRFilterNode::processNode(
128129 int mask = bufferLength - 1 ;
129130
130131 for (int c = 0 ; c < numChannels; ++c) {
131- // for (int c = 0; c < 1; ++c) {
132132 auto channelData = processingBus->getChannel (c)->getData ();
133- // auto channelData2 = processingBus->getChannel(1)->getData();
134133 auto &x = xBuffers_[c];
135134 auto &y = yBuffers_[c];
135+ size_t bufferIndex = bufferIndices[c];
136136
137137 for (int n = 0 ; n < framesToProcess; ++n) {
138138 float yn = feedforward_[0 ] * channelData[n];
139139
140140 for (int k = 1 ; k < minLength; ++k) {
141- int m = (n - k) & mask;
141+ int m = (bufferIndex - k) & mask;
142142 yn += feedforward_[k] * x[m];
143143 yn -= feedback_[k] * y[m];
144+ // yn = std::fma(feedforward_[k], x[m], yn);
145+ // yn = std::fma(-feedback_[k], y[m], yn);
144146 }
145147
146148 for (int k = minLength; k < feedforwardLength; ++k) {
147- yn += feedforward_[k] * x[(n - k) & mask];
149+ yn += feedforward_[k] * x[(bufferIndex - k) & mask];
148150 }
149151 for (int k = minLength; k < feedbackLength; ++k) {
150- yn -= feedback_[k] * y[(n - k) & mask ];
152+ yn -= feedback_[k] * y[(bufferIndex - k) & (bufferLength - 1 ) ];
151153 }
152154
153155 channelData[n] = yn;
154- // channelData2[n] = yn;
155156
156- x[n & mask] = channelData[n];
157- y[n & mask] = yn;
157+ x[bufferIndex] = channelData[n];
158+ y[bufferIndex] = yn;
159+
160+ bufferIndex = (bufferIndex + 1 ) & (bufferLength - 1 );
158161 }
162+ bufferIndices[c] = bufferIndex;
159163 }
160164 return processingBus;
161165}
0 commit comments