4

我对编程 VST 插件越来越感兴趣,并且我对音频 dsp 和 FFT 有基本的了解。

我想使用 VST.Net,我想知道如何实现基于 FFT 的效果。过程代码看起来像

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

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

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

4

1 回答 1

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()。

于 2010-06-10T09:35:27.940 回答