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

C# VST插件:如何在任意大小的音频输入缓冲区上使用FFT?,c#,plugins,fft,vst,C#,Plugins,Fft,Vst,我对编程VST插件很感兴趣,并且我对音频dsp和FFT有基本的了解 我想使用VST.Net,我想知道如何实现基于FFT的效果。 流程代码如下所示 public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels) 如果我是正确的,通常FFT将应用于输入,对FFT数据进行一些处理,然后逆FFT将创建处理后的声音缓冲区 但是,由于FFT在指定的缓冲区大小上工作,而该缓冲区大小很可能与输入/输

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

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

public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels)
如果我是正确的,通常FFT将应用于输入,对FFT数据进行一些处理,然后逆FFT将创建处理后的声音缓冲区


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

FFT要求缓冲区大小为二的幂,但要解决此问题,您应该实现一个内部缓冲区,然后使用它。例如:

// 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;
    }
  }
}
//MyNiftyPlugin.cpp
无效过程(浮点**输入、浮点**输出、长采样帧){
对于(int-frame=0;frameMY_FFT_BUFFER_SIZE){
多夫茨塔夫(…);
内部缓冲指数=0;
}
}
}
这将在插件中增加一点延迟,但是通过在编译时知道FFT的缓冲区大小可以提高性能,这是值得的


这也是一个很好的解决方法,比如FL Studio(又名“水果循环”),它每次调用不同的块大小,称为进程()。

BAH,我注意到你在C++中工作,但是我给了你C++实例代码。但不管怎样,这里的算法非常简单,应该可以让您大致了解我的意思。
internalBufferIndex
不应该增加吗?我认为
if
块需要在
for
循环中