Ich habe ein FFT-Ergebnis. Diese werden in zwei double
Arrays gespeichert : einem Realteil-Array und einem Imaginärteil-Array. Wie bestimme ich die Frequenzen, die jedem Element in diesen Arrays entsprechen?
Mit anderen Worten, ich hätte gerne ein Array erstellt, in dem die Frequenzen für jede reale und imaginäre Komponente meiner FFT gespeichert sind.
c#
signal-processing
fft
Rango
quelle
quelle
Antworten:
Der erste Bin in der FFT ist DC (0 Hz), der zweite Bin ist
Fs / N
, woFs
die Abtastrate undN
die Größe der FFT ist. Der nächste Behälter ist2 * Fs / N
. Um dies allgemein auszudrücken, ist der n-te Behältern * Fs / N
.Wenn Ihre Abtastrate
Fs
beispielsweise 44,1 kHz und Ihre FFT-GrößeN
1024 beträgt, befinden sich die FFT-Ausgangsfächer auf:Beachten Sie, dass für ein reales Eingangssignal (Imaginärteile alle Null) die zweite Hälfte der FFT (Bins von
N / 2 + 1
bisN - 1
) keine nützlichen zusätzlichen Informationen enthält (sie haben eine komplexe konjugierte Symmetrie mit den erstenN / 2 - 1
Bins). Der letzte nützliche Behälter (für praktische Anwendungen) befindet sich beiN / 2 - 1
, was im obigen Beispiel 22006,9 Hz entspricht. Der Bin atN / 2
repräsentiert Energie bei der Nyquist-Frequenz, dhFs / 2
(= 22050 Hz in diesem Beispiel), aber dies ist im Allgemeinen nicht von praktischem Nutzen, da Anti-Aliasing-Filter typischerweise alle Signale bei und darüber dämpfenFs / 2
.quelle
Schauen Sie sich hier meine Antwort an .
Antwort auf Kommentar:
Die FFT berechnet tatsächlich die Kreuzkorrelation des Eingangssignals mit Sinus- und Cosinusfunktionen (Basisfunktionen) in einem Bereich von gleich beabstandeten Frequenzen. Für einen bestimmten FFT-Ausgang gibt es eine entsprechende Frequenz (F), wie sie in der von mir geposteten Antwort angegeben ist. Der Realteil der Ausgangsabtastung ist die Kreuzkorrelation des Eingangssignals mit
cos(2*pi*F*t)
und der Imaginärteil ist die Kreuzkorrelation des Eingangssignals mitsin(2*pi*F*t)
. Der Grund, warum das Eingangssignal mitsin
undcos
Funktionen korreliert, besteht darin, Phasendifferenzen zwischen dem Eingangssignal und den Basisfunktionen zu berücksichtigen.Indem Sie die Größe des komplexen FFT-Ausgangs nehmen, erhalten Sie ein Maß dafür, wie gut das Eingangssignal mit Sinuskurven bei einer Reihe von Frequenzen korreliert, unabhängig von der Eingangssignalphase. Wenn Sie nur den Frequenzinhalt eines Signals analysieren, nehmen Sie fast immer die Größe oder das Quadrat der Größe des komplexen Ausgangs der FFT.
quelle
Ich habe folgendes verwendet:
Die Eingänge sind:
i
: Bin zuzugreifensamples
: Abtastrate in Hertz (dh 8000 Hz, 44100 Hz usw.)nFFT
: Größe des FFT-Vektorsquelle
samples
oder darstellennFFT
. Bitte erläutern Sie dies.i * samples / nFFT
. Warum ist das Extra2
da? Vermisse ich etwasDie FFT-Ausgangskoeffizienten (für komplexe Eingänge der Größe N) reichen von 0 bis N - 1 und sind als Frequenz [LOW, MID, HI, HI, MID, LOW] gruppiert.
Ich würde annehmen, dass das Element bei k die gleiche Frequenz wie das Element bei Nk hat, da für reale Daten FFT [Nk] = komplexes Konjugat von FFT [k] ist.
Die Reihenfolge des Scannens von LOW nach HIGH ist
Es gibt [N / 2] +1 Frequenzgruppen vom Index i = 0 bis [N / 2], die jeweils die
frequency = i * SamplingFrequency / N
Die Frequenz bei bin FFT [k] ist also:
quelle
Die Frequenz Ihres k- ten FFT-Ergebnisses beträgt 2 * pi * k / N.
quelle