Ich habe versucht, die Logik für diese Aufgabe zu erarbeiten und das KissFFT-Quellpaket zu verwenden, um die schnelle Fourier-Transformation durchzuführen. Bitte lassen Sie mich wissen, ob dies richtig aussieht:
- Ordnen Sie eine FFT-Struktur zu, dh.
kiss_fft_alloc(N,0,NULL,NULL)
WoN
ist die Fenstergröße, die ich benutze? Der Eingabepuffer ist ein Array vonN
Elementen vom Typkiss_fft_scalar
. Der Ausgabepuffer ist ein Array vonN/2 + 1
Elementen vom Typkiss_fft_cpx
. N
Anzahl der PCM-Samples dekodieren (Fenstergröße).- Mitteln Sie für jedes PCM-Sample die Amplitude jedes Kanals (vorzeichenlose Samples) und skalieren Sie von 0 bis 2 (dividiert durch 65536.0), wobei Sie das Ergebnis im Eingangspuffer speichern.
- Führen Sie eine Fensterung (dh Hanning) für den Eingabepuffer durch.
- Führen Sie eine schnelle Fourier-Transformation für den Eingabepuffer durch und speichern Sie diese im Ausgabepuffer. Da ich reale Werte als Eingabe verwende, kann ich verwenden
kiss_fftr()
. - Ermitteln Sie für die
N/2
Ausgabewerte die quadratische Größe der transformierten Daten und konvertieren Sie die Werte mit der folgenden Formel in die dB-Skala:10 * log10 (re * re + im * im)
- Zeichnen Sie die
N/2
Werte aus Schritt 6. - Verwerfen Sie die erste Hälfte des Eingabepuffers, decodieren Sie die nächsten (Fenstergröße / 2) PCM-Samples und führen Sie eine Skalierung und Fensterung der Daten durch. Dies sollte das Eingabefenster effektiv verschieben und vermeiden, dass bei verarbeiteten PCM-Proben die Mathematik wiederholt werden muss.
- Fahren Sie mit Schritt 5 fort und wiederholen Sie diese Schritte, bis alle Proben verarbeitet sind.
- Geben Sie den verwendeten Speicher frei von
kiss_fft_alloc()
.
Es wurde vorgeschlagen, dass ich einen Wert vom Eingabefenster subtrahiere, bevor ich die FFT durchführe, damit der resultierende DC-Wert eine Größe von Null hat. Sollte ich den Mittelwert oder den Durchschnitt von den Eingabedaten abziehen?
Was muss ich bei der Auswahl einer Fenstergröße beachten? Abgesehen davon, dass es eine gerade Zahl gemäß den Anweisungen von KissFFT sein muss, hat die Verwendung einer kleinen Fenstergröße einen Vorteil, d. H. Wird es für eine bessere Grafik sorgen? Ich gehe davon aus, dass eine große Fenstergröße die Anzahl der durchzuführenden FFTs verringert. Ist dies der einzige Vorteil bei der Verwendung einer großen Fenstergröße?
Wenn ich zu dem Punkt komme, an dem die Daten zum Plotten bereit sind, wie gehe ich dann vor, um sie zu plotten? Als ich in der Vergangenheit an einer Wellenformgraphenlogik gearbeitet habe, habe ich nur 3 Werte für jedes Pixel entlang der Achse (minimale Amplitude, maximale Amplitude, RMS-Amplitude) aufgezeichnet, aber ich weiß nicht, was ich damit machen soll Spektrogrammdaten.
Vielen Dank im Voraus für alle Anleitungen, die Sie geben können.
quelle