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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top