Um sinal passa-alto é o mesmo que um sinal menos um sinal passa-baixo?

14

Minha pergunta é: se eu quero passar um sinal alto, é o mesmo que passar um sinal baixo e subtraí-lo do sinal? Teoricamente é o mesmo? É praticamente o mesmo?

Eu pesquisei (no google e no dsp.stackexchange) e encontro respostas conflitantes. Eu tenho jogado com um sinal e aqui estão os resultados. Eu não consigo entender muito. Aqui está o sinal com a frequência de amostragem uma vez a cada quatro segundos. Projetei um filtro passa-baixa digital com a banda de transição de 0,8 mHz a 1 mHz e filtrou o sinal. Também projetei um filtro passa-alto com a mesma banda de transição e filtrou o sinal. Aqui estão os resultados.

insira a descrição da imagem aqui

Esta primeira imagem mostra o sinal original em preto e o sinal passa-baixo em azul. Eles estão quase um em cima do outro, mas não completamente. A curva vermelha é o sinal menos o sinal passa-alto que fica logo acima do sinal.

insira a descrição da imagem aqui

Esta segunda imagem é apenas a primeira ampliada para mostrar o que está acontecendo. Aqui vemos que claramente os dois não são os mesmos. Minha pergunta é por que? É algo sobre como eu implementei os dois filtros ou é algo teórico independente da minha implementação? Não sei muito sobre o design de filtros, mas sei que é notoriamente contra-intuitivo. Aqui está o código completo do MATLAB para reproduzir tudo isso. Estou usando o comando filtfilt para eliminar atrasos de fase. Mas outra coisa a destacar aqui é que os filtros não são normalizados. Quando somar (Hd.Numerator), recebo 0,9930 para o passa-baixo e 0,007 para o passa-alto. Não vejo como explicar isso. A saída deve ser dimensionada de alguma forma, porque os coeficientes não somam um? Esse dimensionamento poderia ter algo a ver com isso?

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')
Ponto fixo
fonte
1
Seu pedido de filtro é extremamente alto. As chances são de que você tenha problemas numéricos durante o processo de design. Verifique os filtros projetados calculando e plotando a magnitude da FFT. Além disso, veja minha resposta abaixo para saber como usar a subtração para gerar um filtro passa-alto a partir de um filtro passa-baixo.
Matt L.
Você pode emitir um sinal de alta frequência dessa maneira, mas a ordem do roll-off é sempre de primeira ordem: sound.westhost.com/articles/derived-xovers.htm Se você atrasar o sinal primeiro pelo atraso de grupo do LPF antes de subtrair , você pode obter a 3ª ordem
endolith

Respostas:

8

Em geral, você não pode simplesmente subtrair uma versão filtrada passa-baixa de um sinal do sinal original para obter um sinal filtrado passa-alta. O motivo é o seguinte. O que você está realmente fazendo é implementar um sistema com resposta em frequência

(1)H(ω)=1-HeuP(ω)

HeuP(ω)HeuP(ω)

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

mas esse geralmente não é o caso quando (1) é satisfeito.

HeuP(ω)

HeuP(ω)=|HeuP(ω)|ejϕ(ω)

ϕ(ω)

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

ejϕ(ω)

Na prática, isso é muito simples se o filtro passa-baixo tiver uma resposta de fase linear , porque o termo da fase é dado por

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

τnτ=n/2

Então, o que você precisa fazer é o seguinte:

  • projetar um filtro passa-baixa FIR de fase linear com uma ordem uniforme
  • filter()xeuP[n]
  • τ=n/2xd[n]
  • xHP[n]=xd[n]-xeuP[n]

Aqui está uma ilustração muito simples em Matlab / Octave

h_lp = fir1 (100, 0,3); % design passa-baixo
h_hp = [zeros (50,1); 1; zeros (50,1)] - h_lp; % design passa-alto por subtração
[H_lp, w] = frequência (h_lp, 1024);
[H_hp, w] = frequência (h_hp, 1.1024);
plot (w / 2 / pi, 20 * log10 (abs (H_lp)), w / 2 / pi, 20 * log10 (abs (H_hp)))
grade, eixo ([0, 0,5, -100,5])

insira a descrição da imagem aqui

EDITAR:

filtfiltfiltfiltn=100), você obtém o que esperaria. Na figura abaixo, você vê uma seção dos dados em azul, a saída do filtro passa-baixo em verde e o resultado da subtração da saída do filtro passa-alto dos dados originais em vermelho. As curvas verde e vermelha são praticamente idênticas.

x = load ('data.txt'); % de dados a serem filtrados
h_lp = fir1 (100, 0,3); % De resposta ao impulso LP
h_hp = fir1 (100, .3, 'alto'); % De resposta ao impulso HP
y = filtfilt (h_lp, 1, x); % aplica filtro passa-baixo
yh = filtfilt (h_hp, 1, x); % aplica filtro passa-alto
yd = x - yh; % de baixa passagem por diferença com filtro de alta passagem
n = 1: comprimento (x);
plot (n, x, n, y, 'g.', n, yd, 'r')
eixo ([3500,4000,140,150])

insira a descrição da imagem aqui

Matt L.
fonte
Se você estiver tentando projetar um filtro passa-alto dessa maneira, tenha cuidado com as especificações do filtro passa-baixo. A atenuação da banda de parada no filtro passa-baixa geralmente é alta o suficiente para obter uma pequena ondulação da banda de passagem na passa alta, mas a ondulação da banda de passagem no filtro LP geralmente não atinge atenuação suficiente da banda de parada no filtro HP.
David
Obrigado pela resposta detalhada. Isso esclareceu algumas coisas.
Ponto fixo
3

Em relação à escala:

10 0

Além da excelente resposta de Matt L., pode-se apenas salientar que o que ele está usando é chamado de filtros complementares de magnitude , que é o caso comum dos filtros FIR de fase linear, ou seja,

|HeuP|+|HHP|=1

Ao criar filtros a partir de duas seções paralelas allpass e adicionar / subtrair as saídas, os filtros lowpass / highpass serão complementares em termos de energia , ou seja,

|HeuP|2+|HHP|2=1

Oscar
fonte