我对 AudioKit 框架非常陌生,我一直在尝试更多地了解它的 DSP 方面。在翻找源代码时,我意识到 AKNodeOutputPlot 不会像其他人那样从节点中提取数据。
在 AKAmplitudeTracker 的 DSP 代码中,计算每个通道的 RMS 值,并将结果短暂写入输出缓冲区,但在 for 循环结束时,通过将输出设置为原始输入,基本上绕过了节点:
void process(AUAudioFrameCount frameCount, AUAudioFrameCount bufferOffset) override {
for (int frameIndex = 0; frameIndex < frameCount; ++frameIndex) {
int frameOffset = int(frameIndex + bufferOffset);
for (int channel = 0; channel < channels; ++channel) {
float *in = (float *)inBufferListPtr->mBuffers[channel].mData + frameOffset;
float temp = *in;
float *out = (float *)outBufferListPtr->mBuffers[channel].mData + frameOffset;
if (channel == 0) {
if (started) {
sp_rms_compute(sp, leftRMS, in, out);
leftAmplitude = *out;
} else {
leftAmplitude = 0;
}
} else {
if (started) {
sp_rms_compute(sp, rightRMS, in, out);
rightAmplitude = *out;
} else {
rightAmplitude = 0;
}
}
*out = temp;
}
}
}
这是有道理的,因为将 RMS 值输出到设备扬声器听起来很糟糕,但是当此节点用作 AKNodeOutputPlot 对象的输入时,会绘制 RMS 值。
我假设 leftAmplitude 和 rightAmplitude 变量在某处被引用,但即使它们被归零,情节也很好。我有兴趣在不影响输出的情况下对信号做一些工作,所以我很高兴有人可以帮助我弄清楚 AKPlot 是如何获取这些数据的。
干杯