Erstellen eines Spektrogramms

10

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:

  1. Ordnen Sie eine FFT-Struktur zu, dh. kiss_fft_alloc(N,0,NULL,NULL) Wo Nist die Fenstergröße, die ich benutze? Der Eingabepuffer ist ein Array von NElementen vom Typ kiss_fft_scalar. Der Ausgabepuffer ist ein Array von N/2 + 1Elementen vom Typ kiss_fft_cpx.
  2. NAnzahl der PCM-Samples dekodieren (Fenstergröße).
  3. 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.
  4. Führen Sie eine Fensterung (dh Hanning) für den Eingabepuffer durch.
  5. 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().
  6. Ermitteln Sie für die N/2Ausgabewerte 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)
  7. Zeichnen Sie die N/2Werte aus Schritt 6.
  8. 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.
  9. Fahren Sie mit Schritt 5 fort und wiederholen Sie diese Schritte, bis alle Proben verarbeitet sind.
  10. 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.x

Vielen Dank im Voraus für alle Anleitungen, die Sie geben können.

raynebc
quelle

Antworten:

8

Sieht für mich ziemlich gut aus. In Schritt 3 möchten Sie das Signal jedoch tatsächlich von -1 auf 1 skalieren, andernfalls fügen Sie DC hinzu. Sie haben das Subtrahieren des Mittelwerts erwähnt - ich würde dies nicht für ein Spektrogramm empfehlen, da dadurch DC effektiv herausgefiltert wird, was das Spektrogramm zeigen sollte, wenn es vorhanden ist.

Bei der Auswahl einer Fenstergröße dreht sich alles um Kompromisse. Ein größeres Fenster bietet eine schärfere Frequenzauflösung, aber eine unschärfere Zeitauflösung. Ein kürzeres Fenster gibt Ihnen das Gegenteil: eine schärfere Zeitauflösung, aber eine unschärfere Frequenzauflösung. Die geeignete Auswahl der Fenstergröße hängt von den Daten ab, die Sie analysieren möchten. Normalerweise ist es eine Potenz von 2, nur weil FFTs dazu neigen, Potenzen von 2 zu mögen. Eine anständige Faustregel lautet, dass Ihr Fenster mindestens ungefähr doppelt so lang sein sollte wie die Periode der niedrigsten Frequenz, die Sie genau messen möchten Entschlossenheit.

Sie fragen sich vielleicht, ob es möglich ist, diesen Kompromiss besser zu bewältigen, und dafür gibt es Techniken: Im Allgemeinen werden Spektrogramme mit mehreren verschiedenen FFT-Größen gleichzeitig berechnet und kombiniert. Auf dieser Webseite finden Sie einige gute visuelle Informationen: http://www.izotope.com/tech/aes_adapt/

Wenn Ihre Fenstergröße zu klein ist, sind zwei sehr nahe Frequenzen möglicherweise nicht voneinander zu unterscheiden, da beide im selben FFT-Bin landen. Wenn Ihr Fenster zu groß ist, können zwei zeitnahe Ereignisse kombiniert werden oder ein scharfer Übergang kann zu einem allmählichen Angriff werden. Schauen Sie sich die Webseite an, die ich gepostet habe, um dies zu visualisieren.

Eine größere Fenstergröße reduziert nicht unbedingt die Anzahl der FFTs. Sie haben sich entschieden, ein Spektrogramm mit einer Kurzzeit-Fourier-Transformation zu berechnen, bei der eine Überlappung der halben FFT-Größe vorliegt. Sie können einen höheren Überlappungsfaktor verwenden, wenn Sie möchten. Bei der Auswahl einer Fenstergröße geht es viel mehr um den Kompromiss zwischen Zeit und Frequenz als um die Anzahl der zu berechnenden FFTs. Beim Entwerfen eines Spektrogramms (oder einer beliebigen STFT) können Sie sich vorstellen, Ihre Fenstergröße und Sprunggröße , den Abstand zwischen Blöcken, als unabhängige Parameter auszuwählen.

Wenn Sie es zeichnen, liegt die Zeit normalerweise auf der x-Achse, die Frequenz auf der y-Achse (normalerweise eine logarithmische Skala, eine Mel-Skala usw. anstelle einer linearen Skala), und dann werden die Größen mit der Farbintensität dargestellt, d. H. Sehr dunkle Farben entsprechen kleinen Größen und sehr helle Farben entsprechen großen Größen.

Schnarf
quelle
Ihr Link scheint tot zu sein. Könnten Sie es aktualisieren?
Daniel Wolf