4 Stimmen

VST-Plugin: FFT auf Audio-Eingangspuffer mit beliebiger Größe anwenden, wie?

Ich interessiere mich für die Programmierung eines VST-Plugins und verfüge über ein Grundwissen über Audio-DSPs und FFTs.

Ich würde gerne VST.Net verwenden und frage mich, wie man einen FFT-basierten Effekt implementiert. Der Prozess-Code sieht so aus

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

Wenn ich richtig liege, wird normalerweise die FFT auf den Eingang angewandt, die FFT-Daten werden verarbeitet, und dann wird mit einer inversen FFT der verarbeitete Soundbuffer erstellt.

Da die FFT jedoch mit einer bestimmten Puffergröße arbeitet, die sich höchstwahrscheinlich von der (beliebigen) Anzahl der Eingangs-/Ausgangs-Samples unterscheidet, wie würden Sie dies handhaben?

4voto

Nik Reiman Punkte 37385

Bei der FFT muss die Puffergröße eine Zweierpotenz sein, aber um dies zu umgehen, sollten Sie einfach einen internen Puffer implementieren und stattdessen mit diesem arbeiten. Also zum Beispiel:

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

Und dann in Ihrer Prozessschleife:

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

Dies führt zu einer gewissen Latenz in Ihrem Plugin, aber die Leistungssteigerung, die Sie durch die Kenntnis der Puffergröße für die FFT während der Kompilierung erreichen können, ist es wert.

Außerdem ist dies ein guter Workaround für Hosts wie FL Studio (auch bekannt als "Fruity Loops"), die dafür bekannt sind, dass sie process() jedes Mal mit unterschiedlichen Blockgrößen aufrufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X