Wie überprüfe ich die FFT-Ergebnisse einer Sinuswelle?


9

Ich habe eine Audiodatei (Sinus) 1000Hz als Eingabe für meinen FFT-Algorithmus erhalten. Ich habe 8192 Leistungsspektrum-Samples in einem Array.

Was ist der beste und einfachste Weg, um zu überprüfen, ob meine Ausgabe richtig oder falsch ist?

Wenn ich eine stille Audiodatei gebe, ist die Ausgabe für alle Samples Null. In einer Sinuswelle steigt der o / p von 20 (0. Probe) auf 26059811 (743. Probe) und sinkt allmählich auf 40.

Wenn ich eine Vorstellung vom Ausgangsbereich bekomme, kann ich technisch nachweisen, ob die FFT funktioniert.

Irgendwelche Ideen wären hilfreich.

Beziehen Sie sich auf diesen Link für technische Zweifel.


1
Können Sie Ihr Array zeichnen? (in einer Tabellenkalkulationssoftware vielleicht?)

Es gibt 8192 Werte im Array. Sie möchten, dass ich manuell zeichne, oder die Tabellenkalkulation übernimmt das. Ich arbeite an MAC

2
Ich habe Zehntausende Beispiele in MS Excel gezeichnet. Gnumeric oder ein anderes ist auch geeignet. Oder auch Gnuplot.

Open Office nicht vergessen
Fake Name

@ Fake Name: Ich bin nicht in der Lage, die Grafik zu zeichnen ..

Antworten:


4

Es scheint, dass Sie das Spektrum berechnen, indem Sie 10 Fenster mitteln (nicht überlappend?), Um die Größe bei 8192- oder 8193-Frequenzen im Quadrat zu erhalten (von 0 bis Nyquist, aber einige Algorithmen können die Nyquist-Frequenz bei Bin 8192 verringern).

Als erstes muss überprüft werden, ob sich der Peak im rechten Bin befindet. Sie haben nicht gesagt, wie hoch die Abtastrate ist, aber Bin 743 wäre das 743/16384-fache der Abtastrate. Wenn das Signal tatsächlich bei 800 Hz liegt, liegt Fs bei ungefähr 17640 Abtastungen / Sekunde. Das scheint falsch. Ihr Testsignal würde wahrscheinlich eine Standardrate wie 8000, 16000, 22050, 32000, 44100 oder 48000 haben. Für Fs = 22050 wäre der Peak scharf in Bin 800/22050 * 16384 = 594.

Ein weiteres zu überprüfendes Kriterium ist, dass die Gesamtenergie im Signal sowohl im Zeit- als auch im Frequenzbereich ungefähr gleich ist. Hier ist ein Beispiel in Python:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

Das Eingangssignal x, das aus zwei Sinuskurven besteht, die mit Fs = 22050 Abtastungen / Sekunde abgetastet werden, ist in 10 nicht überlappende Fenster der Größe NFFT = 2048 Abtastwerte unterteilt. Der Aufruf von psd (Leistungsspektraldichte) berechnet das Spektrum y als Durchschnitt der Größe im Quadrat von zehn 16384-Punkt-DFTs (tatsächlich sind es 8193 Punkte, da x ein reeller Wert ist).

Die berechnete Frequenzdomänenenergie hat einen Skalierungsfaktor von N / 16384, da die psd-Funktion y auf die DFT-Größe anstatt auf die Gesamtsignallänge skaliert. Ob dies ein Problem ist oder nicht, hängt davon ab, wie Ihr System mit der Normalisierung der PSD umgeht. Eine weitere optionale Normalisierung ist die Skalierung um 1 / Fs. Dies passt die Energie an das ursprüngliche analoge Signal an. Die Standardnormalisierungen sollten in der Bibliothek gut dokumentiert sein.


Ich habe mein Sinuswellensignal getestet, es ist 1000 Hz. Meine FFT gibt die richtige Antwort. Danke für Ihre Hilfe.

10

Sie müssen die Größe der Ausgabe der FFT darstellen. Ich bin nicht mit Ihrer Programmiersprache vertraut, aber in Python würden Sie so etwas wie verwenden plot(abs(fft(a))). Für eine stille Eingabe sollte die Ausgabe alle Nullen sein. Für einen Sinuswelleneingang sollten zwei Spitzen angezeigt werden:

Alt-Text

Für ein reales Signal sind die Spitzen von links nach rechts symmetrisch. Wenn Sie jedoch eine echte FFT ausführen (was rechnerisch effizienter ist), erhalten Sie nur die linke Hälfte des Diagramms als Ausgabe, da das redundante Spiegelbild ignoriert wird.

Wenn die Frequenz höher ist, sind die Spitzen näher an der Mitte. Wenn die Frequenz perfekt mit der Blockgröße synchronisiert ist , ist die Spitze nur einen Punkt breit und alles andere ist genau 0. Andernfalls hat sie einen sich verjüngenden "Rock" wie oben.


Meinen Sie den Wert des Leistungsspektrums als Amplitude?

t -> mit Bezug auf die Zeit?

Mach dir keine Sorgen über die Zeit. Wenn Sie nur überprüfen, ob die FFT funktioniert, müssen Sie lediglich überprüfen, ob die Form der Größe dieser ähnlich ist.
Endolith

Ich kann sowieso nicht zeichnen, dass meine FFT richtig funktioniert. Ich werde versuchen, das Diagramm definitiv in meiner Freizeit umzusetzen. Vielen Dank.

1
@ Clabacchio: Oh. Die FFT erzeugt eine Ausgabe mit der Achse f = 0 am Anfang und Ende des Diagramms. Der Mittelpunkt des Diagramms ist die f = fs / 2-Achse. Es gibt oft eine fftfreq- oder fftshift-Funktion, um das Diagramm so anzuordnen, dass die Frequenz 0 in der Mitte liegt. flic.kr/p/arVeZT
Endolith

0

Ich habe das Fourier-Analyse-Tool im Excel Analysis Toolpak verwendet, um eine schnelle Überprüfung der Daten und Ergebnisse durchzuführen.


Ich arbeite an MAC.

@Warrior - Verwenden Sie dann MacPorts oder Fink, um Gnumeric zu installieren (siehe auch diese Seite für einige Informationen zu einem Platypus-Wrapper, wenn Sie das möchten)
Kevin Vermeer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.