Comment convertir un filtre passe-bas en filtre passe-bande
-
03-07-2019 - |
Question
J'ai un filtre passe-bas décrit par la fonction de transfert suivante:
h [n] = (w_c / Pi) * sinc (n * w_c / Pi), où est w_c la fréquence de coupure
Je dois convertir ce filtre passe-bas en filtre passe-bande.
La solution
Vous h [n]
se transforme en rect
dans le domaine fréquentiel. Pour que la bande passe, vous devez augmenter la fréquence centrale.
Pour ce faire, multipliez h [n]
par exp (j * w_offset * n)
, où w_offset
correspond au montant à déplacer . Si w_offset
est positif, vous passez à des fréquences plus élevées.
La multiplication dans le domaine temporel correspond à la convolution dans le domaine fréquentiel. Puisque exp (j * w_offset * n)
se transforme en fonction d'impulsion centrée sur w_offset
, la multiplication décale le H (w)
de . w_offset
.
Voir Transformation de Fourier en temps discret pour plus de détails.
Remarque : un tel filtre ne sera pas symétrique autour de 0, ce qui signifie qu'il aura des valeurs complexes. Pour le rendre symétrique, vous devez ajouter h [n]
multiplié par exp (-j * w_offset * n)
:
h_bandpass [n] = h [n] (exp (j * w_offset * n) + exp (-j * w_offset * n))
Puisque cos (w * n) = (exp (j * w * n) + exp (-j * w * n)) / 2
, nous obtenons:
h_bandpass [n] = h [n] cos (w_offset * n)
Ce filtre a alors des valeurs purement réelles.
Autres conseils
La réponse courte est que vous allez multiplier par une exponentielle complexe dans le domaine temporel. La multiplication dans le domaine temporel décale le signal dans le domaine fréquentiel.
Code 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. Je venais de mettre en œuvre cette fonctionnalité exacte pour l'école il y a quelques semaines.
Voici le code permettant de créer votre propre filtre passe-bande en utilisant la méthode de fenêtrage:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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()
Exemple d'utilisation de cette fonction:
h_bpf_hammingWindow = BPF_hammingWindow( 36, pi/4, 3*pi/4 );
freqz(h_bpf_hammingWindow); % View the frequency domain
Soit f [n]
le signal que vous obtenez du filtre passe-bas avec w_c
à la limite inférieure de la bande souhaitée. Vous pouvez obtenir les fréquences supérieures à cette limite inférieure en soustrayant f [n]
du signal d'origine. C'est l'entrée que vous voulez pour le deuxième filtre passe-bas.