2010-04-19 3 views
2

VST 플러그인 프로그래밍에 관심이 많습니다. 오디오 dsp 및 FFT에 대한 기본 지식이 있습니다.VST 플러그인 : 임의의 크기로 오디오 입력 버퍼에 FFT 사용?

VST.Net을 사용하고 싶습니다. FFT 기반 효과를 구현하는 방법이 궁금합니다. I가 올바른지 요하는 경우, 일반적으로 FFT 입력에인가 될

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

어떤 처리가 FFT'd 데이터에 수행 될 것이며,이어서 역 FFT를 만들 것 같은 프로세스 코드 보인다 처리 된 사운드 버퍼

그러나 FFT가 (임의의) 입력/출력 샘플과 다를 가능성이있는 지정된 버퍼 크기에서 작동하기 때문에 어떻게 처리 할 수 ​​있습니까?

답변

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에 대한 버퍼 크기를 알고에 의해 달성 할 수있는 성능 향상 컴파일 시간 동안 보람 있습니다.

또한 매번 다른 블록 크기로 process()를 호출하는 것으로 알려진 FL Studio (일명 "Fruity Loops")와 같은 호스트의 경우이 문제를 해결할 수있는 좋은 방법입니다.

+0

바하마, 나는 C#에서 일하고있는 것으로 나타 났지만 C++ 예제 코드를주었습니다. 그러나 무엇이든, 알고리즘은 여기에서 매우 간단하며 여러분이 의미하는 바에 대한 일반적인 아이디어를 제공해야합니다. –

+0

'internalBufferIndex'가 증가하지 않아야합니까? – darius

관련 문제