FIR-Filter in Matlab

Gast #1637506
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.
Angehängte Dateien:
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.