Un signal passe-haut est-il identique à un signal moins un signal passe-bas?

14

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.

entrez la description de l'image ici

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.

entrez la description de l'image ici

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')
Un point fixe
la source
1
Votre ordre de filtrage est extrêmement élevé. Il est probable que vous rencontriez des problèmes numériques pendant le processus de conception. Vérifiez les filtres conçus en calculant et en traçant l'amplitude de la FFT. De plus, voir ma réponse ci-dessous pour savoir comment utiliser la soustraction pour générer un filtre passe-haut à partir d'un filtre passe-bas.
Matt L.
Vous pouvez créer un signal passe-haut de cette façon, mais l'ordre du roll-off est toujours de premier ordre: sound.westhost.com/articles/derived-xovers.htm Si vous retardez d'abord le signal par le retard de groupe du LPF avant de soustraire , vous pouvez obtenir la 3ème commande
endolith

Réponses:

8

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

(1)H(ω)=1-HLP(ω)

HLP(ω)HLP(ω)

(2)|H(ω)|=|1-|HLP(ω)||

mais ce n'est généralement pas le cas lorsque (1) est satisfait.

HLP(ω)

HLP(ω)=|HLP(ω)|ejϕ(ω)

ϕ(ω)

(3)HHP(ω)=ejϕ(ω)-HLP(ω)=ejϕ(ω)(1-|HLP(ω)|)

ejϕ(ω)

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

(4)ejϕ(ω)=e-jωτ

τnτ=n/2

Donc, ce que vous devez faire est le suivant:

  • concevoir un filtre passe-bas FIR à phase linéaire avec un ordre pair
  • filter()XLP[n]
  • τ=n/2X[n]
  • XHP[n]=X[n]-XLP[n]

Voici une illustration très simple dans Matlab / Octave

h_lp = fir1 (100, .3); % conception passe-bas
h_hp = [zéros (50,1); 1; zéros (50,1)] - h_lp; % conception passe-haut par soustraction
[H_lp, w] = freqz (h_lp, 1,1024);
[H_hp, w] = freqz (h_hp, 1,1024);
tracé (w / 2 / pi, 20 * log10 (abs (H_lp)), w / 2 / pi, 20 * log10 (abs (H_hp)))
grille, axe ([0, .5, -100,5])

entrez la description de l'image ici

ÉDITER:

filtfiltfiltfiltn=100), vous obtenez ce que vous attendez. Dans la figure ci-dessous, vous voyez une section des données en bleu, la sortie du filtre passe-bas en vert et le résultat de la soustraction de la sortie du filtre passe-haut des données d'origine en rouge. Les courbes vertes et rouges sont pratiquement identiques.

x = charge ('data.txt'); % de données à filtrer
h_lp = fir1 (100, .3); % Réponse impulsion LP
h_hp = fir1 (100, .3, «élevé»); % Réponse impulsionnelle HP
y = filtfilt (h_lp, 1, x); % appliquent un filtre passe-bas
yh = filtfilt (h_hp, 1, x); % appliquer un filtre passe-haut
yd = x - yh; % passe-bas par différence avec filtre passe-haut
n = 1: longueur (x);
tracé (n, x, n, y, 'g.', n, yd, 'r')
axe ([3500,4000,140,150])

entrez la description de l'image ici

Matt L.
la source
Si vous essayez de concevoir un filtre passe-haut de cette façon, vous devez être prudent avec les spécifications du filtre passe-bas. L'atténuation de la bande passante dans le filtre passe-bas est généralement assez élevée pour obtenir une petite ondulation de la bande passante dans le passe-haut, mais souvent l'ondulation de la bande passante dans le filtre LP n'atteint pas suffisamment l'atténuation de la bande d'arrêt dans le filtre HP.
David
Merci pour la réponse détaillée. Cela a éclairci certaines choses.
Point fixe
3

Concernant la mise à l'échelle:

10

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:

|HLP|+|HHP|=1

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

|HLP|2+|HHP|2=1

oscar
la source