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()以不同的塊大小。
Bah,我剛剛注意到你正在使用C#,但我給了你C++示例代碼。但無論如何,這裏的算法非常簡單,應該給你一個我的意思的總體思路。 – 2010-06-10 09:36:10
不應該'internalBufferIndex'增加? – darius 2015-05-09 22:44:15