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

Filtr IIR - struktura typu I i II DSP SHARC

kde 29 Lip 2006 12:33 2113 1
REKLAMA
  • #1 2861198
    kde
    Poziom 11  
    Witam!

    Zaimplementowałem filtr IIR typu I (Direct Form I) do DSP SHARC z określonymi współczynnikami. Wszystko działa tak jak powinno.
    Jednak jak wykorzystuje oryginalne kody dostępne na stronie Analog Devices, które bazują na filtrze IIR typu II (Direct Form II) i wstawiając te same współczynniki, filtr już nie działa jak powinien. Jest stabilny, nie wzbudza się, ale filtruje tylko dolne częstotliwości nawet jak jest typu HP. Nie wiem co jest przyczyną takiego zachowania.
    Współczynniki liczę w MATLABie i w sprawdzam w prostym programiku WinFilter i zawsze są takie same. Może przed wykorzystaniem w Direct Form II trzeba je jeszcze jakoś obrobić?
    Może ktoś z bawiących się SHARCami też mieli takie problemy.
    Bardzo proszę o pomoc.

    Pozdrawiam!
    kde
  • REKLAMA
  • #2 2936705
    kde
    Poziom 11  
    Witam!

    Rozwiązanie było prostsze niż przypuszczałem. Problem polegał na odpowiednim ustawieniu współczynników a przede wszystkim pomnożeniu współczynników "a" przez -1.

    Oto przykład:
    Po wygenerowaniu przez Matlaba współczynników(filter: lowpass, fs=48000,fc=1000,order=2):

    Discrete-Time IIR Filter (real)
    -------------------------------
    Filter Structure : Direct-Form II, Second-Order Sections
    Filter Order : 2
    Stable : Yes
    Linear Phase : No


    SOS matrix:
    1 2 1 1 -1.815341082704568 0.831005589346758
    Scale Factors:
    0.003916126660547
    1.000000000000000

    gdzie:
    b0 = 1
    b1 = 2
    b2 = 1
    a0 = 1
    a1 = -1.815341082704568
    a2 = 0.831005589346758

    Następnie należy współczynniki "a1" i "a2" pomnożyć przez "-1" resztę pozostawiamy tak jak są.
    Teraz możemy wstawić współczynniki do tablicy w następujący sposób:

    /* a2x_1, a2y_1, a1x_1, a1y_1, */
    /* b2x_1, b2y_1, b1x_1, b1y_1, */

    .var coef[SECTIONS*FRAMESIZE*4]=
    {-0.831005589346758,-0.831005589346758,1.815341082704568,1.815341082704568
    1.0,1.0,2.0,2.0}

    Oczywiście przed filtracją należy wejściową próbkę pomnożyć przez 0.003916126660547 czyli pierwszy argument Scale Factors.

    W ten sposób mamy zbudowany filtr IIR dla dwóch kanałów z tymi samymi parametrami.

    Algorytm filtru IIR pobrany został ze strony Analog Devices, napisany w asemblerze pod SHARC.

    Pozdrawiam!
    kde
REKLAMA