Ma question est, si je veux passer un signal passe-haut, est-ce la même chose que de passer un signal et de le soustraire du signal? Est-ce théoriquement la même chose? Est-ce pratiquement la même chose?
J'ai recherché (à la fois sur google et dsp.stackexchange) et je trouve des réponses contradictoires. J'ai joué avec un signal et voici les résultats. Je ne peux pas vraiment le comprendre. Voici le signal avec la fréquence d'échantillonnage toutes les quatre secondes. J'ai conçu un filtre passe-bas numérique avec une bande de transition de 0,8 mHz à 1 mHz et filtré le signal. J'ai ensuite également conçu un filtre passe-haut avec la même bande de transition et filtré le signal. Voici les résultats.
Cette première image montre le signal d'origine en noir et le signal passe-bas en bleu. Ils sont presque superposés mais pas tout à fait. La courbe rouge représente le signal moins le signal passe-haut qui se trouve juste au-dessus du signal.
Cette deuxième image est juste la première zoomée pour montrer ce qui se passe. Ici, nous voyons clairement que les deux ne sont pas identiques. Ma question est pourquoi? Est-ce quelque chose sur la façon dont j'ai implémenté les deux filtres ou est-ce quelque chose de théorique indépendant de mon implémentation? Je ne sais pas grand-chose sur la conception de filtres, mais je sais que c'est notoirement contre-intuitif. Voici le code MATLAB complet pour reproduire tout cela. J'utilise la commande filtfilt pour éliminer les retards de phase. Mais une autre chose à souligner ici est que les filtres ne sont pas normalisés. Quand je fais la somme (Hd.Numerator), j'obtiens 0.9930 pour le passe-bas et 0.007 pour le passe-haut. Je ne vois pas comment expliquer cela. La sortie doit-elle être mise à l'échelle d'une manière ou d'une autre parce que les coefficients ne s'additionnent pas à un? Cette mise à l'échelle pourrait-elle avoir quelque chose à voir avec cela?
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')