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.