Señal analítica y transformada de Hilbert
La función hilbert
encuentra la señal analítica exacta para un bloque finito de datos. También se puede generar la señal analítica utilizando un filtro transformador de Hilbert con respuesta al impulso finita (FIR) para calcular una aproximación a la parte imaginaria.
Genere una secuencia compuesta por tres sinusoides con frecuencias de 203, 721 y 1001 Hz. La secuencia se muestrea a 10 kHz durante aproximadamente 1 segundo. Utilice la función hilbert
para calcular la señal analítica. Represéntela entre 0,01 segundos y 0,03 segundos.
fs = 1e4; t = 0:1/fs:1; x = 2.5 + cos(2*pi*203*t) + sin(2*pi*721*t) + cos(2*pi*1001*t); y = hilbert(x); plot(t,real(y),t,imag(y)) xlim([0.01 0.03]) legend('real','imaginary') title('hilbert Function') xlabel('Time (s)')
Calcule las estimaciones de Welch de las densidades espectrales de potencia de la secuencia original y de la señal analítica. Divida las secuencias en secciones no solapadas de Hamming de longitud 256. Compruebe que la señal analítica no tiene potencia en las frecuencias negativas.
pwelch([x;y].',256,0,[],fs,'centered') legend('Original','hilbert')
Utilice la función designfilt
para diseñar un filtro transformador de Hilbert con FIR de 60.º orden. Especifique un ancho de transición de 400 Hz. Visualice la respuesta en frecuencia del filtro.
fo = 60; d = designfilt('hilbertfir','FilterOrder',fo, ... 'TransitionWidth',400,'SampleRate',fs); freqz(d,1024,fs)
Filtre la secuencia sinusoidal para aproximar la parte imaginaria de la señal analítica.
hb = filter(d,x);
El retardo de grupo del filtro, grd
, es igual a la mitad del orden del filtro. Compense dicho retardo. Elimine las primeras muestras grd
de la parte imaginaria y las últimas muestras grd
de la parte real y del vector temporal. Represente el resultado entre 0,01 segundos y 0,03 segundos.
grd = fo/2; y2 = x(1:end-grd) + 1j*hb(grd+1:end); t2 = t(1:end-grd); plot(t2,real(y2),t2,imag(y2)) xlim([0.01 0.03]) legend('real','imaginary') title('FIR Filter') xlabel('Time (s)')
Calcule la densidad espectral de potencia (PSD) de la señal analítica aproximada y compárela con el resultado hilbert
.
pwelch([y;[y2 zeros(1,grd)]].',256,0,[],fs,'centered') legend('hilbert','FIR Filter')