¿Es una señal de paso alto lo mismo que una señal menos una señal de paso bajo?


14

Mi pregunta es, si quiero pasar una señal de paso alto, ¿es lo mismo que pasar una señal de paso bajo y restarla de la señal? ¿Es teóricamente lo mismo? ¿Es prácticamente lo mismo?

He buscado (tanto en google como en dsp.stackexchange) y encuentro respuestas conflictivas. He estado jugando con una señal y aquí están los resultados. No puedo darle mucho sentido. Aquí está la señal con la frecuencia de muestreo una vez cada cuatro segundos. Diseñé un filtro digital de paso bajo con la banda de transición de 0,8 mHz a 1 mHz y filtré la señal. Luego, también diseñé un filtro de paso alto con la misma banda de transición y filtré la señal. Aquí están los resultados.

ingrese la descripción de la imagen aquí

Esta primera imagen muestra la señal original en negro y la señal de paso bajo en azul. Están casi uno encima del otro, pero no del todo. La curva roja es la señal menos la señal de paso alto que está justo encima de la señal.

ingrese la descripción de la imagen aquí

Esta segunda imagen es solo la primera ampliada para mostrar lo que está sucediendo. Aquí vemos que claramente los dos no son lo mismo. Mi pregunta es por qué ¿Es algo acerca de cómo he implementado los dos filtros o es algo teórico independiente de mi implementación? No sé mucho sobre el diseño de filtros, pero sí sé que es notoriamente contra-intuitivo. Aquí está el código MATLAB completo para reproducir todo esto. Estoy usando el comando filtfilt para eliminar los retrasos de fase. Pero otra cosa para señalar aquí es que los filtros no están normalizados. Cuando hago suma (Hd.Numerator), obtengo 0.9930 para el paso bajo y 0.007 para el paso alto. No veo cómo dar cuenta de esto. ¿Debería escalarse la salida de alguna manera porque los coeficientes no suman uno? ¿Podría esta escala tener algo que ver con esto?

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
Su orden de filtro es extremadamente alta. Lo más probable es que te encuentres con problemas numéricos durante el proceso de diseño. Verifique los filtros diseñados calculando y trazando la magnitud de la FFT. Además, vea mi respuesta a continuación sobre cómo usar la resta para generar un filtro de paso alto a partir de un filtro de paso bajo.
Matt L.

Puede hacer una señal de paso alto de esta manera, pero el orden del roll-off siempre es de primer orden: sound.westhost.com/articles/derived-xovers.htm Si primero retrasa la señal por el grupo de retraso del LPF antes de restar , puede obtener el tercer orden
endolito el

Respuestas:


8

En general, no puede simplemente restar una versión filtrada de paso bajo de una señal de la original para obtener una señal filtrada de paso alto. La razon es la siguiente. Lo que realmente está haciendo es implementar un sistema con respuesta de frecuencia

(1)H(ω)=1-HLPAG(ω)

HLPAG(ω)HLPAG(ω)

(2)El |H(ω)El |=El |1-El |HLPAG(ω)El |El |

pero este generalmente no es el caso cuando (1) está satisfecho.

HLPAG(ω)

HLPAG(ω)=El |HLPAG(ω)El |mijϕ(ω)

ϕ(ω)

(3)HHPAG(ω)=mijϕ(ω)-HLPAG(ω)=mijϕ(ω)(1-El |HLPAG(ω)El |)

mijϕ(ω)

En la práctica, esto es muy simple si el filtro de paso bajo tiene una respuesta de fase lineal , porque el término de fase viene dado por

(4)mijϕ(ω)=mi-jωτ

τnorteτ=norte/ /2

Entonces, lo que tienes que hacer es lo siguiente:

  • diseñar un filtro de paso bajo FIR de fase lineal con un orden uniforme
  • filter()XLPAG[norte]
  • τ=norte/ /2Xre[norte]
  • XHPAG[norte]=Xre[norte]-XLPAG[norte]

Aquí hay una ilustración muy simple en Matlab / Octave

h_lp = fir1 (100, .3); % diseño de paso bajo
h_hp = [ceros (50,1); 1; ceros (50,1)] - h_lp; % diseño de paso alto por sustracción
[H_lp, w] = freqz (h_lp, 1,1024);
[H_hp, w] = freqz (h_hp, 1,1024);
plot (w / 2 / pi, 20 * log10 (abs (H_lp)), w / 2 / pi, 20 * log10 (abs (H_hp)))
cuadrícula, eje ([0, .5, -100,5])

ingrese la descripción de la imagen aquí

EDITAR:

filtfiltfiltfiltnorte=100), obtienes lo que esperarías. En la siguiente figura, verá una sección de los datos en azul, la salida del filtro de paso bajo en verde y el resultado de la resta de la salida del filtro de paso alto de los datos originales en rojo. Las curvas verde y roja son prácticamente idénticas.

x = carga ('data.txt'); % de datos a filtrar
h_lp = fir1 (100, .3); % De respuesta al impulso LP
h_hp = fir1 (100, .3, 'alto'); % De respuesta al impulso HP
y = filtfilt (h_lp, 1, x); % aplica filtro de paso bajo
yh = filtfilt (h_hp, 1, x); % aplica filtro de paso alto
yd = x - yh; % de paso bajo por diferencia con filtro de paso alto
n = 1: longitud (x);
plot (n, x, n, y, 'g.', n, yd, 'r')
eje ([3500,4000,140,150])

ingrese la descripción de la imagen aquí


Si está intentando diseñar un filtro de paso alto de esta manera, debe tener cuidado con las especificaciones del filtro de paso bajo. La atenuación de la banda de parada en el filtro de paso bajo suele ser lo suficientemente alta como para lograr una pequeña ondulación de la banda de paso en el paso alto, pero la ondulación de la banda de paso en el filtro LP a menudo no logra suficiente atenuación de la banda de detención en el filtro HP.
David

Gracias por la respuesta detallada. Aclaró algunas cosas.
Punto fijo el

3

En cuanto a la escala:

10 0

Además de la excelente respuesta de Matt L., uno puede señalar que lo que está usando se conoce como filtros complementarios de magnitud , que es el caso común de los filtros FIR de fase lineal, es decir,

El |HLPAGEl |+El |HHPAGEl |=1

Al crear filtros a partir de dos secciones paralelas de paso total y sumar / restar las salidas, los filtros de paso bajo / paso alto serán en su lugar complementarios de potencia , es decir,

El |HLPAGEl |2+El |HHPAGEl |2=1

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.