我对编写VST插件感兴趣,而且我对音频dsp和FFT有基本的了解。
我想使用VST.Net,我想知道如何实现基于FFT的效果。 流程代码类似于
public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels)
如果我是正确的,通常FFT将应用于输入,一些处理将在FFT数据上完成,然后逆FFT将创建处理后的声音缓冲。
但是,由于FFT在指定的缓冲区上工作,最有可能与(任意)数量的输入/输出样本不同,您将如何处理?
答案 0 :(得分: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(又名“Fruity Loops”)这样的主机来说,这是一个很好的解决方法,众所周知,每次都会调用process()并使用不同的块。