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(又名“Fruity Loops”)这样的主机来说,这是一个很好的解决方法,众所周知,它们每次都会以不同的块大小调用 process()。