Ich habe kürzlich angefangen, mit der Fourier-Transformation zu spielen (nachdem ich einige Wochen damit verbracht hatte, etwas über die Mathematik dahinter zu lernen). Ich habe mich entschlossen, einen Tiefpassfilter für den folgenden Soundbite zusammen zu hacken:
Insbesondere nahm ich die Fourier-Transformation, stellte die höchste Hälfte der Frequenzen auf Null und nahm dann die inverse Fourier-Transformation. Das habe ich bekommen
Warum gibt es dieses knisternde Geräusch?
fourier-transform
discrete-signals
sound
JeremyKun
quelle
quelle
Antworten:
Zwei mögliche Probleme:
quelle
Zunächst nur eine Anmerkung: Fourier-Transformationen sind nicht ideal für Tief- / Hochpassfilter. Butterworth-Filter sind ein guter Ausgangspunkt und folgen diesen Chebyshev / Elliptical-Filtern, wenn Sie ehrgeiziger werden.
Es sieht so aus, als würden Sie versuchen, einen idealen Filter zu implementieren. Es gibt keine Möglichkeit, diese "Brick-Wall" -Filter zu implementieren, bei denen wir alle Frequenzen über / unter einem bestimmten Wert abschneiden. Alle gut entwickelten Filter verjüngen sich um unsere Grenzfrequenz von 1 auf 0.
Ideale Filter sind nur theoretisch möglich, und wenn Sie eine kontinuierliche Fourier-Transformation hätten, würde Ihre obige Methode funktionieren.
Aber wir machen diskrete Fourier-Transformationen, also gibt es mehr zu befürchten. Da ich mir bei der Methode Ihrer Implementierung nicht sicher bin, gehe ich davon aus, dass Sie ein Fenster erstellen, da das Herausziehen von Frequenzen ein sicherer Weg ist, um in einer DFT mit Fenster zu knistern.
Beim Fenstern in einer DFT könnte man denken, dass die Frequenzamplituden zwischen Fenstern relativ kontinuierlich sind. Wenn beispielsweise die 400-Hz-Frequenz im aktuellen Fenster eine Amplitude von 0,5 hat, liegt die Amplitude im nächsten Fenster nahe bei 0,5. Dies ist leider nicht der Fall. Wenn wir also einfach die 400-Hz-Frequenz aus unserer DFT entfernen, hören wir möglicherweise laute Knackgeräusche oder Risse zwischen den Fenstern.
Ein kleines Beispiel: Die Cut-Off-Rate beträgt 600 Hz. Fenster 1 spielt einen Sinus von 800 Hz. Fenster 2 verbindet sich 'kontinuierlich' mit Fenster 1 und spielt 400 Hz. Dann hören wir ein Knallen zwischen den Fenstern, weil Fenster 1 still ist und Fenster 2 sich sofort einschaltet.
Eine andere Sache, die zu beachten ist, ist, dass wir mit einer DFT nur eine begrenzte Anzahl von Frequenzen darstellen können. Wenn wir eine Audiodatei mit einer Sinuswelle einer Frequenz zwischen zwei unserer diskreten Frequenzen in unserer DFT haben, dann repräsentieren wir sie tatsächlich mit vielen unserer diskreten Frequenzen. Obwohl eine Beispiel-Audiodatei eine Sinuswelle enthalten kann, die niedriger als unser Grenzwert ist, können wir, wenn ihre Frequenz zwischen unseren DFT-Frequenzen liegt, einen Teil davon ausschneiden und mit der obigen Methode verzerren, da höhere Frequenzen erforderlich sind, um das Audio darzustellen Datei.
Ich hoffe, das hilft
quelle
Ich habe ein kleines Python-Programm kombiniert, um einige der Konzepte zu veranschaulichen - der Code ist ziemlich schrecklich, aber ich habe nur alten Code genommen, den ich für ähnliche Probleme hatte. Obwohl es kaum Kommentare gibt, sollte es aufgrund der kleinen Module ziemlich einfach sein, diesen zu folgen. Das sind zwei dft / idft- Funktionen; zwei Funktionen fshiftn / fshiftp zur Frequenzverschiebung des Signals i DFT-Domäne zum Filtern; eine Funktion dftlpass zum Durchführen der Filterung in der DFT-Domäne; eine Funktion zpblpass , um die Filterung unter Verwendung eines Butterworth-Filters durchzuführen ; eine Funktion bbdftsig , um das Testsignal zu bilden und die Filterung durchzuführen; und schließlich eine kleine Funktion Plotsigsum die Signale zu zeichnen. Am Ende des Skripts werden die verschiedenen Parameter festgelegt und die verschiedenen Zahlen erstellt.
Zusammenfassend ist es also möglich, eine direkte Filterung zu verwenden, indem Fourier-Koeffizienten auf Null gesetzt werden, was manchmal auch bei der Kompressionserfassung erfolgt, um die Unterstützung eines Signals zu verringern, um einem Signal Sparsity aufzuzwingen. Dies hat jedoch Konsequenzen wie erhöhte Fehler insbesondere an den Signalflanken. Ferner ist das Obige ein bester Fall, bei dem das gesamte Signal als eine Sequenz behandelt wird. Wenn das Signal in Zeitrahmen aufgeteilt werden muss, wird es kompliziert, da wir eine Fensterung oder eine andere Technik in Betracht ziehen müssen, um die Kontinuität des Signals zwischen den Rahmen sicherzustellen. Mein Rat ist also ähnlich wie in einigen anderen Beiträgen, wenn ich empfehle, normalerweise einen Butterworth / Elliptic / .. oder einen anderen Filter zu verwenden.
quelle
Das Nullstellen von Bins in einer FFT kann tatsächlich die Amplitude anderer Frequenzen in der Nähe des Null-Ed-Bin oder seiner benachbarten Bins erhöhen, aber nicht zentriert sein. Dieser Anstieg kann zu Übersteuerungen führen.
Wenn Sie die FFT mit nicht auf Nullen aufgefüllten (und nicht überlappenden) Blöcken ausführen (im Gegensatz zum gesamten Song in einer großen FFT), werden alle FFT-Datenänderungen von hinten nach vorne umgeschaltet Zeitbereichssequenz in jedem Block, wodurch andere seltsame Diskontinuitäten an den falschen Stellen hinzugefügt werden.
quelle
Hier ist ein schnelles und schmutziges FFT-Bandpassfilter mit Nullstellung, das auch den FFT-Code enthält.
Rufen Sie für jedes Sample des Eingangs-Audios den Hauptbandpass mit dem Eingangs-Sample und dem Frequenzbereich auf, den Sie in Lowcut und Highcut halten möchten. Wenn Lowcut größer als Highcut ist, ist das Ergebnis ein Band-Reject-Filter. Es findet eine zirkuläre Faltung statt, aber es wird keine Außerbandemissionen geben, was für Modems gut ist.
quelle