Ist es richtig, ein tiefpassgefiltertes Signal vom ursprünglichen Signal zu subtrahieren und das Ergebnis als „Hochpass“ zu verwenden?

8

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
Heltonbiker
quelle
In der Dokumentation zu scipy.signal.firwinerfahren Sie, wie Tiefpass-, Hochpass-, Bandpass-, Bandstopp- und Multibandfilter erstellt werden. Hast du es versucht firwin(taps, cutoff=nfreq, pass_zero=False)?
Endolith
Siehe sound.whsites.net/articles/derived-xovers.htm für die Verwendung dieser Technik in Lautsprechern
Endolith

Antworten:

7

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.

Jim Clay
quelle
Ich neige dazu, den Filter zweimal zu passieren, einer davon in umgekehrter Richtung, um die Phasenverschiebung zu kompensieren.
Heltonbiker
@heltonbiker Dann sollten Sie in der Lage sein, dies auf diese Weise zu tun, vorausgesetzt, Sie haben das richtige Timing und stellen sicher, dass die Tiefpassfilterverstärkung 1 beträgt.
Jim Clay
4

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.

  1. signal.remez
  2. signal.firwin
  3. signal.firwin2

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:

from scipy import signal
b = signal.remez(64, [0, 80, 100, 200, 220, 500], [0, 1, 0], Hz=1000)
plot(20*log10(abs(fft.fft(b, 4096).)))

Frequenzgang

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:

bl = signal.remez(64, [0, 248, 252, 500], [1, 0], Hz=1000) #lowpass
bh = signal.remez(64, [0, 248, 252, 500], [0, 1], Hz=1000) #highpass

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:

b = signal.firwin(64, [100, 200], pass_zero=False, nyq=500)

Der firwin2 ist näher an der remez-Funktion. Aber anstatt Gewinne für die Bands weiterzugeben, geben Sie Gewinne an den Cutoffs weiter.

b = signal.firwin2(64, [0, 100, 200, 500], [0, 1, 1, 0], nyq=500)

Weitere Beispiele finden Sie hier

Christopher Felton
quelle
firwinund sein Wrapper buttersind das, was ich jetzt benutze. Vielen Dank!
Heltonbiker
2
Butter ist keine Hülle für Firwin. Butter ist eine IIR-Filterdesignmethode. Die iirdesign-Funktion ist ein universelles IIR-Filterdesign-Tool. Wo Butter, Cheby usw. matlabische Funktionen sind. Weitere Informationen zu den IIR-Filterfunktionen finden Sie hier, bit.ly/JPS4Zs
Christopher Felton
Ich glaube, ich habe falsch verstanden, was ich tat. Ich werde es mir ansehen, danke (da ich definitiv einen FIR-Filter haben möchte).
Heltonbiker
3

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:z1

Insbesondere für eine Tiefpass-Hochpass-Transformation können Sie die folgende Substitution anwenden:

α=cos ( 1

z1=α+z11+αz1,
α=cos(12(ωcωc))cos(12(ωc+ωc))

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

Jason R.
quelle
Vielen Dank für Ihre Aufmerksamkeit, aber ich muss zugeben, dass ich nicht genug Hintergrund habe, um die übermäßig technischen / mathematischen Informationen zu verarbeiten, die Sie veröffentlicht haben. Ich komme aus dem Bereich der Biowissenschaften und hatte eine einfachere Antwort erwartet. Wenn der Aufwand für die Erstellung eines Hochpasses relativ gering ist, ist es dann möglich, einen kleinen Arbeitscode zu veröffentlichen oder auf ein Beispiel zu verlinken?
Heltonbiker
Welche Arten von Filtern haben Sie verwendet? Haben Sie sie mit einer SciPy-Bibliotheksfunktion entworfen?
Jason R
Ich werde die Frage mit dem Tiefpass bearbeiten, den ich benutze
heltonbiker
1
Siehe den Kommentar von Endolith oben zu Ihrer Frage. Wie er angedeutet hat, scheint die Funktion, mit der Sie Ihren Filter herstellen, auch in der Lage zu sein, Hochpassfilter zu entwerfen.
Jason R