La mia domanda è, se voglio passare in alto un segnale, è lo stesso di passare in basso un segnale e sottrarlo dal segnale? È teoricamente lo stesso? È praticamente lo stesso?
Ho cercato (sia su google che su dsp.stackexchange) e ho trovato risposte contrastanti. Ho giocato con un segnale e qui ci sono i risultati. Non ne ho molto senso. Ecco il segnale con la frequenza di campionamento una volta ogni quattro secondi. Ho progettato un filtro passa basso digitale con la banda di transizione da 0,8 mHz a 1 mHz e ho filtrato il segnale. Ho anche progettato un filtro passa-alto con la stessa banda di transizione e filtrato il segnale. Ecco i risultati
Questa prima immagine mostra il segnale originale in nero e il segnale passa basso in blu. Sono quasi uno sopra l'altro, ma non del tutto. La curva rossa è il segnale meno il segnale passa-alto che si trova proprio sopra il segnale.
Questa seconda immagine è solo la prima ingrandita per mostrare cosa sta succedendo. Qui vediamo che chiaramente i due non sono gli stessi. La mia domanda è: perché? È qualcosa su come ho implementato i due filtri o è qualcosa di teoricamente indipendente dalla mia implementazione? Non so molto sulla progettazione di filtri ma so che è notoriamente contro-intuitivo. Ecco il codice MATLAB completo per riprodurre tutto questo. Sto usando il comando filtfilt per eliminare i ritardi di fase. Ma un'altra cosa da sottolineare qui è che i filtri non sono normalizzati. Quando faccio la somma (Hd.Numerator), ottengo 0.9930 per il passa basso e 0.007 per il passa alto. Non vedo come spiegarlo. L'output dovrebbe essere ridimensionato in qualche modo perché i coefficienti non si sommano a uno? Questo ridimensionamento potrebbe avere qualcosa a che fare con questo?
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')