Transformacja Fouriera

Apr 18, 2004 18 Replies

Witam czy my¶licie, ¿e uda siê na jakim¶ najprostszym AVRku z przetwornikiem A/C zrobiæ szybk± transformacje Fouriera dla sygna³u o max czêstotliwo¶ci



16khz ? Chodzi mi o to czy moc obliczeniowa bêdzie wystarczaj±ca. Transformacja mia³a by mi pomóc w dekodowaniu sygna³u DTMF (to taki mój pomys³ ;). Mo¿e ma kto¶ jakie¶ kody w C tego typu transformat ? Druga sprawa ile miejsca w pamiêci mo¿e zaj±æ kod ?

U¿ytkownik "Tranzystor" snipped-for-privacy@tranzystor.pl napisa³ w wiadomo¶ci news:c5u824$5cp$ snipped-for-privacy@atlantis.news.tpi.pl...

przetwornikiem

Pewnie siê uda. Ale jak to ma byæ do DTMF to zainteresuj siê algorytmem Goertzel'a. Jest tego sporo w sieci ³acznie z gotowcami na procesory TI i AD.

Andrzej Kamieniecki

Jaka chcesz miec rozdzielczosc, czyli ile probek ma podlega analizie? Aczkolwiek mocno watpie - za czasow moich studiow TSM320C10 (jakby nie bylo procesor sygnalowy) wyrabial sie z probkowanie pare Ks/s przy transformatach 1024 probki w real-time. Ale tak byly specjalne instrukcje i wiekszosc powierzchni krzemu stanowil uklad mnozacy. Po co zakladasz az 16kHz - telefony nie przenosza wiecej jak 3 z kawalkiem. Jak szybko zmienia sie kod DTMF - chyba nie musisz analizowac kazdy fragment sygnalu, tylko 'probkowac DTFM' kilka razy/s

Kod jest krociutki, tyle ze liczy na liczbach zespolonych i jeszcze troche trzeba na tablice sinusow (proporcjonalnie do dlugosci transformaty).

Krzysiek Rudnik

Ale do DTMF'a moim skromnym zdaniem nie potrzeba armaty w postaci FFT, a wystarczyloby kilka wyrazow ciagu z DFT. Po prostu zapamietujesz tablice sinusow dla czestotliwosci DTMF i przemnazasz zgodnie z podstawowym wzorem transformaty Fouriera. Czyli przy dobrej implementacji to wychodzi 16 mnozen na jeden odczyt z ADC plus jakies drobne obliczenia dla kazdej ramki... Jak ktos dobrze zauwazyl telefon to max 3 kHz a DTMFy sa zdaje sie troche nizej nawet...

Tomek

Te¿ siê nad tym zastanawia³em tak mi siê wydaje ¿e je¶li chodzi o rozdzielczo¶æ to 50Hz by wystarczy³o (choæ mog³o by siê to wi±zaæ czasem z b³êdnym dzia³aniem) ale przy za³o¿eniu ¿e ze sygna³ DTMF jest ci±g³y i w programie mo¿a napisaæ co¶ co sprawdza czy dana charmoniczna jest aktywna np. przez 200ms to w³a¶nie rozdzielczo¶æ na poziomie 50hz chyba by wystarczy³a, czyli to by by³y jakie¶ 32 próbki. A sam sygna³ który ma zostaæ poddany analizie, musia³ by byæ próbkowany oczywi¶cie z du¿o wiêksz± czêstotliwo¶ci± czyli powiedzmy jakie¶ 5khz. Dobrze my¶lê ?

Upss przecinka nie wstawi³em ;) chodzi oczywi¶cie o 1,6khz

Wydaje mi siê ¿e dobrze by by³o sprawdziæ co jest na wej¶ciu co 50ms i je¶li

4 razy bêdzie to samo (czyli aktywna ta sama harmoniczna, a w³a¶ciwie dwie) to zasygnalizowaæ to jako wykrycie danego kodu DTMF.

transformaty).

No w³a¶nie te¿ mi siê tak wydaje ¿e kod to piku¶, ale taki uC mo¿e nie wyci±gn±æ bez dodatkowego RAMu. Jak narazie znalaz³em przyk³ad kodu jednej szybkiej transformaty tyle ¿e by³a to wersja rekurencyjna i kod rzeczywi¶cie by³ k³ódki, ale z racji rekurencji obawiam siê ¿e uC bêdzie mia³ programy z pamiêci± RAM i tutaj siê zastanawiam czy bardziej op³aca siê dokupiæ dodatkow± ko¶æ RAM (i tak w³a¶ciwie ile tego ramu ma byæ ?) czy te¿ lepiej jest kupiæ dodatkowy uk³ad dekodera DTMF. Ale jak narazie zapatruje siê raczej na u¿ycie transformaty (bo mnie to bardziej interesuje, chce siê trochê pobawiæ ;). Mo¿e bêdzie siê to da³o zrobiæ bez dodatkowego RAMu ? A czy taka transformata jest w ogóle do wykonania bez jakiej¶ wiêkszej ilo¶ci pamiêci, bo chyba aby takie co¶ zrobiæ trzeba mieæ najpierw sygna³ gdzie¶ w pamiêci. Czy te¿ mo¿e siê mylê i mo¿na to robiæ w miarê dynamicznie bez zawalania pamiêci danymi.

Dziêki za wskazówkê. Ju¿ googluje.

Hmm ja niestety nie siedzê w temacie FFT itp. za bardzo (dopiero siê rozeznaje). Czyli mówisz ¿e mam szukaæ DFT ? czy jednak Goertzel'a bo co¶ mi siê wydaje ¿e Goertzel'a to w³a¶nie co¶ w stylu tego co opisa³e¶ czyli DFT. Jak narazie doszed³em do tego ¿e algorytm Goertzel'a jest lepszy od FFT (do tego konkretnego zastosowania) dlatego ¿e podaje siê w nim wej¶ciowe czêstotliwo¶ci (te których siê szuka w sygnale) i dlatego jest o wiele bardziej wydajny bo obliczenia wykonuje siê tylko dla tych wzorcowych czêstotliwo¶ci. Tak¿e to by pasowa³o o twojego DFT.

U¿ytkownik "Tranzystor" snipped-for-privacy@tranzystor.pl napisa³ w wiadomo¶ci news:c5uk64$f7u$ snipped-for-privacy@nemesis.news.tpi.pl... [ciap]

Mam jakie¶ pdf'y do tego ale nie podam linków bo ju¿ sam nie pamiêtam sk±d to po¶ci±ga³em. Jakby co moge podes³aæ ale pewnie sam ju¿ co¶ znajdziesz do tego czasu. Tak na szybkiego jak przegl±da³em to jest jakis przyk³ad na procesor z AD. Ma to tylko 10 MIPS wiêc na ATMega spokojnie powinno dzia³aæ.

Andrzej Kamieniecki

Algorytmu Goertzel'a nie znam ale z ciekawosci poogluguje zeby zobaczyc co to jest jak znajde cos czasu. FFT z glowy nie zakoduje ;) ale orientuje sie mniej wiecej jak to dziala i hmm nie widze tego na AVR'ku bez zewnetrzengo RAMu. To co Ja pisalem wczesniej to po prostu jeden wyraz z szeregu Fouriera - zobacz jak wyglada caleczka w dowolnym poradniku matematycznym. Przy takim podejsciu w trakcie liczenia potrzebujemy jedynie te sumy dla kazdej z czestotliwosci dla klawiszy DTMF. Sinusy zapisujesz w pamieci programu. Najwazniejsze jest to ze nie musisz buforowac probki dzwiekowej.

W skrocie to wyglada tak ze masz swoja probke dzwiekowa i generujesz sinusa i cosinusa jakiejs zadanej czestotliwosci (ktorys z klawiszy DTMF). Nastepnie wyboerasz sobei jakis przedzial czasowy tych sygnalow i sumujesz iloczyn probki i sinusa i sumujesz iloczyn probki i cosinusa. Wartosc amplitudy danej czestotliwosci zawartej w tej probce to o ile pamietam byl piewisatek(z sumy kwadratow zapamietanych sum) podzielone przez dlugosc przedzialu. Pierwisatek mozesz sobei pominac i zastosowac jakas wartosc progowa...

Tomek

-> help Matlaba albo

formatting link
"The Goertzel Algorithm By Kevin Banks"

Tak ju¿ sobie znalaz³em (na wygooglowanej stronie

formatting link
i wygl±da mi na to ¿e nie bêdzie potrzeba do tego jakiej¶ extra pamiêci (w programie który znalaz³em jest co prawda do¶æ spora tablica ale z wstêpnego przejrzenia kodu wydaje mi siê ¿ê da siê j± omin±æ (wystarczy tylko parê zmiennych), tak¿e podejrzewam ¿e nawet na 8051 da³o by siê ten programik odpaliæ po wyrzuceniu tej tablicy. Przebiegu sinusa nie trzeba zapamiêtywaæ przecie¿ w pamiêci tak jak wspomnia³ Tomek (mo¿na go generowaæ dynamicznie). Co do pdf to chêtnie bym zobaczy³ tak¿e rzucê ci jeszcze emaila.

Zobacz sobie stronki:

formatting link
Z tego kodu wynika ¿e uda siê to zrobiæ bez dodatkowego RAMu. A sinusy przecie¿ mo¿na generowaæ od rêki (zapisywanie ich w pamiêci mia³o by sens jedynie, gdyby trzeba przyspieszyæ dzia³anie programu).

Taaaa ... tylko ze to jest 8 czestotliwosci do monitorowania. DFT moze juz byc podobnie skomplikowana obliczeniowo. A przy okazji mozna sprawdzic czy to sa maksima w widmie, czy np ktos glosno krzyknal z drugiej strony ..

Ale jak nie dasz 8ksps to mozesz miec problemy z aliasingiem :-)

J.

U¿ytkownik "Tranzystor" snipped-for-privacy@tranzystor.pl napisa³ w wiadomo¶ci news:c5u824$5cp$ snipped-for-privacy@atlantis.news.tpi.pl...

przetwornikiem

Zobacz, jak to robi± mistrzowie ;-)

formatting link

359 instrukcji na wszystkie 8 filtrów. A podobno AVR umo¿liwia napisanie lepiej upakowanego kodu ;-)

Albert

Ja ju¿ siê rozezna³em i mogê powiedzieæ, ¿e koszty obliczeniowe rzeczywi¶cie mog± byæ podobne. Ale w Goertzel'u, który wykorzystuje DFT jest jedna bardzo istotna zaleta (nie potrzeba du¿ej ilo¶ci pamiêci RAM).

czêstotliwo¶ci

Hmm dobra sprawê uwa¿am za rozwi±zan±. A teraz mo¿e trochê z innej beczki czyli generowanie sygna³u DTMF za pomoc± jednego kana³u PWM. Jak my¶licie czy da siê to zrobiæ jednym kana³em ? czy te¿ musz± byæ koniecznie 2. Bo wydaje mi siê ¿e widzia³em gdzie¶ zrobione to na jedym, a w linku który teraz poda³e¶ jest jednak na dwóch.

U¿ytkownik "Tranzystor" snipped-for-privacy@tranzystor.pl napisa³ w wiadomo¶ci news:c6080t$o65 [...]

W³a¶ciwie to na jednym z dwoma rejestrami capture/compare ;-)

Da siê zrobiæ na jednym, ale zasobów stracisz znacznie wiêcej ni¿ drugi timer. Jeden timer -> jedno wyj¶cie procesora -> sygna³ sumy sinusów wytworzony programowo + DAC Albo du¿a tablica na sinusy, albo kupê czasu na ich liczenie.

Albert

Hmm a zobacz sobie dokumentacje:

formatting link
mnie to wygl±da ¿e ca³y DTMF jest wygenerowany na jednym PWMie. Tyle ¿e nie mogê znale¼æ do tego kodu ¼ród³owego, a w tej dokumentacji co¶ tam pisze o kodzie, gdyby kto¶ wiedzia³ gdzie ten kod jest to proszê o info.

U¿ytkownik "Tranzystor" snipped-for-privacy@tranzystor.pl napisa³ w wiadomo¶ci news:c60e41$h9f$ snipped-for-privacy@nemesis.news.tpi.pl...

No to jest w³a¶nie to o czym piszê, masz wybór: a) u¿yæ 1 rejestr capture/compare, który ³adujesz na starcie i wy³±czasz na koñcu (0 procka, 0 RAM) b) lub tablica warto¶ci sinusa (128 RAM) i ci±g³e (16kHz) obci±¿enie procka obs³ug± przerwania

Owszem rozwi±zane z 1 tablic± jest lepsze ni¿ moje rzucone ad hoc ale problem wyboru pozostaje.

Albert

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required