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

Projektowanie filtrów cyfrowych

grzesio1 06 Maj 2004 01:06 10356 9
  • #1 627774
    grzesio1
    Poziom 2  
    Czy zna ktoś program, który służy do projektowania filtrów cyfrowych, a który potrafi przy okazji wygenerować odpowiedni kod np. w C. Program "Filter Solutions" ma taką opcje, ale niestety tylko w pełnej wersji, której nigdzie nie mogę znaleźć.
  • #2 628535
    grzesio1
    Poziom 2  
    Przepraszam za pomyłkę „Filter Solutions 10.0” generuje jednak kod w C tylko wcześniej to przeoczyłem. Polecam wszystkim ten program. Wersja testowa 10 dniowa dostępna pod adresem: www.filter-solutions.com/download.html
  • #3 658912
    sztyber
    Poziom 11  
    Czy koniecznie chcesz użyć do tego DSP ?
    W układach programowalnych Altery masz dodatkowe bloki w Max Plusie i w jednym z nich jest moduł filtrów. Definiujesz f rezonansową , szerokośc pasma i stromosć zboczy - dodatkowo wybierasz jakiego typu ma być filtr czyli Czebyszew .... itp.
  • #5 880734
    zysiu
    Poziom 14  
    Jestem poczatkujacy w dziedzinie zabawy z DSP, wiec wybaczcie jezeli moj problem okaze sie lamerski :) Projektuje filtr cyfrowy Chebyshev I na ukladzie ATmega 128. Filtr antyaliasingowy itd. opanowalem. Wygenerowalem odpowiedni kod za pomoca programu Filter Solutions, który znajduje sie ponizej:
    float DigFil(float invar, float initval, int setic)
    //float invar, initval; int setic;
    /******************************************************************************/
    /* Filter Solutions Version 10.0                 Nuhertz Technologies, L.L.C. */
    /*                                                            www.nuhertz.com */
    /*                                                            +1 602-206-7781 */
    /* 4th Order Low Pass Chebyshev I                                             */
    /* Bilinear Transformation with Prewarping                                    */
    /* Sample Frequency = 32.50 KHz                                               */
    /* Standard Form                                                              */
    /* Arithmetic Precision = 4 Digits                                            */
    /*                                                                            */
    /* Pass Band Frequency = 500.0 Hz                                             */
    /* Pass Band Attenuation = 20.00 dB                                           */
    /* Pass Band Ripple = 1.000 dB                                                */
    /*                                                                            */
    /* Stop Band Ratio = 0.7426                                                   */
    /* Stop Band Frequency = 371.3 Hz                                             */
    /* Stop Band Attenuation = 24.31 dB                                           */
    /*                                                                            */
    /******************************************************************************/
    /*                                                                            */
    /* Input Variable Definitions:                                                */
    /* Inputs:                                                                    */
    /*   invar    float       The input to the filter                             */
    /*   initvar  float       The initial value of the filter                     */
    /*   setic    int         1 to initialize the filter to the value of initvar  */
    /*                                                                            */
    /* There is no requirement to ever initialize the filter.                     */
    /* The default initialization is zero when the filter is first called         */
    /*                                                                            */
    /******************************************************************************/
    /*                                                                            */
    /* This software is automatically generated by Filter Solutions.  There are   */
    /* no restrictions from Nuhertz Technologies, L.L.C. regarding the use and    */
    /* distributions of this software.                                            */
    /*                                                                            */
    /******************************************************************************/
    
    {
        float sumnum, sumden;  int i;
        static float delay[5] = {0.0,0.0,0.0,0.0,0.0};
        static float znum[5] = {
            3.035e-07,
            1.214e-06,
            1.821e-06,
            1.214e-06,
            3.035e-07
        };
        static float zden[4] = {
            .9397,
            -3.813,
            5.807,
            -3.934
        };
        
        if (setic==1)
        {
            for (i=0;i<=4;i++) 
            	delay[i] = 2.06e+05*initval;
            return initval;
        }
        
        else
        {
            sumden=0.0;
            sumnum=0.0;
            for (i=0;i<=3;i++)
            {
                delay[i] = delay[i+1];
                sumden += delay[i]*zden[i];
                sumnum += delay[i]*znum[i];
        	}
        delay[4] = invar-sumden;
        sumnum += delay[4]*znum[4];
        return sumnum;
        }
    }

    Czestotliwosc probkowania sygnalu wynosi 32.5kHz. Wykorzystalem do tego jeden z Timerow w ATmedze, ktory generuje mi przerwanie i w nim pobieram wartosc z przetwornika ADC. Wywoluje funkcje DigFil i obrabiam pierwsza probke sygnalu, ktora pozniej kieruje na przetwornik DAC. Moje pytanie brzmi: do czego sluza parametry initvar i setic? Bo mimo usilnych staran filtr nie chce wspolpracowac :( czy trzeba je jakos ustawiac po pierwszej obrobionej probce?
    Ponizej fragment kodu obslugi przerwania Timera:
    
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    
     	   	TIMSK=0x00;			                 // stop timer 
     	   	OCR0=ceil(DigFil(read_adc(0), 0, 0));       // send to DAC 		    
     	   	TIMSK=0x01;			                // start timer 			
    }
    
  • #6 890623
    Paweł Es.
    VIP Zasłużony dla elektroda
    Coś mi wygląda, że te deklaracje tablicy delay trzeba wyciągnąć przed
    funkcję filtru albo zrezygnować z nadawania wartości w deklaracji i inicjować wywołaniem

    void DigFil (0,0,1) - przy inicjalizacji.

    Obecnie przy każdym wejściu jest zerowana tablica delay i filtr nie działa
    Normalnie obliczenie następnej próbki wykorzystuje wartości z delay obliczone w poprzedniej iteracji.

    Jeżeli setic=1 to następuje ustawienie wartości w linii opóźniającej (delay) na wartości wynikające z initvar. Prawdopodobnie można tym skrócić (?) stan przejściowy filtru.

    Jeżeli setic<>1 to wykonywana jest iteracja kroku filtracji.
    Czyli dla normalnej pracy powinno się wywoływać:

    Y=DigFil(X,0,0);
  • #7 905549
    Dx2
    Poziom 13  
    Witam.

    Osobiście mam pewne wątpliwości czy ten program zdąży się wykonać na ATmedze przy takiej szybkości próbkowania. Być może brakuje ci mocy obliczeniowej i sie przywiesza.

    Pozdrawiam
  • #8 918955
    Jasiex
    Poziom 13  
    witam !
    co do szybkości to można jeszcze coś poprawić - dla kilku elementów tablicy nie warto angażować pętli, ponieważ to wymusza sprawdzanie warunku -wartości licznika indeksującego tę tablicę. Zamiast tego oczywistym jest dla każdego elementu tablicy pisać osobny kod :-) (chyba że tablica jest dłuuuuuuugggaaa).
  • #9 923837
    Tomcio888
    Poziom 14  
    PC DSP to chyba to co ci trzeba
  • #10 6033581
    eleproject

    Poziom 17  
    Posiadam wersję Filter Solutions 10.0.8 Trial Version i mam dwa pytania:
    1. W jaki sposób uzyskać kod w C za pomocą tego programu? Nie wiem jak to zrobić. Może wersja Trial na to nie pozwala?
    2. A drugi problem to taki, że nie da się wybrać opcji filtru pasmowoprzepustowego podczas projektowania filtru FIR o oknach sinus lub cosinus. Tego się nie da policzyć czy może właśnie trialowa wersja na to nie pozwala. Możliwe jest zaprojektowanie filtrów dolnoprzepustowych FIR sin i cos.
REKLAMA