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')
la source
Réponses:
En général, vous ne pouvez pas simplement soustraire une version filtrée passe-bas d'un signal de celle d'origine pour obtenir un signal filtré passe-haut. La raison en est la suivante. Ce que vous faites, c'est mettre en œuvre un système avec une réponse en fréquence
mais ce n'est généralement pas le cas lorsque (1) est satisfait.
En pratique, cela est très simple si le filtre passe-bas a une réponse de phase linéaire , car alors le terme de phase est donné par
Donc, ce que vous devez faire est le suivant:
filter()
Voici une illustration très simple dans Matlab / Octave
ÉDITER:
filtfilt
filtfilt
la source
Concernant la mise à l'échelle:
En plus de l'excellente réponse de Matt L., on peut simplement souligner que ce qu'il utilise est appelé filtres complémentaires de magnitude , ce qui est le cas commun pour les filtres FIR à phase linéaire, c'est-à-dire:
Lors de la création de filtres à partir de deux sections passe-tout parallèles et de l'ajout / de la soustraction des sorties, les filtres passe-bas / passe-haut seront à la place complémentaires , c'est-à-dire
la source