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

Equalizer na procesorze DSP

fulinstrumentale 23 Lut 2006 15:40 3170 13
  • #1 2338245
    fulinstrumentale
    Poziom 11  
    Witam wszystkich!

    Chciałbym zrobić 7-pasmowy equalizer. Ogólnie nie wiem jeszcze na jakiej płytce, ale widzę to tak. Mam do dyspozycji wyświetlacz LCD, 5 przycisków i jakiś procesor (np. Blackfin Analog Device). Każdy przycisk reprezenowałby sobą konkterny preset (np. 1szy przycisk - FLAT, 2gi - ROCK, 3ci - CLASSIC itd). Chodzi mi o to czy dobrze rozumuje borąc taką ideę działania tego projektu.

    Na wejście podaje sygnał. Na wyjściu będzie suma 8 sygnałów. Niezmienionego sygnału wejściowego i 7 sygnałów wejściowych, z których każdy przejdzie przez filtr pasmowoprzepustowy o częstotliwościach (dla częstotliwości próbkowania 44,1 kHz : 60, 150, 400, 1000, 2400, 6000, 15000 Hz). Oczywiście każdy z tych 7 sygnałów przefiltorwanych będzie miał swoje wzmocnienie. I tak jak wzmocnienia będą wszystkie 0 to na wyjściu będziemy mieli sygnał wejściowy (preset FLAT), jak włączymy inny preset to zmieniane będą poszczególne wzmocnienia.

    Później będę musiał z sygnału wyjściowego zrobić FFT i wyświetlić to na LCD najlepiej w formie słupków takich jakie są w prawie każdej wieźy z korektorem graficznym.

    Jeżeli uważacie, że idea jest kiepska albo w ogóle się nie nadaje to dajcie mi znać :) a jeżeli uważacie, że projekt jest ciekawy to pomóżcie, bo może ktoś z Was robił coś takiego i mógłby mi pomóc swoim doświadczeniem.

    Serdecznie pozdrawiam,
    Marcin.
  • #2 2343340
    And!
    Admin grupy Projektowanie
    Wszytko dobrze alle np. w przypadku filtru FIR musisz przyjąć trochę inną strategie jeżeli chodzi o przepływ sygnału.
    W takim filtrze sygnał cyfrowy będzie przechodził przez kolejne ogniwa, a nie przez kolejne filtry (analogowe). Także jeden filtr FIR o odpowiednio dużej ilości ogniw ukształtuje charakterystykę przenoszenia częstotliwości.

    Najszybciej zadziała IIR (mniej ogniw) ale trudniej go zaprojektujesz.
    FIR będzie działał nieco wolniej (liczba ogniw podstawowej struktury 2x większa niż pasm) ale znacznie łatwiej go zaprojektujesz.
  • #3 2349057
    fulinstrumentale
    Poziom 11  
    Witam!
    Mówisz o projektowaniu filtru, ale w sensie fizycznego zaprojektowania czy wygenerowania dla odpowiedniego filtru współczynników? Do tej pory miałem do czynienia z DSP zintegrowanymi w tzw. płytki uruchomieniowe (Microchip dsPICDEM 1.1 i Analog Device Blackfin BF533) i na obydwu wykonywałem prostą filtrację sygnału używając dołączonych przez producentów bibliotek specjalnie pisanych na potrzeby przetwarzania sygnału. Tak więc jeżeli jest mowa o projektowaniu filtru to nie będę tego wykonywał fizycznie tylko programowo.

    W środę dostanę od prowadzącego wiadomość o tym na jakim sprzęcie będę robił projekt więc wtedy zacznę już coś robić i zacznę zadawać Wam pewnie mnóstwo pytań :)

    Pozdrawiam serdecznie,
    Marcin
  • #4 2365699
    fulinstrumentale
    Poziom 11  
    Niestety uczelnia nie może mi udostępnić teraz płytki, na której będę robił projekt, ale mam w każdym razie teraz w domu startowy zestaw Analog Device ADSP BF 533.

    Czy ktoś bawił się tym zestawem? Spróbuję zacząć coś robić na nim, przede wszystkim zobaczyć w jaki sposób próbki sygnału są przesyłane między procesorem a kodekiem, który tam jest. Później spróbuję zaimplementować jakiś filtr i zobaczę czy działa. Jeśli tak to prześle Wam wycinek programu przetwarzającego dźwięk i poproszę Was o pomoc w jaki sposób zaimplementować kilka filtrów działających równolegle.

    I jeszcze mam 2 pytania:
    1. czy jest sens ustawiać kodek na 96 kHz? czy wystarczy 44,1 kHz? czy filtr sobie poradzi z fp = 96 kHz?
    2. gdzie generujecie współczynniki do filtrów? w MATLABie czy znacie jakiś inny lepszy program?

    Pozdrawiam,
    Marcin
  • #5 2376879
    And!
    Admin grupy Projektowanie
    Szybsze próbkowanie wymusi znacznie większą wydajność filtru, zależy ile twój DSP może mnożyć float na sekunde.

    Programy do liczenia wsp. FIR i IIR szukaj w google, jeżeli chodzi o FIR to wystarczy że zrobisz IDFT z wartości tłumienia/wzmocnienia na kolejnych pasmach.
  • #6 2436341
    fulinstrumentale
    Poziom 11  
    Witam wszystkich ponownie, przepraszam za długą przerwę, ale mam dużo zajęć ostatnio...

    Otóż na razie dla ładnego efektu uruchomiłem sobie diody i zrobiłem na nich zwykły tzw. bargraph. Następnie jednym z przycisków włączam lub wyłączam filtr FIR, ale niestety o współczynnikach znalezionych gdzieś w necie...
    Filtrację przeprowadzam używając funkcji danej przez producenta ->

    void fir(const fract16 x[],fract16 y[],int n,fir_state_fr16 *s);

    Oczywiście poprzedzone jest to inicjalizają filtru ->

    fir_init(state, coeffs, delay, ncoeffs, index)

    I tu zaczyna się mój problem, współczynniki muszę mu zadać w formacie 16 bitowego fractional i w postaci heksadecymalnej. Czy znacie program generujący współczynniki filtru w takiej postaci czy raczej muszę sam napisać sobie funkcję zmieniającą dane typu float (bo programy, które ja mam taki format dają) na fract16 i później jeszcze na heksadecymalne?

    Pozdrawiam,
    Marcin
  • #7 2436457
    And!
    Admin grupy Projektowanie
    Nieznam programu który daje wsp w czymś innym inż float,
    niektóre umożliwiają dodanie ew mnożnika dla każdego wsp ew zmiana formatu wyświetlania.
  • #8 2436712
    fulinstrumentale
    Poziom 11  
    No właśnie z tym mam problem, chyba że napisałbym swoje funkcje do filtrowania używające danych w formacie float, ale skoro mam już gotowe i na pewno zoptymalizowane pod względem szybkości działania to chyba lepiej będzie posiedzieć nad tym żeby zamienić float na fract16.

    I chyba coś znalazłem, funkcja nie jest zbyt skomplikowana i chyba załatwi mi sprawę, podam tylko tablicę współczynników do zmiany i gotowe, mam nadzieję że komuś oprócz mnie się to przyda.

    Pozdrawiam,
    Marcin
  • #9 2456034
    fulinstrumentale
    Poziom 11  
    Ok, trochę się pobawiłem i mogę powiedzieć, że mam jakieś podwaliny pod equalizer.
    Po pierwsze nareszcie mam te współczynniki w formacie 1.15, co robię w ten sposób:
    -----------------------------------------------------------
    float coeff[ILOSC_WSP]={
    #include "dolne.dat"
    };

    fract16 convcoeff[ILOSC_WSP];

    for(i=0;i<ILOSC_WSP;i++){
    convcoeff[i] = float_to_fract16(coeff[i]);
    }
    -----------------------------------------------------------
    Na podstawie tych współczynników przeprowadzam filtrację sygnału przychodzącego(sygnał przefiltrowany jest przechowany w zmiennej OUTkanal0lewy/prawyLP):
    -----------------------------------------------------------
    fir_init(state, convcoeff, ldelay,ILOSC_WSP , 1);
    _fir(INkanal0lewy, OUTkanal0lewyLP, ILOSC_SAMPLInaKAN, &state);
    fir_init(state, convcoeff, rdelay,ILOSC_WSP , 1);
    _fir(INkanal0prawy, OUTkanal0prawyLP, ILOSC_SAMPLInaKAN, &state);
    ------------------------------------------------------------
    A później już tylko dodaje go do sygnału wejściowego z odpowiednim współczynnikiem:
    ------------------------------------------------------------
    for (i=0; i<ILOSC_SAMPLInaKAN; i++){

    iTxBuffer1[j+INTERNAL_DAC_L0+wskaznik_wyjscie] = INkanal0lewy[i]+0.3*OUTkanal0lewyLP[i];
    iTxBuffer1[j+INTERNAL_DAC_R0+wskaznik_wyjscie] = INkanal0prawy[i]+0.3*OUTkanal0prawyLP[i];
    }
    ------------------------------------------------------------
    I teraz mam pewien problem, bo na razie to sobie podbijam basy czyli mam jeden zestaw współczynników, ale jeżeli chciałbym sobie zrobić przynajmniej 7-pasmowy equalizer to tych wszystkich operacji będzie 7 razy więcej.
    Moje pytanie brzmi: czy macie inne pomysły jak to zrobić bardziej efektywnie? bo boje się, że procesor w pewnym momencie nie będzie w stanie robić tego wszystkiego w czasie rzeczywistym.

    Pozdarwiam!
    Marcin
  • #10 2476551
    fulinstrumentale
    Poziom 11  
    Witam!
    Nikt nie ma innego pomysłu?

    Mam do Was pytanie, na razie ograniczę się do 3-pasmowego equalizera czyli dolne częstotliwości będę wycinał filtrem dolnoprzepustowym, średnie pasmowym, a wysokie górnoprzepustowym. Czy ilość współczynników dla każdego z tych filtrów musi być taka sama, a jak są różne to czy na cokolwiek to wpłynie. I jeszcze jedno: jakie częstotliwości graniczne ustalić przy projektowaniu tych trzech filtrów (częstotliwość próbkowania jest 48 kHz).

    Pozdrawiam,
    Marcin
  • #11 2482355
    And!
    Admin grupy Projektowanie
    Trzypasmowy EQ można zrobić na jednym filtrze FIR o 9 ogniwach.
    Tylko przy takiej FS rozkład częstotliwości będzie trochę nienaturalny.
    To rozbijanie na filtry dolno środkowo itp według mnie nie jest dobrym pomysłem.
  • #12 2482584
    przemas25
    Poziom 1  
    Czy zna ktoś program, który służy do projektowania filtrów NOI, umożliwiający wygenerowanie i odczyt współczynników filtru a1,a2.... b0,b1...? Z góry dziękuje za propozycję.
  • #13 2492121
    fulinstrumentale
    Poziom 11  
    Witam!
    Po pierwsze podaje kilka linków związanych z projektowaniem IIR:

    http://cnx.org/content/m10623/latest/
    http://ptolemy.eecs.berkeley.edu/eecs20/week14/best.html
    http://haskelldsp.sourceforge.net/doc/DSP.Filter.IIR.Design.html
    http://www.dsptutor.freeuk.com/IIRFilterDesign/IIRFilterDesign.html
    https://www.elektroda.pl/rtvforum/topic396686.html

    poza tym wystarczy wpisać "IIR design" w google, a co do programu to ja korzystałem do tej pory z programu dsPIC ilter Design Lite firmy bodajże Momentum Data Systems, a teraz po zwolnieniu miejsca na dysku będę używał MATLABA, który chyba jest najlepszy do projektowania filtrów.

    Szczerze powiem Ci And!, że nie bardzo wiem jak dojść od pomysłu 9 ogniw do samych współczynników takiego filtru, w sumie jakbym miał pożądaną chtykę częstotliwościową filtru to mógłbym zrobić odwrotnego Fouriera i te wartości potraktować jako współczynniki dla mojego FIRa, stymże (wybaczcie być może głupie pytanie) nie bardzo wiem w jaki sposób otrzymać wartości próbek tej pożądanej chtyki częst. żeby podać ją na IDFT...?

    Pozdrawiam,
    Marcin
  • #14 2553111
    Xitami
    Poziom 29  
    Trzy pasma, czyli trzy „suwaki”, każdy może być w powiedzmy N położeniach.
    $$3^N*RozmiarLiczby*LiczbaStopni$$, dla N=10, RozmiarLiczby=2, LiczbaStopni=9, otrzymamy 54’000 bajtów, niby dużo, ale szeregowy EEPROMik jest tani.
    A może prawie dwa razy mniej, jeżeli filtr ma zerową fazę $$3^N*RozmiarLiczby*(LiczbaStopni-1)/2$$.
REKLAMA