Es fällt mir schwer, Dokumentation zu finden, um Bandpass- oder Hochpassfilter mit Python / Scipy / Numpy zu implementieren.
Ich kann jedoch leicht einen Tiefpassfilter erstellen und anwenden, also frage ich:
Wäre es konzeptionell korrekt, ein Signal tief zu filtern und dann das Ergebnis vom ursprünglichen Signal zu subtrahieren, um nur die hohen Frequenzen zu erhalten?
Wenn jemand ein einfaches Beispiel für einen naiven Bandpassfilter in Python hat (vorzugsweise mit den Bibliotheken numpy und scipy), wäre ich sehr dankbar.
Was ich suche ist so etwas wie:
filtered_signal = band_pass(original_signal, rate, low=20, high=500)
Vielen Dank für jede Hilfe!
EDIT: mit scipy verwende ich dies als Tiefpass, mit guten Ergebnissen:
import numpy, scipy.signal
def firfilt(interval, freq, sampling_rate):
nfreq = freq/(0.5*sampling_rate)
taps = sampling_rate + 1
a = 1
b = scipy.signal.firwin(taps, cutoff=nfreq)
firstpass = scipy.signal.lfilter(b, a, interval)
## second pass to compensate phase delay
secondpass = scipy.signal.lfilter(b, a, firstpass[::-1])[::-1]
return secondpass
python
bandpass
highpass-filter
Heltonbiker
quelle
quelle
scipy.signal.firwin
erfahren Sie, wie Tiefpass-, Hochpass-, Bandpass-, Bandstopp- und Multibandfilter erstellt werden. Hast du es versuchtfirwin(taps, cutoff=nfreq, pass_zero=False)
?Antworten:
Theoretisch können Sie dies tun, aber in der Praxis ist dies schwierig, da die Zeit- und Phasenausrichtung ziemlich gut sein muss, damit es funktioniert. Wenn die Ausrichtung gut ist, erhalten Sie die destruktive Störung , die Sie suchen. Wenn dies nicht der Fall ist, erhalten Sie konstruktive Eingriffe. Schlimmer noch, ob sie destruktiv oder konstruktiv stören, hängt von der Frequenz ab - dh Sie können gleichzeitig sowohl konstruktive als auch destruktive Interferenzen erhalten. Es kann jedoch funktionieren, wenn Sie nur relativ niedrige Frequenzen herausfiltern, da ihre Timing-Anforderungen am lockersten sind, weil sie sich so langsam ändern.
Kurzgeschichte - das ist möglich, aber schwierig genug, dass es im Allgemeinen Sinn macht, nur einen Hochpassfilter zu machen.
Eine relativ einfache Möglichkeit, ein Bandpassfilter zu erstellen, besteht darin, ein Tiefpassfilter zu erstellen und es dann auf die gewünschte Mittenfrequenz zu modulieren, indem Sie es mit einer Sinuskurve dieser Frequenz multiplizieren.
quelle
Sie können die verschiedenen Filtertypen direkt mit den Funktionen scipy.signal entwerfen. Es gibt drei Hauptfunktionen zum Erstellen von Filtern mit endlicher Impulsantwort mit dem Paket scipy.signal.
Die Remez- Funktion nimmt als Argumente die Anzahl der Abgriffe (Reihenfolge + 1), die "Bänder" und die "gewünschte" Verstärkung. Die "Bänder" sind in Hz. Diese Funktion ist etwas seltsam, dass der Parameter "Hz" die Abtastrate in Hz definiert. Ein Beispiel wäre:
Hinweis: Ich habe ein wenig geschummelt und eine FFT höherer Ordnung verwendet, um die Darstellung ein wenig schöner aussehen zu lassen (interpolierte die Punkte nur zur Visualisierung).
Beispiele für Tiefpass und Hochpass:
Die Firwin- Funktion verwendet erneut die Anzahl der Abgriffe und den Cutoff als Argumente. Der Cutoff kann aus mehreren Werten als Liste bestehen, um Bandpass- und Stoppbandfilter zu definieren. Die Standardeinheiten für den Cutoff sind normalisierte Frequenzen, bei denen der Nyquist-Cutoff 1 und die Abtastrate 2 beträgt. Dies kann durch Einstellen von / nyq / geändert werden. Anhand der obigen Beispiele würde der Firwin wie folgt heißen:
Der firwin2 ist näher an der remez-Funktion. Aber anstatt Gewinne für die Bands weiterzugeben, geben Sie Gewinne an den Cutoffs weiter.
Weitere Beispiele finden Sie hier
quelle
firwin
und sein Wrapperbutter
sind das, was ich jetzt benutze. Vielen Dank!Sie haben angegeben, dass Sie Probleme haben, einen geeigneten Hochpassfilter zu entwickeln. Eine Methode besteht darin, zuerst einen Tiefpassfilter-Prototyp zu entwerfen und dann eine Transformation anzuwenden, die die Antwort des Filters in einen Filter eines anderen Typs (z. B. einen Hochpass- oder Bandpassfilter) umwandelt. Dies erfolgt durch Einsetzen eines Ausdrucks für in die Übertragungsfunktion des Prototyp-Tiefpassfilters. Hier einige Links zu Informationen zum Thema:z−1
http://www.mathworks.com/help/toolbox/dsp/ug/bsva1v1.html
http://www.ingelec.uns.edu.ar/pds2803/Materiales/Articulos/Constantinides.pdf
http://cnx.org/content/m12759/latest/
Insbesondere für eine Tiefpass-Hochpass-Transformation können Sie die folgende Substitution anwenden:
α=cos ( 1
Dabei ist die Grenzfrequenz des Tiefpassfilter-Prototyps und die resultierende Grenzfrequenz im transformierten Hochpassfilter. In der MATLAB-Dokumentation im ersten Link sind einige Beispiele aufgeführt.; In SciPy sind möglicherweise ähnliche Funktionen verfügbar. Trotzdem folgen viele der Filterdesignfunktionen in dieser Bibliothek genau dem Beispiel von MATLAB und sind in der Lage, Filter aller wichtigen Typen (Tiefpass, Hochpass usw.) mit sehr geringem Aufwand zu entwerfen.ω ′ cωc ω′c
quelle