4

我对 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 是如何获取这些数据的。

干杯

4

1 回答 1

2

AKNodeOutputPlot 使用称为“tap”的东西:

https://github.com/AudioKit/AudioKit/blob/master/AudioKit/Common/User%20Interface/AKNodeOutputPlot.swift

还有一些其他的水龙头不一定只用于用户界面目的:

https://github.com/AudioKit/AudioKit/tree/master/AudioKit/Common/Taps

Tap 允许您检查通过另一个节点拉出的数据,而无需插入信号链本身。

于 2017-11-17T18:09:36.123 回答