Como converter um filtro low-pass a um filtro passa-banda
-
03-07-2019 - |
Pergunta
I têm uma um filtro passa baixo descrito pela seguinte função de transferência:
h [n] = (w_c / Pi) * sinc (n * w_c / Pi), onde é w_c é a frequência de corte
Eu tenho que converter esse filtro low-pass a um filtro passa-banda.
Solução
Você h[n]
transforma em um rect
no domínio da freqüência. Para torná-lo banda de passagem que você precisa mover sua freqüência central superior.
Para fazer isso, h[n]
multiplicar por exp(j*w_offset*n)
, onde w_offset
é a quantidade de mudança. Se w_offset
é positivo, então você mudar para freqüências mais altas.
A multiplicação no domínio do tempo é a convolução no domínio da freqüência. Desde exp(j*w_offset*n)
voltas em função impulso centrado em w_offset
, as mudanças de multiplicação do H(w)
por w_offset
.
Transformada de Fourier de tempo discreto para mais detalhes.
Nota ??strong>: tal filtro não será simétrica cerca de 0, o que significa que terão valores complexos. Para tornar mais simétrica, você precisa adicionar 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
obtemos:
h_bandpass[n] = h[n]cos(w_offset*n)
Este filtro, em seguida, tem valores puramente reais.
Outras dicas
A resposta curta é que você vai multiplicar por um exponencial complexo no domínio do tempo. A multiplicação no domínio do tempo irá mudar o sinal no domínio da frequência.
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. Aconteceu de eu ter apenas implementado esta funcionalidade exata para a escola um par de semanas atrás.
Aqui está o código para criar o seu próprio filtro de passagem de banda, utilizando o método de janelas:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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()
Exemplo de como usar essa função:
h_bpf_hammingWindow = BPF_hammingWindow( 36, pi/4, 3*pi/4 );
freqz(h_bpf_hammingWindow); % View the frequency domain
Let f[n]
ser o sinal que recebe do filtro passa-baixa com w_c
no limite inferior da banda desejada. Você pode obter as frequências acima deste limite inferior subtraindo f[n]
do sinal original. Esta é a entrada que você deseja para o segundo filtro passa-baixa.