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')

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


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:

≈1≈0 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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.