VST插件:在任意大小的音频输入缓冲区上使用FFT,怎么样?

时间:2010-04-19 21:48:21

标签: c# plugins fft vst

我对编写VST插件感兴趣,而且我对音频dsp和FFT有基本的了解。

我想使用VST.Net,我想知道如何实现基于FFT的效果。 流程代码类似于

public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels)

如果我是正确的,通常FFT将应用于输入,一些处理将在FFT数据上完成,然后逆FFT将创建处理后的声音缓冲。

但是,由于FFT在指定的缓冲区上工作,最有可能与(任意)数量的输入/输出样本不同,您将如何处理?

1 个答案:

答案 0 :(得分:4)

FFT要求你的缓冲区大小是2的幂,但要解决这个问题,你应该只实现一个内部缓冲区并使用它。例如:

// MyNiftyPlugin.h
#define MY_NUM_CHANNELS 2
#define MY_FFT_BUFFER_SIZE 1024

class MyNiftyPlugin : public AudioEffectX {
  // ... stuff ...
  private:
    float internalBuffer[MY_NUM_CHANNELS][MY_FFT_BUFFER_SIZE];
    long internalBufferIndex;
};

然后在你的流程循环中:

// MyNiftyPlugin.cpp
void process(float **input, float **output, long sampleFrames) {
  for(int frame = 0; frame < sampleFrames; ++frame) {
    for(int channel = 0; channel < MY_NUM_CHANNELS; ++channel) {
      internalBuffer[channel][internalBufferIndex] = inputs[channel][frame];
    }
    if(++internalBufferIndex > MY_FFT_BUFFER_SIZE) {
      doFftStuff(...);
      internalBufferIndex = 0;
    }
  }
}

这会在插件中造成一些延迟,但是通过在编译期间知道FFT的缓冲区大小可以实现性能提升,这是值得的。

此外,对于像FL Studio(又名“Fruity Loops”)这样的主机来说,这是一个很好的解决方法,众所周知,每次都会调用process()并使用不同的块。