2010-04-19 35 views
2

我對編寫VST插件感興趣,並且我有音頻DSP和FFT的基本知識。VST插件:在任意大小的音頻輸入緩衝區上使用FFT,如何?

我想使用VST.Net,我想知道如何實現基於FFT的效果。 過程代碼看起來像

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

如果我是正確的,通常的FFT將輸入應用,有些處理將是對FFT'd數據完成的,然後逆FFT將創建處理後的聲音緩衝區。

但是,由於FFT在指定的緩衝區大小上工作,這很可能與輸入/輸出樣本的(任意)量有所不同,您將如何處理?

回答

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(又名「果味循環」)這樣的主機,這是一個很好的解決方法,它已知可以每次調用process()以不同的塊大小。

+0

Bah,我剛剛注意到你正在使用C#,但我給了你C++示例代碼。但無論如何,這裏的算法非常簡單,應該給你一個我的意思的總體思路。 – 2010-06-10 09:36:10

+0

不應該'internalBufferIndex'增加? – darius 2015-05-09 22:44:15