代码之家  ›  专栏  ›  技术社区  ›  Led

VST插件:如何在任意大小的音频输入缓冲区上使用FFT?

  •  2
  • Led  · 技术社区  · 15 年前

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

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

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

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

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

    1 回复  |  直到 15 年前
        1
  •  4
  •   Nik Reiman    15 年前

    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(也称为“果味循环”)这样的主机来说,这也是一个很好的解决方法,这些主机每次都使用不同的块大小调用process()。