Ist ein hochpassiertes Signal dasselbe wie ein Signal minus ein tiefpassiertes Signal?


14

Meine Frage ist, ob ich ein Signal hochpassieren möchte, ist es dasselbe wie ein Signal tiefpassieren und es vom Signal subtrahieren? Ist es theoretisch dasselbe? Ist es praktisch dasselbe?

Ich habe gesucht (sowohl bei Google als auch bei dsp.stackexchange) und finde widersprüchliche Antworten. Ich habe mit einem Signal gespielt und hier sind die Ergebnisse. Ich kann nicht viel Sinn machen. Hier ist das Signal mit der Abtastfrequenz einmal alle vier Sekunden. Ich habe ein digitales Tiefpassfilter mit dem Übergangsband von 0,8 MHz bis 1 MHz entworfen und das Signal gefiltert. Ich habe dann auch ein Hochpassfilter mit dem gleichen Übergangsband entworfen und das Signal gefiltert. Hier sind die Ergebnisse.

Bildbeschreibung hier eingeben

Dieses erste Bild zeigt das Originalsignal in Schwarz und das Tiefpasssignal in Blau. Sie sind fast übereinander, aber nicht ganz. Die rote Kurve ist das Signal abzüglich des hochpassierten Signals, das direkt über dem Signal liegt.

Bildbeschreibung hier eingeben

Dieses zweite Bild ist nur das erste, das vergrößert wird, um zu zeigen, was gerade passiert. Hier sehen wir deutlich, dass die beiden nicht dasselbe sind. Meine Frage ist warum? Geht es darum, wie ich die beiden Filter implementiert habe, oder ist es etwas Theoretisches, das von meiner Implementierung unabhängig ist? Ich weiß nicht viel über Filterdesign, aber ich weiß, dass es notorisch kontraintuitiv ist. Hier ist der vollständige MATLAB-Code, um all dies zu reproduzieren. Ich benutze den Befehl filtfilt, um Phasenverzögerungen zu beseitigen. Ein weiterer Hinweis ist, dass die Filter nicht normalisiert sind. Wenn ich summiere (Hd.Numerator), erhalte ich 0,9930 für den Tiefpass und 0,007 für den Hochpass. Ich weiß nicht, wie ich das erklären soll. Sollte die Ausgabe irgendwie skaliert werden, weil die Koeffizienten nicht eins ergeben? Könnte diese Skalierung etwas damit zu tun haben?

close all
clear all
clc

data = dlmread('data.txt');

Fs    = 0.25;    % Sampling Frequency
N     = 2674;    % Order
Fpass = 0.8/1000;  % Passband Frequency
Fstop = 1/1000;   % Stopband Frequency
Wpass = 1;       % Passband Weight
Wstop = 1;       % Stopband Weight
dens  = 20;      % Density Factor

% Calculate the coefficients using the FIRPM function.
b  = firpm(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop], {dens});
Hd = dsp.FIRFilter('Numerator', b);
sum(Hd.Numerator)
datalowpassed = filtfilt(Hd.Numerator,1,data);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Fs    = 0.25;    % Sampling Frequency
N     = 2674;    % Order
Fstop = 0.8/1000;  % Stopband Frequency
Fpass = 1/1000;   % Passband Frequency
Wstop = 1;       % Stopband Weight
Wpass = 1;       % Passband Weight
dens  = 20;      % Density Factor

% Calculate the coefficients using the FIRPM function.
b  = firpm(N, [0 Fstop Fpass Fs/2]/(Fs/2), [0 0 1 1], [Wstop Wpass], {dens});
Hd = dsp.FIRFilter('Numerator', b);
sum(Hd.Numerator)
datahighpassed = filtfilt(Hd.Numerator,1,data);

figure
subplot(2,1,1)
plot(data,'-ko')
hold on
plot(datalowpassed,'-bo')
plot(data-datahighpassed,'-ro')
legend('Original Signal','Low-Passed','Signal - High-Passed')
subplot(2,1,2)
plot(data-datalowpassed,'-bo')
hold on
plot(datahighpassed,'-ro')
legend('Signal - Low-Passed','High-Passed')

1
Ihre Filterreihenfolge ist extrem hoch. Es besteht die Möglichkeit, dass Sie während des Entwurfsprozesses auf numerische Probleme stoßen. Überprüfen Sie die entworfenen Filter, indem Sie die Größe der FFT berechnen und grafisch darstellen. Weitere Informationen zur Verwendung der Subtraktion zum Generieren eines Hochpassfilters aus einem Tiefpassfilter finden Sie in meiner Antwort unten.
Matt L.

Sie können auf diese Weise ein Hochpasssignal erzeugen, aber die Reihenfolge des Abrollens ist immer die erste: sound.westhost.com/articles/derived-xovers.htm Wenn Sie das Signal zuerst um die Gruppenverzögerung des LPF verzögern, bevor Sie es subtrahieren Sie können 3. Ordnung erhalten
Endolith

Antworten:


8

Im Allgemeinen können Sie eine tiefpassgefilterte Version eines Signals nicht einfach von der ursprünglichen subtrahieren, um ein hochpassgefiltertes Signal zu erhalten. Der Grund ist folgender. Sie implementieren ein System mit Frequenzgang

(1)H(ω)=1HLP(ω)

HLP(ω)HLP(ω)

(2)|H(ω)|=|1-|HLP(ω)||

Dies ist jedoch im Allgemeinen nicht der Fall, wenn (1) erfüllt ist.

HLP(ω)

HLP(ω)=|HLP(ω)|ejϕ(ω)

ϕ(ω)

(3)HHP(ω)=ejϕ(ω)-HLP(ω)=ejϕ(ω)(1-|HLP(ω)|)

dann würde dieser neue Filter in der Tat die Größenrelation (2) erfüllen. Wenn Sie also die Subtraktion wie in (3) ausführen, können Sie ein Hochpassfilter mit einer Amplitudenantwort realisieren, die zu der Antwort des Tiefpassfilters komplementär ist. Dies bedeutet, dass Sie das Signal mit einem Allpassfilter mit Frequenzgang filtern müssen.ejϕ(ω) bevor Sie die tiefpassgefilterte Version des Signals davon subtrahieren.

In der Praxis ist dies sehr einfach, wenn das Tiefpassfilter einen linearen Phasengang hat, weil dann der Phasenterm gegeben ist durch

(4)ejϕ(ω)=e-jωτ

τnτ=n/2

Sie müssen also Folgendes tun:

  • Entwerfen Sie ein linearphasiges FIR-Tiefpassfilter mit einer geraden Ordnung
  • filter()xLP[n]
  • τ=n/2xd[n]
  • Erzeugen Sie das hochpassgefilterte Signal durch Subtraktion: xHP[n]=xd[n]-xLP[n]

Hier ist eine sehr einfache Illustration in Matlab / Octave

h_lp = fir1 (100, 0,3); % Tiefpassdesign
h_hp = [Nullen (50,1); 1; Nullen (50,1)] - h_lp; % Hochpassdesign durch Subtraktion
[H_lp, w] = freqz (h_lp, 1.1024);
[H_hp, w] = Frequenz (h_hp, 1.1024);
Diagramm (w / 2 / pi, 20 × log 10 (abs (H_lp)), w / 2 / pi, 20 × log 10 (abs (H_hp))
Raster, Achse ([0, .5, -100,5])

Bildbeschreibung hier eingeben

BEARBEITEN:

Da Sie den filtfiltBefehl verwendet haben, wird die Phase künstlich eliminiert, und die obigen Gleichungen (1) und (2) werden äquivalent, da alle Frequenzantworten tatsächlich quadratische Größen der entworfenen Antworten sind. Abgesehen von kleinen Unterschieden aufgrund des Filterdesignprozesses, numerischen Fehlern und kleinen Unterschieden aufgrund der filtfiltFunktion (automatisch gewählte Anfangsbedingungen, die Start- und Endtransienten minimieren) sollte das Ergebnis des Subtrahierens gefilterter Daten von den Originaldaten einer direkten Filterung sehr ähnlich sein mit einem ergänzenden Filter. Da dies in Ihrem Beispiel nicht der Fall ist, vermute ich, dass die Filterkonstruktionsroutine Ihnen aufgrund der extrem hohen Filterreihenfolge Probleme bereitet. Wenn Sie dasselbe mit einfacheren Filtern machen (ich wählten=100) erhalten Sie, was Sie erwarten würden. In der Abbildung unten sehen Sie einen Abschnitt der Daten in Blau, die Ausgabe des Tiefpassfilters in Grün und das Ergebnis der Subtraktion der Ausgabe des Hochpassfilters von den Originaldaten in Rot. Die grüne und rote Kurve sind praktisch identisch.

x = load ('data.txt'); % Daten, die gefiltert werden sollen
h_lp = fir1 (100, 0,3); % LP Impulsantwort
h_hp = fir1 (100, .3, 'high'); % HP Impulsantwort
y = filtfilt (h_lp, 1, x); % Tiefpassfilter anwenden
yh = filtfilt (h_hp, 1, x); % Hochpassfilter anwenden
yd = x - yh; % Tiefpass Differenz mit Hochpassfilter
n = 1: Länge (x);
Handlung (n, x, n, y, 'g.', n, yd, 'r')
Achse ([3500, 4000, 140, 150])

Bildbeschreibung hier eingeben


Wenn Sie versuchen, einen Hochpassfilter auf diese Weise zu entwerfen, müssen Sie die Spezifikationen des Tiefpassfilters beachten. Die Sperrbanddämpfung im Tiefpassfilter ist normalerweise hoch genug, um im Hochpass eine kleine Durchlassbandwelligkeit zu erreichen, aber die Durchlassbandwelligkeit im LP-Filter erreicht häufig keine ausreichende Sperrbanddämpfung im HP-Filter.
David

Danke für die ausführliche Antwort. Es hat ein paar Dinge geklärt.
Festpunkt

3

Zur Skalierung:

Wenn Sie die Koeffizienten zusammenfassen, erhalten Sie die Größe für DC. Daher ist es sinnvoll, dass Sie diese Zahlen erhalten (1 für LP, 0 für HP).

Neben der hervorragenden Antwort von Matt L. kann man nur darauf hinweisen, dass das, was er verwendet, als Magnitudenkomplementärfilter bezeichnet wird, was bei linearphasigen FIR-Filtern der Fall ist, dh

|HLP|+|HHP|=1

Wenn Sie Filter aus zwei parallelen Allpassabschnitten erstellen und die Ausgänge addieren / subtrahieren, sind die Tiefpass- / Hochpassfilter stattdessen leistungskomplementär , dh

|HLP|2+|HHP|2=1

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.