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

Ez-Kit 21061 bandpass demo-jak zrobić własne współczynniki?

sq2gn 18 Cze 2007 02:49 1896 9
REKLAMA
  • #1 3995162
    sq2gn
    Poziom 11  
    W VisualDSP++ 3.0 dla Ez-kit Lite można znaleźć "bandpass filter demo". Działa to mniej więcej w taki sposób:

    
    .
    .
    .
    #define NUM_TAPS 256
    
    // tutaj pobiera plik fir.h zawierajacy 256 wspolczynnikow dla FIR
    
    float pm coeffs[NUM_TAPS] =
    {
    #include "fir.h"
    };
    
    float dm state[NUM_TAPS+1];
    .
    .
    .
    // i uzywa takiej funkcji fir() zawartej w zewnetrznej bibliotece:
    
    tx_buf[1] = fir( rx_buf[1], &coeffs[0], &state[0], (int)NUM_TAPS );
    
    .
    .
    .
    



    pełny listing pliku bp.c możecie znaleźć tutaj:
    http://wisnia.server.pl/fir/bp.c
    plik fir.h jest tu:
    http://wisnia.server.pl/fir/fir.h


    a to jego matlabowy wykres freqz():
    http://wisnia.server.pl/fir/fir.jpg

    I TO WSZYSTKO DZIAŁA POPRAWNIE !

    Ponieważ nie znalazłem żadnej "poważnej" dokumentacji do tego przykładu, a także do funkcji fir(), a chciałem uzyskać filtr o określonej częstotliwości przepuszczania, popróbowałem zrobić własny plik ze współczynnikami, używają matlaba i jego:

    1. funkcji fir1():

    
    FSover2 = 8000;
    Filters = [ 800 ];
    TAPS = [ 256 ];
    WIDTH = 200;
    .
    .
    b = fir1(TAPS(j),[(Filters(i)/FSover2 - WIDTH/FSover2) (Filters(i)/FSover2 + WIDTH/FSover2)]);
    .
    .
    .
    fprintf(fid,' %6.10f,\n',b(k));
    .
    . 
    


    2. lub funkcji remez():

    
    Fs=8000; fp=500; fz=800; TAPS = 256;
    [n,fo,mo,w]=remezord( [fp fz], [1 0], [0.01 0.1], Fs );
    b = remez(n,fo,mo,w);
    .
    . 
    


    dzięki tym zabiegom powstało coś takiego:
    http://wisnia.server.pl/fir/myfir.h

    co jak widać, w matlabie wygląda bardzo ładnie:
    http://wisnia.server.pl/fir/myfir.jpg

    ale niestety - po podstawieniu mojego fir.h (na jakie f by nie był) za "fabryczny-przykładowy" fir.h, filtr zaczyna przepuszczać całe pasmo ! nawet jeśli nie używam funkcji fir(), a własnego algorytmu FIR, dzieje się to samo:

    1. "fabryczne" współczynniki - filtr działa
    2. "matlabowe" współczynniki - filtr przepuszcza całe pasmo

    nie wiem, co robię źle, bo według tego co udało mi się wyguglać, moje współczynniki powinny działać. czy ktoś robił coś podobnego ? na co zwrócić uwagę ?

    próbowałem zmieniać częstotliwości, pasma, f nyquista, f próbkowania, ilości współczynników, dodawać zera, cudować... nic.

    Pomóżcie proszę !
  • REKLAMA
  • #2 3997210
    Xitami
    Poziom 29  
    Pomnóż współczynniki filtru przez jakie okno, np.
    Blackman'a: $$0.42-0.5cos\left({2\pi i\over N}\right)+0.08\cos\left({4\pi i \over N}\right)$$
  • REKLAMA
  • #3 3997393
    sq2gn
    Poziom 11  
    Jakie przyjąć N ?
  • #4 3997644
    Xitami
    Poziom 29  
    N=NUM_TAPS, $$0\leq i<N$$
    ------------------------------------------
    Chyba nie chodzi o to.
    Narysowałem sobie współczynniki (wyglądają OK), odpowiedź częstotliwościowa wydaje się też być OK.
    Jedyne co zauważyłem to, że oryginalny filtr w paśmie przepustowym ma wzmocnienie równe 0.5, a Twój filtr blisko 1. Ale dla zmiennoprzecinkowego procesora nie powinno to być chyba problemem.
  • #5 3998022
    sq2gn
    Poziom 11  
    Próbowałem wygenerować współczynniki używając matlabowego sptool - jest tam coś takiego jak Kaiser Window FIR. Oczywiście nie działają.

    Co to za czort, te współczynniki przykładowe ?!

    Spójrz, jak wygląda zestaw współczynników, który zamienia 21061 w filtr dolnoprzepustowy 3 kHz:

    http://wisnia.server.pl/fir/fir-1.h

    JEDEN współczynnik równy 0.5 i 255 zerowych !!! I to działa ! W przeciwieństwie do tych "matlabowych" !
  • REKLAMA
  • #6 3998097
    Xitami
    Poziom 29  
    podziel swoje współczynniki przez 2
  • #7 3998234
    sq2gn
    Poziom 11  
    nie działa :(
  • #8 3998615
    Xitami
    Poziom 29  
    Pliki "fir.h", "fir-1.h", "myfir.h" znajdują się w tym samym katalogu (i tylko tam).
    Dałeś "bp.c" niezmodyfikowane. Rozumiem, że dla różnych filtrów zawsze kompilujesz to samo "bp.c", a modyfikujesz tylko wiersz #include "fir.h".
  • REKLAMA
  • #9 3998718
    sq2gn
    Poziom 11  
    od dłuższego czasu w bp.c wpisałem:

    
    #define NUM_TAPS 256
    
    float pm coeffs[256] = 
    {
    #include "fir.h"
    }
    


    I NIC nie zmieniam w pliku bp.c. Oryginalne pliki - działające - fir-1, fir-2.. mają po 256 współczynników. zmieniam tylko nazwę na fir.h i działa.

    gdy za pomocą matlaba zapisuję wygenerowane przeze mnie 256 współczynników do pliku fir.h i rekompiluję całość, nie działa.
  • #10 4008455
    Xitami
    Poziom 29  
    I jak tam? powiedz do czego doszedłeś. Robiłeś tak jak pisałem poprzednio?
REKLAMA