Skip to content

Commit e2204f3

Browse files
committed
fix: process method
1 parent 4f9a75e commit e2204f3

File tree

3 files changed

+44
-20
lines changed

3 files changed

+44
-20
lines changed

packages/react-native-audio-api/common/cpp/audioapi/core/AudioContext.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ bool AudioContext::suspend() {
7676
}
7777

7878
bool AudioContext::start() {
79-
std::cout<<"audiocontexxt start" <<std::endl;
8079
if (isClosed()) {
8180
return false;
8281
}

packages/react-native-audio-api/common/cpp/audioapi/core/effects/IIRFilterNode.cpp

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,33 @@
2727
#include <audioapi/core/effects/IIRFilterNode.h>
2828
#include <audioapi/utils/AudioArray.h>
2929
#include <audioapi/utils/AudioBus.h>
30-
#include <iostream>
3130

3231
namespace audioapi {
3332

3433
IIRFilterNode::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(
98111
std::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;

packages/react-native-audio-api/common/cpp/audioapi/core/effects/IIRFilterNode.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,21 +54,22 @@ class IIRFilterNode : public AudioNode {
5454

5555
private:
5656
static constexpr size_t bufferLength = 32;
57+
size_t m_bufferIndex = 0;
5758

5859
std::vector<float> feedforward_;
5960
std::vector<float> feedback_;
6061

6162
std::vector<float> x_;
6263
std::vector<float> y_;
6364

64-
static std::complex<double> evaluatePolynomial(
65+
static std::complex<float> evaluatePolynomial(
6566
const std::vector<float> coefficients,
66-
std::complex<double> z,
67+
std::complex<float> z,
6768
int order) {
6869
// Use Horner's method to evaluate the polynomial P(z) = sum(coef[k]*z^k, k, 0, order);
69-
std::complex<double> result = 0;
70+
std::complex<float> result = 0;
7071
for (int k = order; k >= 0; --k)
71-
result = result * z + std::complex<double>(coefficients[k]);
72+
result = result * z + std::complex<float>(coefficients[k]);
7273
return result;
7374
}
7475
};

0 commit comments

Comments
 (0)