Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF

Kubald 28 Sty 2013 00:13 18483 3
  • Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF

    Algorytm Goertzela jest dobrze znanym w dziedzinie cyfrowego przetwarzania sygnałów. Służy on do określania, czy dany sygnał zawiera pewną częstotliwość lub kilka częstotliwości. Algorytm jest popularny ze względu na małą ilość obliczeń, konieczną do jego wykonania, w porównaniu z np. dyskretną czy szybką transformatą fourierowską; można go stosować z powodzeniem zwłaszcza, gdy potrzeba wykryć małą ilość częstotliwości.

    Taki algorytm jest implementowany m.in. w urządzeniach do detekcji sygnałów DTMF, automatycznych stroikach do gitar czy w momencie konieczności wykrycia konkretnej/-ych częstotliwości w sygnale audio.

    W projekcie autor używa procesora PIC18F4520 z programem wykorzystującym algorytm Goertzela do dekodowania sygnałów DTMF. Kod dla procesora został w całości napisany w języku C.

    Aby wytłumaczyć zasadę działania algorytmu, autor posługuje się przykładami z wykorzystaniem okręgu jednostkowego płaszczyzny zespolonej (pokazanego poniżej).

    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF

    Zwykle do detekcji sygnałów DTMF wykorzystuje się określoną częstotliwość próbkowania, wynoszącą 8000 Hz. W projekcie autor zdecydował się jednak na 5908 Hz, co zostanie wyjaśnione później.

    Jeśli założymy, że system ma dwa sprzężone bieguny (sprzężone, ponieważ to bezwarunkowo ruguje część zespoloną i czyni implementację algorytmu możliwą w świecie mikrokontrolerów pracujących na liczbach rzeczywistych) położone na okręgu jednostkowym, to jego wyjście będzie stanowił ostry pik odpowiadający konkretnej częstości.

    Częstotliwość próbkowania 5908 Hz leży w punkcie 2π radianów koła jednostkowego. Ponadto, częstości położone za pi na kole jednostkowym są większe niż połowa częstości próbkowania i stąd nie spełniają postulatu Nyquista o częstości próbkowania i nie będą podlegały rozważaniom. Sygnały DTMF są kodowane z wykorzystaniem następujących częstości: 697, 770, 852, 941, 1209, 1336 i 1477 Hz. Aby umieścić częstotliwość 697 Hz na z-płaszczyźnie okręgu jednostkowego, należy dokonać przekształcenia:
    5908 Hz odpowiada 2π
    Więc 697 Hz odpowiada (2π/5908) * 697 = 0,74126 rad.
    Dokonując przekształcenia dla każdej z częstotliwości otrzymuje się odpowiednio wartości 0,74126; 0,81889; 0,90610; 1,00713; 1,28577; 1,42080 oraz 1,57079 radiana.

    Jeśli więc na okręgu jednostkowym umieścić dwa bieguny sprzężone odpowiadające częstotliwości 697 Hz oraz dwie wartości zerowe w początku koła, dochodzi się do poniższej sytuacji:

    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF

    i odpowiadającym jej funkcjom przejścia:
    $$\frac{(z-0)(z-0)}{(z-e^{\imath0,74126})(z-e^{-\imath0,74126)}$$

    Aby powyższą funkcję uczynić uniwersalną w dziedzinie częstości, wartość 0,74126 zastąpi symbol Θ:
    $$\frac{(z-0)(z-0)}{(z-e^{\imath\theta})(z-e^{-\imath\theta)}$$, co jest równoważne:

    $$\frac{z^2}{z^2-ze^{-\imath\theta}-ze^{\imath\theta}+1}$$.

    Korzystając z wzoru Eulera podstawia się:
    $$e^{\imath\theta}=\cos\theta+\imath\sin\theta$$ oraz
    $$e^{-\imath\theta}=\cos\theta-\imath\sin\theta$$ i uzyskuje równanie postaci:

    $$\frac{z^2}{z^2-z\cos\theta-z\imath\sin\theta-z\cos\theta+z\imath\sin\theta+1}$$ co jest równoznaczne z:

    $$\frac{z^2}{z^2-2z\cos\theta+1}=\frac{out}{inp}$$.

    Mnożąc mianownik i licznik przez $$z^{-2}$$ otrzymuje się zależność:
    $$\frac{1}{1-2z^{-1}\cos\theta+z^{-2}}=\frac{out}{inp}$$ i podstawiając za $$z^{-1}$$ wartość odpowiadającą jednemu opóźnieniu, a za $$z^{-2}$$ wartość odpowiadającą dwu opóźnieniom otrzymuje się równania:

    inp = out – 2cosΘ * prev_out + prev_prev_out
    out = inp + 2cosΘ * prev_out + prev_prev_out

    które są podstawą implementacji algorytmu. Wartość „2cosΘ” nazywana jest „współczynnikiem” i jest wyliczona dla odpowiednich częstości sygnałów DTMF: 1,4752; 1,3660; 1,2336; 1,0685; 0,5623; 0,2988 oraz 0,0. Jak widać, częstości 1447 Hz odpowiada współczynnik równy 0, co znacznie ułatwia obliczenia w czasie jej wykrywania i tłumaczy obranie częstości próbkowania równej 5908 Hz. W programie mikrokontrolera współczynniki algorytmu umieszczone są w sekcji „#define” w pliku „DTMF.h”. Aby przyspieszyć obliczenia, zrezygnowano ze stosowania zmiennych zmiennoprzecinkowych – współczynniki zostały przemnożone przez 256 i przechowywane są jako liczby całkowite. Rezultat algorytmu dzielony jest przez 256, aby uzyskać właściwy wynik.

    Algorytm pracuje na pewnej liczbie próbek uzyskanych za pomocą przetwornika A/D. Autor obrał tę liczbę na 100 próbek – aby znaleźć złoty środek pomiędzy czasem obliczeń a rozdzielczością detekcji.

    Wartość dla pasma poddawanego wykrywaniu wyliczana jest następująco:
    prev_prev_out² + prev_out² - (coeff * prev_prev_out * prev_out) i jeśli jest większa, niż zadany próg, oznacza to, że dana częstotliwość obecna jest w badanym sygnale. Dla łatwiejszego zrozumienia działania algorytmu autor przygotował arkusz kalkulacyjny, dostępny na stronie źródłowej.

    Testy przeprowadzono z wykorzystaniem procesora PIC18F4520, próbkując sinusoidę. Częstość próbkowania była ustalona przy pomocy Timera 3. Częstość próbkowania musi zostać bardzo dokładnie wyznaczona, aby zapobiec przekłamaniom w działaniu algorytmu. Na poniższych wykresach można zobaczyć spróbkowane sygnały 1 kHz, 400 Hz oraz 200 Hz przy częstości próbkowania 8 kHz.

    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF
    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF
    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF

    Aby połączyć z przetwornikiem A/D linię telefoniczną autor wykorzystał transformator audio o przełożeniu 1:1 i impedancji 600Ω. Schemat całości można zobaczyć poniżej. Wzmacniacze LM358 pracują jako: źródło napięcia 2,5 V oraz wzmacniacz sumujący, aby uniknąć podawania na przetwornik wartości ujemnych napięcia.

    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF
    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF

    Na poniższych oscylogramach można zobaczyć przebiegi i transformaty sygnałów odpowiadających naciśnięciom klawiszy 1, 2, 3 i 7.

    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF
    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF
    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF
    Wykorzystanie algorytmu Goertzela do detekcji sygnałów DTMF

    Zalety stosowania algorytmu Goertzela są następujące: nie ma konieczności stosowania gotowych układów (jak np. MT8870 czy TP5089) i zewnętrznych oscylatorów, algorytm może działać wstecznie i służyć również do generowania sygnałów DTMF, algorytm może być użyty do wykrywania jakichkolwiek częstotliwości (nie tylko sygnałów DTMF), a jego implementacja to dobry wstęp do dziedziny cyfrowego przetwarzania sygnałów.

    Opisane rozwiązanie posiada też kilka wad: nie są wykrywane drugie harmoniczne sygnałów DTMF (jak ma to miejsce w komercyjnych układach i zmniejsza szanse na zafałszowane wyniki detekcji), algorytm może też generować fałszywe wykrycia, jeśli sygnał zawiera dodatkowe, blisko położone względem szukanej częstotliwości, piki (niedogodność tą można wyeliminować, stosując apodyzację. Dodatkowo, należy pamiętać o wydajności MIPS stosowanego procesora – dla tak zaprojektowanego algorytmu wymagana jest wydajność rzędu co najmniej 5,55 MIPS.

    Na poniższym filmie można obejrzeć działanie gotowego urządzenia z zaimplementowanym algorytmem.

    Link


    Na stronie źródłowej dostępny jest wzmiankowany arkusz kalkulacyjny oraz kod dla procesora.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • #2
    miszcz310
    Poziom 19  
    Powiem, że wszystko fajnie i spoko, tylko wszystkie zdjęcia maja rozdzielczosć ikonek. Nie dałoby się tego poprawić?
  • #3
    coberr
    Poziom 19  
    niestety oscyloskopy RIGOL robią wlasnie takie malutkie zrzuty : 320x234 pikseli :)
    Zawsze możesz zapisac jako obrazek i powiększyc - np. w IrfanView...

    Szału ni ma ale cos zobaczysz :)
  • #4
    miszcz310
    Poziom 19  
    O! Dzięki za odpowiedź. Powiem szczerze, że jakbym wrzucał coś takiego w sensie wykresy to bym zrobił wykres jakoś wektorowo. W sensie np. plik txt z danymi i potem jakiś gnuplot albo w ogóle coś LaTeXa, bo tak to nic w sumie nie widać. :P
    Ale rozumiem, że to tylko zależy od autora w Indiach a nie od kolegi tłuczmacza.