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」)のようなホストにとっては良い回避策です。