Witam! Niedawno miałem na forum temat n/t próbkowania i zapisu do tablicy sygnału sinusoidalnego. Gdy się z tym uporałem, wziąłem się za pisanie algorytmu Goertzela. Szukalem w sieci dużo. Między innymi ta biblia:
http://www.mstarlabs.com/dsp/goertzel/goertzel.html
a także ta:
http://www.eetimes.com/design/embedded/4024443/The-Goertzel-Algorithm
Koniec końców znalazłem jakąś implementację na PIC, przerobiłem ją na swoje potrzeby (przeliczenie stałych coeff i zapisanie ich w programie - po co liczyć to "na żywo" skoro można je stablicować? chyba, że w tym jest jakiś cel? ).
W zasadzie co do próbkowania niemam zastrzeżeń. Dla podawanego np. 1kHz mamy 8 punktów na okres sygnału czyli 8000/1000 = 8 (fsamplerate/freqsignal=x pkt). Dla potomnych, jak wygląda owa sprawa w Excelu po przesłaniu tablicy UARTEM:
Tablica docelowo dla prób posiada 100 elementów, w obliczeniach jest tak podstawiane do wzorów na K i na Coeff.
Jednak nurtuje mnie inne pytanie. Jak powinien się zachowywać wynik obliczeń (magnituda)w przypadku:
a)sygnału sinusoidalnego o poprawnej częstotliwości
b)sygnału sinusoidalnego ale o innej częstotliwości (poza pasmem bin width)
c)mowy, szumu i ogólnych zakłuceń
Co do pierwszego to zapewne magnituda odpowie gwałtownym wzrostem gdy zbliżamy się do częstotliwości zadeklarowanej, ale co w przypadku B i C?
Pytam ponieważ kod który napisałem, nie bardzo działa. Tzn, wiadomo, ADC bez sygnału podaje liczbę 512 - 520, magnituda wylicza się na 2052 i tak w sumie pozostaje. Gdy podaję teraz sygnał gwałtownie wzrasta do ok. 64 tysięcy, ale spada do wartości nie kiedy zerowych, czyli
początek sygnału 2052/2052/2052/11432/45322/55634/64533/34453/23453/1100/0/2300/2052/2052052 koniec sygnału
.Nie dziwiło by mnie to zachowanie gdyby nie fakt, że tak samo zachowuje się dla częstotliwości innej od zadeklarowanej, a z tego co wiem nie powinno być odpowiedzi tak znacznej (jakaś może być po to się deklaruje próg zadziałania by uzyskać odpowiednią energię). Załączam kod:
W zasadzie, nie wiem czy dobry dział, ale to podchodzi pod przetwarzanie sygnałów, bo jako takich problemów z programowaniem tegoż nie mam (tak mi się wydaje). Tu algorytm przerobiony dla jednego elementu w tablicy (element 0) dla częstotliwości 1124Hz. Proszę o jakąś podpowiedź, dlaczego tak się to zachowuje. Dziękuję za zainteresowanie. Pozdrawiam.
http://www.mstarlabs.com/dsp/goertzel/goertzel.html
a także ta:
http://www.eetimes.com/design/embedded/4024443/The-Goertzel-Algorithm
Koniec końców znalazłem jakąś implementację na PIC, przerobiłem ją na swoje potrzeby (przeliczenie stałych coeff i zapisanie ich w programie - po co liczyć to "na żywo" skoro można je stablicować? chyba, że w tym jest jakiś cel? ).
W zasadzie co do próbkowania niemam zastrzeżeń. Dla podawanego np. 1kHz mamy 8 punktów na okres sygnału czyli 8000/1000 = 8 (fsamplerate/freqsignal=x pkt). Dla potomnych, jak wygląda owa sprawa w Excelu po przesłaniu tablicy UARTEM:
Tablica docelowo dla prób posiada 100 elementów, w obliczeniach jest tak podstawiane do wzorów na K i na Coeff.
Jednak nurtuje mnie inne pytanie. Jak powinien się zachowywać wynik obliczeń (magnituda)w przypadku:
a)sygnału sinusoidalnego o poprawnej częstotliwości
b)sygnału sinusoidalnego ale o innej częstotliwości (poza pasmem bin width)
c)mowy, szumu i ogólnych zakłuceń
Co do pierwszego to zapewne magnituda odpowie gwałtownym wzrostem gdy zbliżamy się do częstotliwości zadeklarowanej, ale co w przypadku B i C?
Pytam ponieważ kod który napisałem, nie bardzo działa. Tzn, wiadomo, ADC bez sygnału podaje liczbę 512 - 520, magnituda wylicza się na 2052 i tak w sumie pozostaje. Gdy podaję teraz sygnał gwałtownie wzrasta do ok. 64 tysięcy, ale spada do wartości nie kiedy zerowych, czyli
początek sygnału 2052/2052/2052/11432/45322/55634/64533/34453/23453/1100/0/2300/2052/2052052 koniec sygnału
.Nie dziwiło by mnie to zachowanie gdyby nie fakt, że tak samo zachowuje się dla częstotliwości innej od zadeklarowanej, a z tego co wiem nie powinno być odpowiedzi tak znacznej (jakaś może być po to się deklaruje próg zadziałania by uzyskać odpowiednią energię). Załączam kod:
Kod: C / C++
W zasadzie, nie wiem czy dobry dział, ale to podchodzi pod przetwarzanie sygnałów, bo jako takich problemów z programowaniem tegoż nie mam (tak mi się wydaje). Tu algorytm przerobiony dla jednego elementu w tablicy (element 0) dla częstotliwości 1124Hz. Proszę o jakąś podpowiedź, dlaczego tak się to zachowuje. Dziękuję za zainteresowanie. Pozdrawiam.
