FFT (FFTAggregator & FFT1 & Goertzel)

Jun 3, 2014 at 10:09 AM
Hallo zusammen und Gratulation für die super Arbeit an CSCore

Ich verwende CSCore gerade in meiner Diplomarbeit. Nun habe ich jedoch Schwierigkeiten mit der Verwendung vom FFTAggregator und dessen FFTCalculated Event. Fall jemand ein Beispiel hätte wäre das doch sehr hilfreich.

Weiter ist mir noch nicht klar, wo der Unterschied beim FFTAggregator & FFT1 ist. Wann soll welche FTT eingesetzt werden?

Als Erweiterung könnte man neben dem FFT auch den Goertzel in die CSCore aufnehmen.
http://en.wikipedia.org/wiki/Goertzel_algorithm

Vielen Dank
Coordinator
Jun 3, 2014 at 10:38 PM
Erstmals Danke für das Lob.

Die FFTAggreator-Klasse ist grundsätzlich etwas veraltet und wird im nächsten Release entweder erneuert oder entfernt (würde eher auf erneuern tippen). Diese verwendet die FFT-Methode und berechnet automatisch all N Samples eine FFT wobei N auch gleichzeitig die Anzahl der Frequenzbänder der FFT darstellt.
Es kommt sich jetzt stark darauf an für was du die FFT verwendest. Oftmals wird diese für Effekte, Equalizer oder Analysen verwendet. Jedoch wird diese auch relativ oft für z.B. Visualisierungen verwendet. Hierbei würde ich dir die FFTAggreator-Klasse jedoch nicht empfehlen. Diese feuert nämlich Events im Wiedergabethreads. Dadurch sieht es a) nicht wirklich gut aus und ist b) anfällig für Lags etc.

Es wäre also grundsätzlich erstmal wichtig zu wissen für was du die FFT brauchst.

PS: Manche haben mitbekommen, dass ich Deutsch spreche, jedoch handelt es sich hier um die Projektseite auf codeplex -> also bitte in Zukunft auf englisch ;).
Jun 4, 2014 at 9:25 AM
Hi and thanks for your prompt reply
I need to detect within bandwidth (18'000Hz - 20'000Hz) a specific frequency (pulses with a 0.1sec duration) and get the power & duration of the received signal. That's the reason way I prefer at the moment to use Goertzel and not FFT.
Many Thanks
Coordinator
Jun 4, 2014 at 1:58 PM
Edited Jun 4, 2014 at 1:59 PM
CSCore currently does not contain an implementation of the Goertzel algorithm. So if you really want to use the Goertzel algorithm instead of the built-in FFT, you would have to implement the Goertzel algorithm yourself. But all in all, I would say that there is no big difference between the two algorithms what performance concerns.
But I am no expert in the field of dsp. So I can't tell you whether FFT (or Goertzel) will for you. That's the reason why I would suggest you to ask the guys on http://dsp.stackexchange.com/ (also take a look at this) which algorithm you should use. If you would like to use the FFT (which is already implemented in CSCore), you can use the FFTAggreator class. Just use it within the audio chain and use the FFTCalculated-event to get calculated results in realtime. If you don't playback the audio you want to analyse, you would have to read from the audio chain manually. For example:
FFTAggregator source = CreateFFTAggreator(@"C:\Temp\audio.mp3");
source.FFTCalculated += (s, e) =>
{
    //process the fft results here
}


int bytesToRead = source.WaveFormat.BytesPerSecond * 4;
int read = 0;
var buffer = new byte[bytesToRead];

while((read = source.Read(buffer, 0, bytesToRead) > 0)
{
//just do nothing...
}