2010-04-19 1 views
2

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

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

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

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

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

ответ

4

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; 
    } 
    } 
} 

Это наложит немного задержки в вашем плагине, но прирост производительности можно достичь, зная размер буфера для быстрого преобразования Фурье во время компиляции делает это полезным.

Кроме того, это хороший обходной путь для хостов, таких как FL Studio (также называемые «Fruity Loops»), которые, как известно, каждый раз вызывают процесс() с различными блоками.

+0

Бах, я только заметил, что вы работаете на C#, но я дал вам пример кода на C++. Но что бы то ни было, алгоритм здесь довольно прост и должен дать вам общее представление о том, что я имею в виду. –

+0

Не следует увеличивать 'internalBufferIndex'? – darius

Смежные вопросы