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')