Плагин VST: как использовать FFT для входного аудио буфера произвольного размера? - PullRequest
2 голосов
/ 20 апреля 2010

Я заинтересовался программированием VST-плагина, и у меня есть базовые знания по аудио dsp и FFT.

Я бы хотел использовать VST.Net, и мне интересно, как реализовать эффект на основе FFT. Код процесса выглядит как

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

Если я прав, обычно FFT будет применяться ко входу, некоторая обработка будет выполняться для данных FFT, а затем обратное FFT создаст обработанный звуковой буфер.

Но поскольку БПФ работает с указанным размером буфера, который, скорее всего, будет отличаться от (произвольного) количества входных / выходных выборок, как бы вы справились с этим?

1 Ответ

4 голосов
/ 10 июня 2010

FFT требует, чтобы размер вашего буфера был степенью двойки, но чтобы обойти это, вы должны просто реализовать внутренний буфер и работать с ним вместо этого. Так, например:

// 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 () с разными размерами блоков.

...