Moje pytanie brzmi: jeśli chcę przekazać sygnał górnoprzepustowo, czy to to samo, co przekazanie sygnału dolnoprzepustowego i odjęcie go od sygnału? Czy to teoretycznie to samo? Czy to praktycznie to samo?
Szukałem (zarówno w Google, jak i dsp.stackexchange) i znajduję sprzeczne odpowiedzi. Bawiłem się sygnałem i oto wyniki. Nie mam większego sensu. Oto sygnał z częstotliwością próbkowania raz na cztery sekundy. Zaprojektowałem cyfrowy filtr dolnoprzepustowy z pasmem przejściowym od 0,8 MHz do 1 MHz i przefiltrowałem sygnał. Następnie zaprojektowałem również filtr górnoprzepustowy z tym samym pasmem przejściowym i przefiltrowałem sygnał. Oto wyniki.
To pierwsze zdjęcie pokazuje oryginalny sygnał w kolorze czarnym, a dolnoprzepustowy sygnał w kolorze niebieskim. Są prawie na sobie, ale nie całkiem. Czerwona krzywa to sygnał minus górnoprzepustowy sygnał, który znajduje się bezpośrednio nad sygnałem.
To drugie zdjęcie jest tylko pierwszym powiększonym obrazem pokazującym, co się dzieje. Tutaj widzimy, że wyraźnie te dwa nie są takie same. Moje pytanie brzmi: dlaczego? Czy jest to związane z tym, jak zaimplementowałem dwa filtry, czy jest to coś teoretycznego niezależnego od mojej implementacji? Nie wiem dużo o projektowaniu filtrów, ale wiem, że jest to sprzeczne z intuicją. Oto pełny kod MATLAB do odtworzenia tego wszystkiego. Używam polecenia filtfilt, aby wyeliminować opóźnienia fazowe. Ale inną rzeczą, na którą należy tutaj zwrócić uwagę, jest to, że filtry nie są znormalizowane. Kiedy robię sumę (Hd.Numerator), dostaję 0,9930 dla dolnego przejścia i 0,007 dla górnego przejścia. Nie wiem, jak to wytłumaczyć. Czy wynik powinien być jakoś skalowany, ponieważ współczynniki się nie sumują? Czy to skalowanie może mieć z tym coś wspólnego?
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')