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.
Antworten:
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:
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.
quelle
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: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.
quelle
Ich habe das Fourier-Analyse-Tool im Excel Analysis Toolpak verwendet, um eine schnelle Überprüfung der Daten und Ergebnisse durchzuführen.
quelle