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

Implementacja w C filtrów IIR projektowanych w Simulink'u

Matyk 15 Mar 2007 08:41 2165 3
  • #1 3679945
    Matyk
    Poziom 11  
    Witam

    Jak w temacie.... Chciałbym zaimplementować na uC trzy proste filtry cyfrowe. uC to nie jakiś tam DSP uP tylko zwykła Atmega16 ale z trzema filtrami powinna sobie dać radę (nie musi filtrować w czasie rzeczywistym).
    Do zaprojektowania filtrów wybrałem Simulinka a w nim DSP Blockset i Digital Filter Design ponieważ go mam i jest prosty w obsłudze, a ponadto od razu widzę jak się filtr zachowuje (charakterystyki).
    I tu pojawia się mój problem. Po zaprojektowaniu filtra otrzymuje trzy wartości licznika i trzy wartości mianownika. Np. Dla filtru IIR bandpass 2giego rzędu (fs=2000, fc1=175 fc2=200) otrzymuję:

    Numerator:
    0.0378047541709
    0.0000000000000
    -0.0378047541709
    Denominator:
    1.000000000000
    -1.601306765501
    0.9243904916582


    Co dalej... szukałem w pomocy ale nie znalazłem (może szukać nie umiem :(). Potrzebuje teraz doprowadzić to do postaci prostego równania które mógłbym już w c zastosować

    Przykład:

    y[n]=b[0]*x[n]+b[1]*x[n-1]+b[2]*x[n-2]+a[1]*y[n-1]+a[2]*y[n-2]


    ale nie wiem jak (które gdzie). Przypuszczam tylko że w miejsce współczynników a[x] i b[x] trafią ilorazy liczb wygenerowanych w simulinku.
  • #3 3680162
    Matyk
    Poziom 11  
    Bardzo fajny programik, aczkolwiek generowany przez niego kod wymaga sporej adaptacji dla mikrokontrolera. Pobawię się z tym najwcześniej w piątek

    Gdybym miał takie równanie jak wcześniej pisałem mógł bym maksymalnie zoptymalizować sobie kod (np. dla zerowych współczynników usunąć pewne obliczenia, choć takie rzeczy to w sumie robi za mnie kompilator) i napisać go według swoich potrzeb.

    Szukam czegoś takiego(znaleziono w: http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt):

    The most straight forward implementation would be the "Direct Form 1"
    (Eq 2):
    
        y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2]
                            - (a1/a0)*y[n-1] - (a2/a0)*y[n-2]



    tylko dla Simulinka Bo chyba to jest mi potrzebne.
  • #4 3680505
    kris_gor
    Poziom 17  
    Matyk napisał:
    Bardzo fajny programik, aczkolwiek generowany przez niego kod wymaga sporej adaptacji dla mikrokontrolera. Pobawię się z tym najwcześniej w piątek



    Dla mnie największą zaletą tego programu jest to, że może wygenerować współczynniki całkowite (nie zawsze!!) co akurat w małych procesorkach
    ma dość duże znaczenie i nie trzeba wiele kombinować.
REKLAMA