Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR-Filter in Matlab


von Chukky (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.
Beschäftige mich seit ein par Tagen mit FIR-Filtern und bin dabei auf 
folgenden Code im Netz gestossen. Der Code ist ein Ausschnit aus einem 
grösseren Programm das mit Matlab (Guide) realisiert wurde. In dem 
Programm gehts um Modulation und Demodulation von Wav-Dateien. Vor der 
Modulation kann die Wave-Datei, indem man die untere und obere 
Grenzfrequenz in ein Textfeld eingibt, gefiltert werden. Dies ist der 
Teil den ich selber auch brauche, aber teilweise nicht verstehe.
Den Code für die FIR-Filter habe ich der Übersichtsheit halber 
ausgeschnitten (komplettes Programm im Anhang).

1
function [h] = firFilter(minFreq,maxFreq,hDuration,sampleFreq,windowType,handles)
2
% Computes the impulse time response filter based on a rectangular frequency response
3
% with "baseBdWidth" frequency bandwidth. The impulse time response is then windowed
4
% by one of the following windows:
5
% Hanning, Hamming, Blackman.
6
% minFreq,maxFreq are the frequencies boundaries of the UNILATERAL bandpass spectrum obtained  
7
% after the filter operation.
8
% In case of lowpass filter, choose minFreq = -maxFreq; don't forget that h will be
9
% affected by a factor 2 to take into account in the filtering operation.
10
% hDuration is the time duration of impulse response expressed in 1/baseBdWidth unit.
11
12
baseBdWidth = maxFreq - minFreq;    % Bandwidth of rectangular frequency response
13
freqShift = (maxFreq + minFreq)/2;  % Frequency shift if band pass filter required
14
15
16
Nk = floor(hDuration*sampleFreq/baseBdWidth);
17
if mod(Nk,2) == 0
18
    Nk = Nk + 1;
19
end
20
   
21
22
% Cardinal-sinus impulse response calculation
23
k = 1:(Nk-1)/2;
24
h = sin(pi*baseBdWidth*k/sampleFreq)./(pi*baseBdWidth*k/sampleFreq);
25
h = [fliplr(h) 1 h]*baseBdWidth/sampleFreq;
26
k = -(Nk-1)/2:(Nk-1)/2;
27
28
% Windowing the impulse response
29
30
switch windowType
31
    case 'Hanning'  % Hanning window
32
        window = 0.5*(1- cos(2*pi*[0:length(k)-1]/Nk));  
33
    case 'Hamming'  % Hamming window
34
        window = 0.54 - 0.46*cos(2*pi*[0:length(k)-1]/Nk);
35
    case 'Blackman' % Blackman window
36
        window = 0.42 -0.5*cos(2*pi*[0:length(k)-1]/Nk) ...
37
   + 0.08*cos(4*pi*[0:length(k)-1]/Nk);                  
38
    otherwise
39
        return
40
end
41
h = h.* window;
42
h = 2*h.*cos(2*pi*k*freqShift/sampleFreq);   % Frequency shift


Mein grösstest Problem gibts gleich am Anfang.
Würde gerne wissen, wieso man mit dieser Formel Nk = 
floor(hDuration*sampleFreq/baseBdWidth) die Ordnung berechnen kann und 
wie man darauf kommt??

Für mich ergibt das keinen Sinn: Dauer der Impulsantwort * Abtastfrq. / 
Bandbreite

Vielleicht kann mir das jmd. erklären und ein bischen Licht ins Dunkel 
bringen.

von Alexander L. (lippi2000)


Lesenswert?

Hey Chukky,

für mich sieht das so aus, dass hier mit Nk die Anzahl der Samplewerte 
des Fensters berechnet wird. Das Verhältnis der Bandbreite des 
Bandpassignal zur Basisbandbreite multipliziert mit der Abtastfrequenz 
ergibt die Anzahl der benötigten Fensterwerte (Hamming etc.)

k beschreibt doch das Fenster im Basisband. Also von -Nk/2 bis +Nk/2.

Am Ende wird das Signal ja auch mit der Fensterfunktion gefaltet.

Gruß Alexander

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.