Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Filtrowanie fft w matlabie

gelkoz 09 Feb 2009 20:43 1560 1
  • #1
    gelkoz
    Level 10  
    Witam, chcę odfiltrować z sygnału pewną częstotliwość przy pomocy fft. Wykonuję filtrowanie w matlabie. Problem pojawia się przy sprawdzeniu. Jeśli analizuję cały filtrowany sygnał wszystko jest w porządku ale jeśli poddam analizie fragment sygnału odfiltrowana częstotliwość pojawia się ponownie. Myślałem że jest to kwestia nieprecycyjnego wyznaczenia częstotliwości i próbowałem usuwać całe pasmo lecz efekty były podobne. Czy ktoś może mi podpowiedzieć gdzie tkwi błąd? Byłbym bardzo wdzięczny. Pod spodem zamieszczam mój kod.

    Code:

    % sygnal- sygnał dźwiękowy ( testowy o długości 1000 próbek)
    % f_sampling- częstotliwośc próbkowania
    % f_usun- częstotliwość usuwana
    f_sampling=44100;

    % OBRÓCENIE WEKTORA WE WŁAŚCIWA STRONĘ
    sygnal=s1;
    r=size(sygnal); % rozmiar sygnału
    if (r(1)<r(2))
        sygnal=sygnal';
        r=size(sygnal);
    end
    r=r(1);
    % TRANSFORMATA
    y1 = fft(sygnal);
    l=length(y1);
    T=l/f_sampling;
    m = abs(y1);
    f =(0:l-1)/T;
    p=l/2;

    % USUWAM CZĘSTOTLIWOŚĆ f_usun
    f_usun=1000;
    i=1;
    while (f(i)<f_usun)
        i=i+1;
    end
    y1(i)=0;
    y1(l-i+2)=0;



    subplot(3,1,1);
    plot(f(1:p),abs(y1(1:p)));
    odfiltrowany=ifft(y1);
    odfiltrowany=real(odfiltrowany);

    % SPRAWDZAM DLA CAŁEGO SYGNAŁU
    y1 = fft(odfiltrowany);
    l=length(y1);
    p=l/2;
    T=l/f_sampling;
    m = abs(y1);
    f =(0:l-1)/T;

    subplot(3,1,2);
    plot(f(1:p),abs(y1(1:p)));

    % SPRAWDZAM DLA CZĘŚCI SYGNAŁU <<<<<<BŁĄD
    len=length(odfiltrowany);
    l=len/2;
    y1 = fft(odfiltrowany(1:l));
    l=length(y1);
    p=l/2;
    T=l/f_sampling;
    m = abs(y1);
    f =(0:l-1)/T;

    subplot(3,1,3);
    plot(f(1:p),abs(y1(1:p)));


    Proszę umieszczać kod w znacznikach [code] - dodałem.
    [Dr.Vee]
  • #2
    qrdel
    Level 28  
    Nie mam dużo czasu, ale to nie jest filtracja tylko wycinanki, ingerujesz w cały sygnał w sposób praktycznie nieprzewidywalny.
    Spróbuj zastosować procedury filtracji, polecam FILTFILT która jakoby nie ingeruje w zaleznosci fazowe.
    A najpierw musisz "zaprojektować" filtr, procedurki typu CHEBY, BESS itp.
    I wtedy z pewnością nie uda Ci się zrobić sensownego filtru wycinającego jeden bin z fft bo taka działalność jest absolutnie niefizyczna.
    Pozostaje jeszcze sprawa rekordów, okien i overlapingu (przekrywania), ale przy 1000 próbek to problematyczne.