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.
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.
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')
Respuestas:
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
pero este generalmente no es el caso cuando (1) está satisfecho.
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
Entonces, lo que tienes que hacer es lo siguiente:
filter()
Aquí hay una ilustración muy simple en Matlab / Octave
EDITAR:
filtfilt
filtfilt
fuente
En cuanto a la escala:
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,
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,
fuente