logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C]Prosty filtr FIR + jego test sygnałem z MATLABA

Pawel M. 11 Sty 2013 23:32 2904 6
  • #1 11775949
    Pawel M.
    Poziom 9  
    Cześć,

    potrzebuję napisać prosty filtr FIR w C, bez jakichś konkretnych wymagań. Powiedzmy, żeby np. przepuszczał tylko okolice 1kHz. Później potrzebuję wygenerować sygnał w Matlabie, którym mógłbym sprawdzić czy ten filtr w miarę filtruje poprawnie.
    Znalazłem w sieci takie oto projekt filtru: Link. Sprawdziłem te współczynniki w Matlabie i faktycznie z kilku sinusoid w zakresie od 0 do 16 kHz pozostawił mi głównie tą w 1kHz.

    Chciałbym zrobić coś na zasadzie, że genereuję sobie w Matlabie sygnał, np. tak jak tutaj Link (chociaż nie wiem czemu tak się różni w amplitudach tych tonów). I taki sygnał chciałbym przefiltrować tym FIRem napisanym w C, później zapisać odpowiedź i wyświetlić rezultat w Matlabie.

    Problem w tym, że nie wiem w jakiego typu zmiennych zapisać wartości tego sygnału, tak żeby zgrało się z tym w C. Próbowałem też zrobić test podając 1 i później same zera do tego filtru w C, co z tego co kojarzę powinno dać jego współczynniki. Niestety jednak też nie zadziałało mi to.

    Bardzo proszę o pomoc. Docelowo ten filtr będzie musiał być na typach stałoprzecinkowych, ale to później, najpier chciałbym się dowiedzieć jak ruszyć taki filtr w C.
  • #3 11776039
    Pawel M.
    Poziom 9  
    Łoo, to dopiero wynalazek. Aktualnie nie mam jednak dostępu do Windowsa, żeby wygenerować z niego kod. Ale przyda się kiedyś na pewno, bo jest też opcja VHDL :) Dzięki.

    W tym co wcześniej wrzuciłem powinien być ok, tylko jak podać dane do przetworzenia...
  • #4 11776040
    pawel-jwe
    Poziom 30  
    A dlaczego ten filtr ma być w C (jak dla mnie jest to dość "niewdzięczny" język do realizacji filtrów FIR/IIR).
    No ale jeśli już trzeba to zapisz sobie sygnał bazowy (ten który ma byś filtrowany) jako po prostu plik *.wave (z tego co pamiętam w Matlabie/Scilabei nie ma z tym problemów). Dalej otwieraj ten plik w programie napisanym w C, który to go filtruje i wynik zapisuje w innym pliku wave. Później znowu otwierasz oba pliki w Matlabie i analizujesz próbki.
    PS. Coś podobnego robiłem na studiach na lab.CPS - projektowaliśmy filtr w Scilabie i za pomocą skryptu generowaliśmy odpowiedni plik do wgrania na płytkę z cyfrowym filtrem. Generowaliśmy też określony sygnał i zapisywaliśmy do pliku wave, następnie przepuszczaliśmy ten sygnał przez tą płytkę i rejestrowaliśmy z wykorzystaniem oczywiście karty dźwiękowej komputera. Mając próbki wejściowe i wyjściowe analizowaliśmy to w Scialbie czy trzyma parametry założone na początku itp. - generalnie wesoło ;)
  • #5 11776082
    Pawel M.
    Poziom 9  
    W C, bo później muszę to ruszyć na procesorze.
    Z wavem w Matlabie nie ma problemu. Tylko, że u mnie szału nie ma z C, a w takim wavie to trzeba by jakoś pomijać nagłówek... Nie chciałem komplikować sprawy, a że ten programik co podałem linka chce same próbki sygnału to robiłem to zapisując je z Matlaba tak (btw. nie ma tu na forum opcji listingu Matlabowego kodu czy ja już o tej porze nie widzę?):
    fid = fopen('in_data.bin','w');
    fwrite(fid, D);
    fclose(fid);

    I później wczytanie:
    fid = fopen('out_data.bin','rb');
    B = fread(fid);
    fclose(fid);

    D i B to oczywiście jakieś wektory danych.

    Tylko, że coś z tymi danymi podawanymi do C jednak źle robiłem, bo wyniki były złe. Dlatego chciałbym prosić, aby ktoś obeznany ze sprawą sprawdził to.
  • #6 11776087
    kris_gor
    Poziom 17  
    Pawel M. napisał:
    Łoo, to dopiero wynalazek. Aktualnie nie mam jednak dostępu do Windowsa, żeby wygenerować z niego kod. Ale przyda się kiedyś na pewno, bo jest też opcja VHDL :)



    Na ten vhdl to ja bym raczej nie liczył, bo od 5 lat si.ę ta strona nie zmienia i wątpię, aby była następna wersja... ale może, kto to wie.
  • #7 11776107
    Pawel M.
    Poziom 9  
    kris_gor napisał:
    Na ten vhdl to ja bym raczej nie liczył, bo od 5 lat si.ę ta strona nie zmienia i wątpię, aby była następna wersja... ale może, kto to wie.


    Tak poglądowo chociaż się przyda. A wracając do tematu, dziś już nie mam siły, ale jutro wrzucę sposób w jaki próbowałem to sprawdzić i nie działało. Może ktoś dopatrzy się błędu w rozumowaniu.

    Ale jeśli ktoś ma chęci to prosiłbym też o sprawdzenie tego.
REKLAMA