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のバッファーサイズを知ることでパフォーマンスを向上させることができ、価値があります。

また、これは、毎回異なるブロックサイズでprocess()を呼び出すことが知られているFL Studio(別名「FruityLoops」)のようなホストにとっては良い回避策です。

于 2010-06-10T09:35:27.940 に答える