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.
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.
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')
Antworten:
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
Dies ist jedoch im Allgemeinen nicht der Fall, wenn (1) erfüllt ist.
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
Sie müssen also Folgendes tun:
filter()
Hier ist eine sehr einfache Illustration in Matlab / Octave
BEARBEITEN:
Da Sie denn = 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.
filtfilt
Befehl 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 derfiltfilt
Funktion (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ähltequelle
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
Wenn Sie Filter aus zwei parallelen Allpassabschnitten erstellen und die Ausgänge addieren / subtrahieren, sind die Tiefpass- / Hochpassfilter stattdessen leistungskomplementär , dh
quelle