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
@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). –
@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
Ich finde dieses Ergebnis ziemlich erstaunlich. Mathe ist schön. –