Cómo convertir un filtro de paso bajo en un filtro de paso de banda
-
03-07-2019 - |
Pregunta
Tengo un filtro de paso bajo descrito por la siguiente función de transferencia:
h [n] = (w_c / Pi) * sinc (n * w_c / Pi), donde w_c es la frecuencia de corte
Tengo que convertir este filtro de paso bajo en un filtro de paso de banda.
Solución
Usted h [n]
se transforma en un rect
en el dominio de la frecuencia. Para hacer que pase la banda, necesita mover su frecuencia central más alta.
Para hacer esto, multiplique h [n]
por exp (j * w_offset * n)
, donde w_offset
es la cantidad a cambiar . Si w_offset
es positivo, entonces cambia a frecuencias más altas.
La multiplicación en el dominio del tiempo es una convolución en el dominio de la frecuencia. Como exp (j * w_offset * n)
se convierte en una función de impulso centrada en w_offset
, la multiplicación desplaza H (w)
por w_offset
.
Consulte Transformada de Fourier en tiempo discreto para obtener más detalles.
Nota : dicho filtro no será simétrico con respecto a 0, lo que significa que tendrá valores complejos. Para hacerlo simétrico, debe agregar h [n]
multiplicado por exp (-j * w_offset * n)
:
h_bandpass [n] = h [n] (exp (j * w_offset * n) + exp (-j * w_offset * n))
Desde cos (w * n) = (exp (j * w * n) + exp (-j * w * n)) / 2
obtenemos:
h_bandpass [n] = h [n] cos (w_offset * n)
Este filtro tiene valores puramente reales.
Otros consejos
La respuesta corta es que se multiplicará por un exponencial complejo en el dominio del tiempo. La multiplicación en el dominio del tiempo cambiará la señal en el dominio de la frecuencia.
Código Matlab:
n_taps = 100;
n = 1:n_taps;
h = ( w_c / Pi ) * sinc( ( n - n_taps / 2) * w_c / Pi ) .* ...
exp( i * w_offset * ( n - n_taps / 2) );
p.s. Resulta que acabo de implementar esta funcionalidad exacta para la escuela hace un par de semanas.
Aquí está el código para crear su propio filtro de paso de banda usando el método de ventanas:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Function: Create bandpass filter using windowing method
% Purpose: Simple method for creating filter taps ( useful when more elaborate
% filter design libraries are not available )
%
% @author Trevor B. Smith, 24MAR2009
%
% @param n_taps How many taps are in your output filter
% @param omega_p1 The lower cutoff frequency for your passband filter
% @param omega_p2 The upper cutoff frequency for your passband filter
% @return h_bpf_hammingWindow The filter coefficients for your passband filter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function h_bpf_hammingWindow = BPF_hammingWindow(n_taps,omega_p1,omega_p2)
% Error checking
if( ( omega_p2 == omega_p1 ) || ( omega_p2 < omega_p1 ) || ( n_taps < 10 ) )
str = 'ERROR - h_bpf_hammingWindow(): Incorrect input parameters'
h_bpf_hammingWindow = -1;
return;
end
% Compute constants from function parameters
length = n_taps - 1; % How many units of T ( i.e. how many units of T, sampling period, in the continuous time. )
passbandLength = omega_p2 - omega_p1;
passbandCenter = ( omega_p2 + omega_p1 ) / 2;
omega_c = passbandLength / 2; % LPF omega_c is half the size of the BPF passband
isHalfSample = 0;
if( mod(length,2) == 1 )
isHalfSample = 1/2;
end
% Compute hamming window
window_hamming = hamming(n_taps);
% Compute time domain samples
n = transpose(-ceil(length/2):floor(length/2));
h1 = sinc( (1/pi) * omega_c * ( n + isHalfSample ) ) * pi .* exp( i * passbandCenter * ( n + isHalfSample ) );
% Window the time domain samples
h2 = h1 .* window_hamming;
if 1
figure; stem(h2); figure; freqz(h2);
end
% Return filter coefficients
h_bpf_hammingWindow = h2;
end % function BPF_hammingWindow()
Ejemplo sobre cómo usar esta función:
h_bpf_hammingWindow = BPF_hammingWindow( 36, pi/4, 3*pi/4 );
freqz(h_bpf_hammingWindow); % View the frequency domain
Sea f [n]
la señal que recibe del filtro de paso bajo con w_c
en el límite inferior de la banda deseada. Puede obtener las frecuencias por encima de este límite inferior al restar f [n]
de la señal original. Esta es la entrada que desea para el segundo filtro de paso bajo.