Wie ein Tiefpassfilter mit einem Bandpassfilter konvertieren
-
03-07-2019 - |
Frage
Ich habe einen einen Tiefpassfilter durch die folgende Übertragungsfunktion beschrieben werden:
h [n] = (w_c / Pi) * sinc (n * w_c / Pi), wobei ist w_c ist die Grenzfrequenz
Ich habe diesen Tiefpassfilter mit einem Bandpassfilter konvertieren.
Lösung
Sie h[n]
verwandelt sich in eine rect
im Frequenzbereich. Um es Bandpass- Sie müssen die zentrale Frequenz höher bewegen.
Um dies zu tun, multiplizieren h[n]
von exp(j*w_offset*n)
, wo w_offset
die Menge zu verschieben. Wenn w_offset
positiv ist, dann verschieben Sie zu höheren Frequenzen.
Die Multiplikation im Zeitbereich ist Faltung im Frequenzbereich. Da exp(j*w_offset*n)
in Impulsfunktion schaltet w_offset
zentriert ist, verschiebt sich die Multiplikation der H(w)
von w_offset
.
Siehe Diskrete Zeit Fourier für weitere Details Trans .
Hinweis : ein solcher Filter nicht symmetrisch sein etwa 0, was bedeutet, dass es komplexe Werte haben. Um es symmetrisch zu machen, müssen Sie h[n]
von exp(-j*w_offset*n)
multipliziert hinzuzufügen:
h_bandpass[n] = h[n](exp(j*w_offset*n)+exp(-j*w_offset*n))
Da cos(w*n) = (exp(j*w*n)+exp(-j*w*n))/2
erhalten wir:
h_bandpass[n] = h[n]cos(w_offset*n)
Dieser Filter hat dann rein reelle Werte.
Andere Tipps
Die kurze Antwort ist, dass Sie sich durch eine komplexe Exponentialfunktion in der Zeitdomäne vermehren. Multiplikation in der Zeitdomäne wird das Signal in dem Frequenzbereich verschieben.
Matlab-Code:
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. Ich war zufällig gerade vor ein paar Wochen genau diese Funktionalität für die Schule umgesetzt zu haben.
Hier ist der Code für die eigenen Bandpassfilter mit dem Windowing-Verfahren zu erstellen:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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()
Beispiel, wie diese Funktion nutzen:
h_bpf_hammingWindow = BPF_hammingWindow( 36, pi/4, 3*pi/4 );
freqz(h_bpf_hammingWindow); % View the frequency domain
Lassen Sie f[n]
das Signal sein, das Sie von dem Tiefpassfilter erhalten mit w_c
an der unteren Grenze des gewünschten Bandes. Sie können die Frequenzen oberhalb dieser unteren Grenze erhalten, indem f[n]
von dem ursprünglichen Signal subtrahiert wird. Dies ist der Eingang, den Sie für den zweiten Tiefpassfilter soll.