2009-05-04 7 views

Antwort

4

Sie h[n] verwandelt sich in eine rect in der Frequenzdomäne. Um den Bandpass zu erreichen, müssen Sie die Mittenfrequenz höher einstellen.

Multiplizieren Sie dazu h[n] mit exp(j*w_offset*n), wobei w_offset die zu verschiebende Größe ist. Wenn w_offset positiv ist, werden Sie zu höheren Frequenzen verschoben.

Multiplikation im Zeitbereich ist Faltung im Frequenzbereich. Da exp(j*w_offset*n) in Impulsfunktion um w_offset zentriert wird, verschiebt die Multiplikation die H(w) um w_offset.

Weitere Details finden Sie unter Discrete Time Fourier Transform.

Hinweis: Ein solcher Filter ist nicht symmetrisch um 0, was bedeutet, dass es komplexe Werte haben wird. Um es symmetrisch zu machen, müssen Sie h[n] hinzufügen multipliziert mit exp(-j*w_offset*n):

h_bandpass[n] = h[n](exp(j*w_offset*n)+exp(-j*w_offset*n))

Seit 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.

+0

@freespace „Filter realisierbar sind, da sie hat rein reale Werte "Sie implizieren, dass komplexwertige Koeffizienten die Implementierung eines Filters unmöglich machen ... Sie liegen falsch.Wenn Sie komplexe Koeffizienten haben, führen Sie komplexe Multiplikationen und komplexe Additionen durch (jede komplexe Multiplikation ist 4 Real-Mults und 2 Real-Adds). –

+0

@Trevour Boyd Smith: Entschuldigung, Sie haben Recht. Meine erste Antwort berücksichtigte nur, was mit einem echten Wertesignal passiert ist - Sie würden einen komplexen Wert erhalten, den ich für nutzlos hielt, um Sprecher zu sagen. Aber es gibt natürlich Fälle, in denen das Signal selbst komplex ist und eine komplexe Ausgabe erwartet und nützlich ist. – freespace

+0

Ich finde dieses Ergebnis ziemlich erstaunlich. Mathe ist schön. –

0

Lassen Sie f[n] das Signal sein, das Sie von dem Tiefpassfilter mit w_c an der unteren Grenze der gewünschten Band erhalten. Sie können die Frequenzen oberhalb dieser unteren Grenze erhalten, indem Sie f[n] vom ursprünglichen Signal subtrahieren. Dies ist der gewünschte Eingang für den zweiten Tiefpassfilter.

1

Die kurze Antwort ist, dass Sie mit einem komplexen Exponential im Zeitbereich multiplizieren werden. Die Multiplikation im Zeitbereich verschiebt das Signal im Frequenzbereich.

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 habe gerade vor ein paar Wochen diese genaue Funktionalität für die Schule implementiert.

Hier 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 zu nutzen:

h_bpf_hammingWindow = BPF_hammingWindow(36, pi/4, 3*pi/4); 
freqz(h_bpf_hammingWindow); % View the frequency domain 
Verwandte Themen