A Fourier-transzformáció gyakorlati alkalmazása jelfeldolgozásra. Digitális jelfeldolgozás ARM7 mikrokontrollereken Fourier transzformációs avr

A Fourier-tétel kimondja, hogy bármely jel kibővíthető sorozattá egy ortonormális periodikus függvényhalmazban (például szinuszokban és koszinuszokban), amelyek frekvenciája a periodikus jel frekvenciájának többszöröse. Így egy jel spektrális elemzése súlyozási együtthatók (általános esetben komplex) keresésén alapul, amelyek modulja megfelel az összes harmonikus általános szuperpozíciójába bevitt megfelelő harmonikus rezgési erejének hányadának. .

Gyors Fourier transzformáció

A Fast Fourier Transform egy számítási algoritmus, amely sikeresen kihasználja a trigonometrikus függvények periodicitási tulajdonságait, hogy elkerülje a diszkrét Fourier-transzformáció (DFT) szükségtelen számításait, ezáltal gyorsabbá téve az együtthatók megtalálását a Fourier-kiterjesztésben. A fő különbség a diszkrét konverziótól csak a számértékek kiszámításának módszerében (algoritmus) van, és nem magában a jelfeldolgozásban. FFT és DFT esetén is ugyanaz a számítás eredménye. Az FFT algoritmus egyetlen követelménye egy olyan mintaméret, amely N = 2L többszöröse, ahol L bármely pozitív egész szám. A leggyakoribb 2-es bázisú FFT-algoritmusok a következők: idő-tizedes és frekvencia-tizedes.

Ebben a munkában egy radix-2 FFT algoritmust valósítunk meg időritkítással (Cooley-Tukey algoritmus). Könnyű megszerezni néhány DFT-törvény tanulmányozásával. Vezessük be az úgynevezett forgási együtthatót:

Ebben az esetben a DFT-ben számos jelérték (f0,f1,…,fN-1) Fourier-együtthatóit a következő összefüggés fejezi ki:

Tekintsünk egy 4 értékű jelsorozatot: (f0,f1,f2,f3). Mutassuk be a Fourier-transzformációt mátrix formában (az 1/N normalizációs együtthatót a kifejezés jobb oldalán lévő Cij oszlopvektor tartalmazza):

Miután felírta az elforgatási együtthatókat az Euler-képlet segítségével, és meghatározta azok értékét k = 0, 1, 2,...9-re, összeállíthat egy diagramot (2. ábra), amelyből az ismétlődő együtthatók mintázata látható.

2. ábra w hatványsor N=4 esetén

A számértékeket (4)-be behelyettesítve kapjuk:

Ez azt jelenti, hogy a w értéke w4-től kezdve megegyezik a megfelelő w0 és w3 értékkel. Ezután átírjuk a (4) mátrixegyenletet nem szabványos formában (hasonló jelöléseket vezetünk be a további műveletek érthetősége érdekében):

Cseréljük fel a mátrix oszlopait, két csoportra osztva: páros f0, f2 és páratlan f1, f3 indexekkel:

Vegyük figyelembe, hogy wk+1 = wkw1, akkor a (6) kifejezés át lesz írva:

Az arányok használata:

A szükséges kiterjesztési együtthatókat oszlopvektor formájában kapjuk meg cellaértékekkel:

Az algoritmus grafikus ábrázolása (3. ábra) úgy néz ki, mint egy nyitott szárnyú pillangó, ezért ezt a számítási módszert „pillangónak” nevezik.

3. ábra Pillangógráf 4 tagból álló sorozathoz

Tehát az algoritmus első lépésében számos jelérték tagjait páros és páratlan indexekre osztjuk. Ezután végrehajtódik a „pillangó” gráf, amely két szakaszból áll, ezek száma megegyezik a mintanagyság kettőjének hatványával (N = 4 = 22). Minden szakaszban két „pillangót” hajtanak végre, és teljes számuk változatlan marad. Minden pillangóművelet egy szorzási műveletnek felel meg. Összehasonlításképpen: DFT-ben mintavételezéssel (f0,f1,f2,f3) a szorzási műveletet 4×4 = 16-szor kellene elvégezni, FFT esetén pedig csak 4-szer.

Ezt a sorozatot így is írhatjuk:

(2),
ahol , k-edik komplex amplitúdó.

Az (1) és (3) együtthatók közötti kapcsolatot a következő képletekkel fejezzük ki:

Megjegyzendő, hogy a Fourier-sor mindhárom ábrázolása teljesen egyenértékű. Néha, amikor Fourier-sorokkal dolgozunk, kényelmesebb a képzeletbeli argumentum kitevőit használni a szinuszok és koszinuszok helyett, vagyis a Fourier-transzformációt komplex formában használni. De kényelmes az (1) képlet használata, ahol a Fourier-sort koszinuszok összegeként mutatjuk be a megfelelő amplitúdókkal és fázisokkal. Mindenesetre helytelen azt állítani, hogy egy valós jel Fourier-transzformációja összetett harmonikus amplitúdókat eredményez. Ahogy a Wiki helyesen mondja: "A Fourier-transzformáció (?) egy olyan művelet, amely egy valós változó egyik függvényét társítja egy másik, szintén valós változóhoz.

Teljes:
A jelek spektrális elemzésének matematikai alapja a Fourier-transzformáció.

A Fourier-transzformáció lehetővé teszi egy f(x) (jel) folytonos függvény ábrázolását, amely a (0, T) szakaszon meghatározott trigonometrikus függvények (szinusz és/vagy koszinusz) végtelen számú (végtelen sorozatának) összegeként definiálható. amplitúdók és fázisok, a (0, T) szegmensen is figyelembe véve. Az ilyen sorozatokat Fourier-sorozatnak nevezik.

Jegyezzünk meg még néhány pontot, amelyek megértése szükséges a Fourier-transzformáció helyes alkalmazásához a jelanalízishez. Ha figyelembe vesszük a Fourier-sort (a szinuszok összegét) a teljes X-tengelyen, akkor láthatjuk, hogy a (0, T) szakaszon kívül a Fourier-sor által reprezentált függvény periodikusan megismétli függvényünket.

Például a 7. ábra grafikonján az eredeti függvény a (-T\2, +T\2) szakaszon van definiálva, és a Fourier-sor a teljes x tengelyen meghatározott periodikus függvényt reprezentál.

Ez azért történik, mert a szinuszosok maguk is periodikus függvények, és ennek megfelelően az összegük periodikus függvény lesz.


7. ábra Egy nem periodikus eredeti függvény ábrázolása Fourier-sorral

És így:

Eredeti függvényünk folytonos, nem periodikus, egy bizonyos T hosszúságú szakaszon definiált.
Ennek a függvénynek a spektruma diszkrét, azaz harmonikus komponensek végtelen sorozata - a Fourier-sor - formájában jelenik meg.
Valójában a Fourier-sor meghatároz egy bizonyos periodikus függvényt, amely egybeesik a miénkkel a (0, T) szakaszon, de számunkra ez a periodicitás nem jelentős.

A harmonikus komponensek periódusai annak a szakasznak a (0, T) értékének a többszörösei, amelyen az eredeti f(x) függvény definiálva van. Más szavakkal, a harmonikus periódusok a jelmérés időtartamának többszörösei. Például a Fourier-sor első harmonikusának periódusa megegyezik azzal a T intervallummal, amelyen az f(x) függvény definiálva van. A Fourier-sor második harmonikusának periódusa megegyezik a T/2 intervallummal. És így tovább (lásd 8. ábra).


8. ábra A Fourier-sor harmonikus komponenseinek periódusai (frekvenciái) (itt T = 2?)

Ennek megfelelően a harmonikus komponensek frekvenciái 1/T többszörösei. Ez azt jelenti, hogy az Fk harmonikus komponensek frekvenciája Fk = k\T, ahol k 0-tól?-ig terjed, például k = 0 F0 = 0; k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (nulla frekvencián - állandó komponens).

Legyen eredeti függvényünk egy T=1 sec alatt rögzített jel. Ekkor az első harmonikus periódusa egyenlő lesz a jelünk időtartamával T1=T=1 sec, a harmonikus frekvencia pedig 1 Hz lesz. A második harmonikus periódusa egyenlő lesz a jel időtartamának osztva 2-vel (T2=T/2=0,5 mp), a frekvencia pedig 2 Hz lesz. A harmadik harmonikusnál T3=T/3 sec és a frekvencia 3 Hz. Stb.

A harmonikusok közötti lépés ebben az esetben 1 Hz.

Így egy 1 másodperc időtartamú jel harmonikus komponensekre bontható (spektrumot nyerve) 1 Hz frekvenciafelbontással.
A felbontás kétszeresére 0,5 Hz-re történő növeléséhez a mérés időtartamát kétszeresére kell növelni - legfeljebb 2 másodpercig. A 10 másodpercig tartó jel harmonikus komponensekre bontható (spektrum előállításához), 0,1 Hz frekvenciafelbontással. Nincs más módszer a frekvenciafelbontás növelésére.

Van mód a jel időtartamának mesterséges növelésére úgy, hogy nullákat adunk a minták tömbjéhez. De nem növeli a tényleges frekvenciafelbontást.

3. Diszkrét jelek és diszkrét Fourier transzformáció

A digitális technika fejlődésével a mérési adatok (jelek) tárolásának módjai is megváltoztak. Ha korábban egy jelet magnóra lehetett rögzíteni és analóg formában szalagon tárolni, most a jeleket digitalizálják és a számítógép memóriájában tárolt fájlokban számok (minták) halmazaként tárolják.

A jel mérésének és digitalizálásának szokásos sémája a következő.


9. ábra A mérőcsatorna diagramja

Jelzés innen mérőátalakító T időtartam alatt érkezik az ADC-hez. A T idő alatt kapott jelminták (mintavételezés) átkerülnek a számítógépbe és a memóriában tárolódnak.


10. ábra Digitalizált jel - T idő alatt N minta érkezett

Milyen követelmények vonatkoznak a jeldigitalizálási paraméterekre? Olyan eszköz, amely a bemeneti analóg jelet diszkrét kóddá alakítja ( digitális jel) analóg-digitális konverternek (ADC, angol Analog-to-digital converter, ADC) nevezik (Wiki).

Az ADC egyik fő paramétere a maximális mintavételezési frekvencia (vagy mintavételezési frekvencia, angolul sample rate) - az időfolytonos jel mintavételezési gyakorisága a mintavételezéskor. Hertzben mérik. ((Wiki))

Kotelnyikov tétele szerint, ha egy folytonos jelnek az Fmax frekvencia által korlátozott spektruma van, akkor az időközönként vett diszkrét mintáiból teljesen és egyértelműen rekonstruálható. , azaz Fd frekvenciával? 2*Fmax, ahol Fd a mintavételi frekvencia; Fmax - a jel spektrumának maximális frekvenciája. Más szóval, a jel digitalizálási frekvenciájának (ADC mintavételezési frekvenciának) legalább kétszerese kell legyen a mérni kívánt jel maximális frekvenciájának.

Mi történik, ha a Kotelnyikov-tétel által megköveteltnél alacsonyabb frekvenciával veszünk mintát?

Ebben az esetben jön létre az „aliasing” effektus (más néven stroboszkópos effektus, moaré effektus), amelyben a nagyfrekvenciás jel a digitalizálás után alacsony frekvenciájú jellé alakul, ami valójában nem létezik. ábrán. 5 piros nagyfrekvenciás szinuszhullám valós jel. Az alacsonyabb frekvenciájú kék szinusz egy fiktív jel, amely abból adódik, hogy a mintavételezési idő alatt a nagyfrekvenciás jel több mint felének van ideje áthaladni.


Rizs. 11. Hamis alacsony frekvenciájú jel megjelenése nem kellően magas mintavételezési gyakoriság mellett

Az aliasing hatás elkerülése érdekében az ADC elé egy speciális élsimító szűrőt helyeznek el - egy aluláteresztő szűrőt (LPF), amely az ADC mintavételi frekvenciájának fele alatti frekvenciákat engedi át, és levágja a magasabb frekvenciákat.

Egy jel spektrumának kiszámításához a diszkrét mintákból a diszkrét Fourier transzformációt (DFT) használjuk. Még egyszer jegyezzük meg, hogy a diszkrét jel spektrumát „definíció szerint” az Fmax frekvencia korlátozza, amely kevesebb, mint az Fd mintavételi frekvencia fele. Ezért egy diszkrét jel spektruma véges számú harmonikus összegével ábrázolható, ellentétben a folytonos jel Fourier-sorának végtelen összegével, amelynek spektruma korlátlan lehet. Kotelnyikov tétele szerint egy harmonikus maximális frekvenciájának olyannak kell lennie, hogy legalább két mintát jelentsen, ezért a harmonikusok száma egyenlő egy diszkrét jel mintáinak felével. Vagyis ha N minta van a mintában, akkor a spektrum harmonikusainak száma N/2 lesz.

Nézzük most a diszkrét Fourier transzformációt (DFT).

Összehasonlítás a Fourier sorozattal

Látjuk, hogy egybeesnek, kivéve, hogy a DFT-ben az idő diszkrét természetű, és a harmonikusok száma N/2-vel - a minták számának felével - korlátozott.

A DFT képleteket k, s dimenzió nélküli egész változókba írjuk, ahol k a jelminták száma, s a spektrális komponensek száma.
Az s érték a teljes harmonikus rezgések számát mutatja a T periódusban (a jel mérésének időtartama). A diszkrét Fourier transzformációt a harmonikusok amplitúdóinak és fázisainak numerikus módszerrel történő megkeresésére használjuk, pl. "a számítógépen"

Visszatérve az elején elért eredményekhez. Ahogy fentebb említettük, ha egy nem periódusos függvényt (a jelünket) Fourier-sorrá terjesztünk ki, az így kapott Fourier-sor valójában egy T periódusú periodikus függvénynek felel meg (12. ábra).


12. ábra F(x) periódusos függvény T0 periódussal, T>T0 mérési periódussal

Amint a 12. ábrán látható, az f(x) függvény T0 periódusú periodikus. Tekintettel azonban arra, hogy a T mérési minta időtartama nem esik egybe a T0 függvény periódusával, a Fourier-sorként kapott függvénynek megszakadása van a T pontban. Ennek eredményeként ennek a függvénynek a spektruma tartalmazni fog nagyszámú nagyfrekvenciás harmonikus. Ha a T mérési minta időtartama egybeesne a T0 függvény periódusával, akkor a Fourier-transzformáció után kapott spektrum csak az első harmonikust (a mintavételi időtartammal megegyező periódusú szinuszost) tartalmazná, mivel az f(x) függvény egy szinuszoid.

Más szóval, a DFT program „nem tudja”, hogy a jelünk „egy szinusz darabja”, hanem egy periodikus függvényt próbál ábrázolni sorozat formájában, amely az egyes darabok inkonzisztenciája miatt megszakad. egy szinuszoid.

Ennek eredményeként harmonikusok jelennek meg a spektrumban, amelyeknek összegezniük kell a függvény alakját, beleértve ezt a megszakadást is.

Tehát ahhoz, hogy egy jel „helyes” spektrumát kapjuk, amely több, különböző periódusú szinusz összege, szükséges, hogy minden szinuszból egész számú periódus illeszkedjen a jel mérési periódusába. A gyakorlatban ez a feltétel a jelmérés kellően hosszú időtartamára teljesíthető.


13. ábra Példa a sebességváltó kinematikai hibajelének működésére és spektrumára

Rövidebb időtartammal a kép „rosszabbul” fog kinézni:


14. ábra Példa a rotor rezgésjelének funkciójára és spektrumára

A gyakorlatban nehéz lehet megérteni, hol vannak a „valódi komponensek”, és hol vannak a „műtermékek”, amelyeket a komponensek nem többszörös periódusai, valamint a jelmintavételezés időtartama vagy a jel alakjában bekövetkező „ugrások és megszakítások” okoznak. . Természetesen a „valódi összetevők” és a „termékek” szavakat nem ok nélkül teszik idézőjelbe. A sok harmonikus jelenléte a spektrumgráfon nem jelenti azt, hogy a jelünk valójában ezekből „áll”. Ez ugyanaz, mint azt gondolni, hogy a 7-es szám a 3-as és a 4-es számokból áll. A 7-es szám ábrázolható a 3-as és a 4-es számok összegeként – ez így van.

Tehát a jelünk... vagy inkább nem is „a mi jelünk”, hanem a jelünk ismétlődéséből összeállított periodikus függvény (mintavételezés) bizonyos amplitúdójú és fázisú harmonikusok (szinuszhullámok) összegeként ábrázolható. De sok esetben, ami a gyakorlat szempontjából fontos (lásd a fenti ábrákat), valóban lehetséges a spektrumban kapott harmonikusokat olyan valós folyamatokhoz társítani, amelyek ciklikus jellegűek, és jelentősen hozzájárulnak a jel alakjához.

Néhány eredmény

1. Egy T másodperc időtartamú, ADC-vel digitalizált, azaz diszkrét minták halmazával (N darab) ábrázolt valós mért jel diszkrét nem periodikus spektrummal rendelkezik, amelyet felharmonikusok halmaza képvisel (N/ 2 darab).

2. A jelet valós értékek halmaza, spektrumát pedig valós értékek halmaza képviseli. A harmonikus frekvenciák pozitívak. Az a tény, hogy a matematikusok számára kényelmesebb a spektrumot komplex formában negatív frekvenciák használatával ábrázolni, nem jelenti azt, hogy „ez helyes” és „mindig ezt kell tenni”.

3. A T időintervallumban mért jelet csak egy T időintervallumban határozzuk meg. Hogy mi történt a jel mérésének megkezdése előtt, és mi lesz ezután, az ismeretlen a tudomány számára. És a mi esetünkben ez nem érdekes. Az időkorlátos jel DFT-je megadja a „valódi” spektrumát, abban az értelemben, hogy bizonyos feltételek mellett lehetővé teszi összetevői amplitúdójának és frekvenciájának kiszámítását.

Felhasznált anyagok és egyéb hasznos anyagok.

Kijelzőként egy kétsoros karakteres LCD kijelzőt használnak. A projekt megvalósításának lényege nem a hardver, hanem a szoftver, pontosabban a diszkrét Fourier transzformáció (DFT) megvalósítása egy 8 bites mikrokontrolleren. Rögtön meg kell jegyezni, hogy a szerző nem jártas ezen a területen, ezért az alapoktól kezdte – egy egyszerű diszkrét Fourier transzformációval. A gyors Fourier-transzformációs algoritmus nemcsak gyors, hanem meglehetősen összetett is.

A Discrete Fourier Transform (az angol szakirodalomban DFT, Discrete Fourier Transform) a digitális jelfeldolgozó algoritmusokban széles körben használt Fourier-transzformációk egyike (módosításait használják MP3-ban hangtömörítésben, JPEG-ben képtömörítésben stb.), valamint a diszkrét (például digitalizált analóg) jelek frekvenciáinak elemzésével kapcsolatos egyéb területek. A diszkrét Fourier-transzformáció bemenetként diszkrét függvényt igényel. Az ilyen függvényeket gyakran mintavételezéssel hozzák létre (értékek mintavétele folytonos függvényekből).

Egy spektrumanalizátor sematikus diagramja hangjelzés nagyon egyszerű, és nagyjából digitális és analóg részekre osztható.

A digitális részt egy mikrokontroller és egy hozzá csatlakoztatott LCD kijelző alkotja. A mikrokontroller órajele in kvarc rezonátor 16 MHz, a +5 V tápfeszültség referenciafeszültségként szolgál a mikrokontroller ADC-jéhez.
Az LCD kijelző adatbusza a mikrokontroller C portjához (PC0-PC3 bemeneti/kimeneti vonalak), a vezérlő busz a mikrokontroller D portjához (PD5, PD6) csatlakozik. A jelző 4 bites módban működik. A kontraszt beállításához 4,7 kOhm névleges értékű változtatható ellenállást használnak. Az indikátor használatához egyéni szimbólumokat hoztak létre az analizátor 8 vízszintes oszlopának megjelenítésére; ezek az egyéni szimbólumok az LCD indikátor mind a 64 bájtját elfoglalják.

A mikrokontroller külső 16 MHz-es kvarcrezonátorról működik.

A készülék analóg része a legfontosabb alkatrész, az elektret mikrofon jelének előerősítője, melynek kimenete a mikrokontrollerbe épített ADC ADC0 csatornájára csatlakozik. A nulla szintet az ADC bemeneten pontosan a referenciafeszültség felére kell beállítanunk, azaz. 2,5 V. Ebben az esetben használhatjuk a jel pozitív és negatív félhullámát, de az amplitúdója nem haladhatja meg a megállapított határértéket, pl. Az erősítést finoman kell beállítani a túlterhelés elkerülése érdekében. A fenti feltételek mindegyikét teljesíti egy általános kis teljesítményű műveleti erősítő mikroáramkör.

A DFT algoritmus valamivel lassabb a gyors Fourier transzformációhoz képest. A spektrumanalizátorunk azonban nem igényel nagy sebességet, és ha körülbelül 30 képkocka/másodperc frissítési sebességet tud biztosítani, ez bőven elegendő egy audiojel spektrumának megjelenítéséhez. A mi verziónkban mindenesetre el lehet érni a 100 képkocka/másodperces sebességet, de ez már túl magas paraméterérték egy kétsoros karakteres LCD kijelzőhöz, és nem ajánlott. A mintavételi frekvencia 20 kHz egy 32 pontos diszkrét Fourier transzformációnál és mivel a transzformáció eredménye szimmetrikus, ezért csak az első felét kell használnunk, azaz. az első 16 eredmény. Ezért a frekvencia spektrumot 10 kHz-ig tudjuk megjeleníteni, az analizátor felbontása pedig 10 kHz/16 = 625 Hz.

A terv készítője kísérletet tett a DFT számítások sebességének növelésére. Ha ennek a transzformációnak N pontja van, akkor meg kell találnunk a szinusz és a koszinusz N2/2 értékét. A 32 pontos transzformációhoz 512 szinusz és koszinusz értéket kell találnunk. Mielőtt azonban megtalálnánk őket, ki kell számítanunk a szöget (fokokat), ami némi CPU-időt vesz igénybe, ezért úgy döntöttünk, hogy értéktáblázatokat használunk ezekhez a számításokhoz. A mikrokontroller programban történő számításnál nem használunk lebegőpontos és dupla pontosságú számokat, mivel ennek feldolgozása egy 8 bites mikrokontrolleren tovább tart. Ehelyett a keresési táblázatokban szereplő értékek 16 bites egész adatokat használnak, szorozva 10 000-rel. Ezután az átalakítás után az eredményeket elosztják 10 000-rel. Ezzel a megközelítéssel 120 darab 32 pontos konverziót lehet végrehajtani másodszor, ami több mint elég az eszközeinkhez.

Spektrumanalizátor működésének bemutatása ATmega32 mikrokontrolleren

Letöltések

Forráskód (mikrovezérlő program, szinusz, koszinusz és szög adattáblázat) -

  • Egyértelmű, hogy egy AVR-en nehéz továbbmenni a fénynél és a zenénél, a paraméterek nem megfelelőek. De másodpercenként 120 32 pontos konverzió elegendő lehet a legtöbb feladathoz. És természetesen vehetsz még egy 625 Hz-es mintát, vagy inkább elveszítheted a frissítési gyakoriságot. Érdemes megjegyezni, hogy az MK rosszul fogja magát érezni, a teljesítményt tekintve nem sok mást lehet rátűzni. De itt megszervezheti az eredmény kimenetét hardveres adatátviteli módszerekkel. Ekkor egy kiegészítő mikrokontroller lesz, a fő pedig csak tőle kap adatokat és más folyamatokkal kompatibilisen dolgozza fel. Nagyjából még mindig a processzor frekvenciájától függ. Valaha 20 MHz fölött lehetett túlhúzni a megát, de ezekhez a feladatokhoz valószínűleg csak magas frekvencián kapunk majd akadozást. Az ötlet jó, ha a matek részekből több lenne megírva... ez a megvalósítása az MK-n
  • Csináltam érdekesebb elemzőket is: You Tube vagy egy színes LCD-s verzió: a You Tube a híres Chen könyvtárra épül :)
  • „Ki kell számolnunk a szöget (fok)” Valaki meg tudja mondani részletesebben, hogyan számítják ki ezeknek a táblázatoknak az értékeit?
  • A szinuszok és koszinuszok táblázatával minden világos. Nem világos, hogyan számítják ki a fokozat_keresési táblázatban szereplő értékeket?

Minden jel, akár kitaláltad, akár az Univerzumban figyelted őket, valójában csak különböző frekvenciájú egyszerű szinuszhullámok összege.

Egy 16x2-es LCD-ből és egy ATmega32 mikrokontrollerből készítettem egy kis hangspektrum analizátort (0 - 10 kHz). Egyszerű DFT-kkel (Discrete Fourier Transform) kezdtem. Az FFT (Fast Fourier Transform) csak nagyobb sebességben és egy kicsit bonyolultabb algoritmusban különbözik a DFT-től, nem használtam, talán később kiegészítem.

A DFT lassú az FFT-hez képest. Az LCD spektrumanalizátorom nem igényli azt a nagy sebességet, amit az FFT tud nyújtani, és ha a kép a képernyőn körülbelül 30 képkocka/sec sebességgel változik, akkor ez több mint elegendő a hangspektrum megjelenítéséhez. De már 100 fps körüli sebességet is el tudok érni, viszont LCD-hez nem ajánlott túl magas frissítési gyakoriság. A 20 kHz-en mintavételezett hang 32 DFT pontot eredményez. Mivel a transzformáció eredménye szimmetrikus, csak az első 16 eredményt kell felhasználnom. Ennek megfelelően a maximális frekvencia 10 kHz. Így 10kHz/16 = 625Hz.

Megpróbáltam növelni a DFT számítás sebességét. Ha van N DFT pont, akkor meg kell találnunk a szinuszát és a koszinuszát (N^2)/2. 32 pontos DFT esetén meg kell találnunk az 512 szinuszát és koszinuszát. meg kell találnunk azt a szöget (fokokat), amely némi CPU-időt foglal el. Ehhez táblázatokat készítettem szinuszra és koszinuszra. A szinuszos és koszinuszos 16 bites változókat úgy készítettem, hogy a szinusz és koszinusz értékeket megszoroztam 10000-rel. Az átalakítás után minden eredményt el kell osztanom 10000-el. Most 120 darab 32 pontos DFT-t tudok kiszámítani másodpercenként, ami több mint elég egy spektrumanalizátorhoz.

Kijelző

Egyedi LCD-karaktereket használtam a 64 bájtos beépített LCD-memóriába. Láttam egy videót az interneten, ahol egy 16x2-es LCD-t használnak spektrumanalizátor kijelzőként, és ezt az ötletet használtam.

Audio bemenet

A spektrumanalizátor egyik legfontosabb része az elektret mikrofon jelének vétele. Különös figyelmet kell fordítani a fejlesztésre előerősítő mikrofonhoz. Be kell állítanunk a nulla szintet az ADC bemeneten és a maximális szintet a tápfeszültség felével, azaz. 2,5V. -2,5V és +2,5V közötti feszültséggel táplálható. Az előerősítőt úgy kell beállítani, hogy ne lépje túl ezeket a határértékeket. Mikrofon előerősítőként egy LM324-es műveleti erősítőt használtam.

Radioelemek listája

Kijelölés típus Megnevezés Mennyiség jegyzetÜzletA jegyzettömböm
Kijelző
MK AVR 8 bites

ATmega32

1 Jegyzettömbhöz
Kondenzátor22 pF2 Jegyzettömbhöz
Kondenzátor0,1 µF1 Jegyzettömbhöz
Elektrolit kondenzátor100 µF1 Jegyzettömbhöz
Ellenállás

100 Ohm

1 Jegyzettömbhöz
Trimmer ellenállás4,7 kOhm1 Jegyzettömbhöz
Kvarc rezonátor16 MHz1 Jegyzettömbhöz
LCD kijelzö16x21 Jegyzettömbhöz
tápegység5 V1 Jegyzettömbhöz
Audio bemenet
U1 Műveleti erősítő

LM324

1 Jegyzettömbhöz
C1 Kondenzátor1 µF1 Jegyzettömbhöz
C8 Kondenzátor0,01 µF1 Jegyzettömbhöz
R1 Ellenállás

220 kOhm

1 Jegyzettömbhöz
R2, R3 Ellenállás

10 kOhm

2 Jegyzettömbhöz
R4, R9 Ellenállás

1 kOhm

2 Jegyzettömbhöz
R5 Ellenállás

Számos speciális processzor létezik a digitális jelfeldolgozáshoz (DSP), például a Texas Instruments TMS320 sorozatának DSP-je, amely egyszerű egész magokat és olyan szörnyeket is tartalmaz, mint a lebegőpontos adatokat feldolgozó C6000 család alcsalád. Van egy egész ADSP sorozat az Analog Devices-től (amiben benne van a többé-kevésbé univerzális BlackFin), van még több egyszerű megoldások a MicroChip-től - dsPIC.

A speciális DSP azonban jó, de mindig annyira szükséges? Igen, hatalmas információáramlás mellett egyszerűen pótolhatatlan, de vannak egyszerűbb feldolgozási feladatok is. Konkrétan a kettős konverziós feladat érdekelt - az audiojel konvolúcióra kerül, ezáltal spektrumot kapunk, majd a spektrumon bármilyen műveletet el lehet végezni és végrehajtható az inverz konverzió, ezáltal feldolgozott jelet kapunk. Mindezt valós időben kell megtenni, és a minőség nem alacsonyabb, mint a telefon minősége.

Ez nem a 2000-es év, vannak nagy teljesítményű ARM7/Cortex-M3 magokra épülő egylapkás megoldások, amelyek jelentősen csökkentek az árakon, 32 bitesek, 32 bites szorzási művelet hardveres megvalósítása (sőt , szinte egy DSP szorzás-felhalmozás művelet és 64 bites eredmény), és a Cortex-M3 hardveres felosztást is tartalmaz.

Azonnal figyelmeztetem, hogy a jelfeldolgozás nem az én szakterületem, szinte minden tudás (vagy inkább az alapelvek megértése) megmaradt az intézetből, de most csak tesztelni és megvalósítani akartam. Arra gondolok, hogy lehetnek pontatlanságok a leírásban, a fogalmak helyettesítésében stb. Valójában az akadémiai pontosság nem nagyon aggaszt.

Szinte minden DSP esetében a fent vázolt feladat egyszerű és egyértelmű. De hogyan fog viselkedni rajta egy általános célú RISC mag? Ha figyelembe vesszük az AVR-t vagy a PIC-et, akkor nem valószínű, hogy elegendőek. A 8 bites és az alacsony órajelnek van hatása. Bár Elm-Channek vannak olyan tervei, amelyekben FFT-t vezet az AVR-en, és felhívja a jel spektrumát. Ebben az esetben azonban, valós időben, egyszerűen vizualizáció történik (minimális feldolgozási pontossággal), és nem teljes jelfeldolgozás elfogadható hangminőséggel.

Kísérleti chipnek az LPC2146-ot választottuk, amely az ARM7TDMI-S magra épül, és 60 MHz-es maximális órajellel rendelkezik (a gyakorlatban nem működik 72, sőt 84 MHz-en sem). Miért? Először is van hozzá debug kártyám, másodszor pedig ADC és DAC van a fedélzeten, pl. minimális külső burkolat szükséges.

Egy kis elmélet

Először is érdekes volt értékelni az FFT (Fast Fourier Transform) teljesítményét ARM mikrokontrollereken. Ezen értékelés alapján megállapítható, hogy van-e elég sebessége egy hangadatfolyam feldolgozásához, illetve milyen mintavételezési frekvenciával és hány csatornát lehet feldolgozni egy ilyen mikrokontrolleren.

A Fourier-transzformáció alapján okos szűrőket építhet (nagyon vonzó tulajdonságokkal). Elsősorban a jel hangszín megváltoztatásának (spektrum emelése és csökkentése) és a spektrum „visszaverésének” problémái érdekeltek. Ez utóbbi szükséges az SDR rádiókban az LSB alsó oldalsávú rádióadások hallgatásához.

Nem töltöm meg elmélettel, és nem magyarázom el, mi az a Fourier-transzformáció, elég sok anyag van ebben a témában, abból, amit én használtam: egy wiki és egy fejezet egy nagyon jó és informatív könyvből.

Szoftver implementáció

Az FFT-nek sok szoftveres implementációja létezik, de én írtam a sajátomat. A fő cél az volt, hogy a kódot egy adott architektúrához optimalizáljam. Először is azonnal a 32 bitesre koncentráltam, másodszor csak egész számokra volt szükség, és kívánatos volt elkerülni az osztási műveletet. Már most problémás olyan kész terméket találni, amely megfelel ezeknek a követelményeknek.

Az összes előre kiszámítható állandót kiszámoltuk és táblázatokba helyeztük (leginkább a trigonometrikus függvények értékeit). Ez az algoritmus fő optimalizálása, egyébként szinte teljesen megismétli a leírt algoritmust.

A legfontosabb az egész számok számításának követelménye. A megvalósítási folyamat során még olyan hiba is előfordult, amely túlcsordulást okozott az egyik 32 bites hurokváltozóban. Ráadásul nem minden vizsgálati adaton szerepelt, így elég nagy fejtörést okozott, amíg meg nem találták.

Az összes forrásszöveget egy archívumba gyűjtöttem. A megvalósítás nem végleges, duplikált számítások vannak (a spektrum és a fázisszimmetria nincs figyelembe véve), és a pufferek használatának optimalizálása szükséges, mivel jelenleg túl sokat használnak számításokhoz véletlen hozzáférésű memória(majdnem 12k egy 1024 pontos konverzióért).

Első tesztek

Dobpergés: 1024 pontos mintán tesztelem az átalakítási sebességet, a processzor magfrekvenciája 60 MHz. A tesztelés emulátorban történt, tehát nem állítja 100%-os pontosságát, de ez az eredmény indikátorként használható (korábbi tapasztalataim szerint bár az emulátor hazudott, nem volt sok). A kód első verziójának tesztelése, RealView MDK fordító, O3 optimalizálási lehetőség, ARM kódgeneráló mód.

Tehát amit látunk:

6 ms minden konverzióhoz, összesen valamivel több mint 12 ms az oda-vissza átalakításhoz. Kiderült, hogy 44100 Hz-es mintavételezési frekvenciával (szabványos hang) és akár 16 bites felbontású mintákkal a tiszta számítások ~44*12ms = 528ms. És ez a firmware köztes verziójában van, amikor néhány kódoptimalizálás még nem fejeződött be (becslések szerint az algoritmus majdnem kétszeresére gyorsítható)! Véleményem szerint ez csak egy kiváló mutató.

Összességében a magterhelés várhatóan 50% körül lesz, további 50% marad a spektrum feletti konverziókra és az általános költségekre, ha ADC-kkel, DAC-okkal és egyéb adatátvitellel dolgozik. Ha a mintavételezési frekvenciát a „telefon” szintre csökkenti (kb. 4800-9600 Hz), akkor a magterhelés még alacsonyabb lesz (kb. 15-30%).

Tehát a matematikai rész többé-kevésbé világos. Továbbléphet a konkrét megvalósításhoz.

Vas

A tesztplatformhoz egy Keil MCB2140 fejlesztőlapot használtunk hangszóróval. Az eszköz lineáris kimenetéhez egy Mini-Jack vezetéket forrasztanak, és egy egyszerű bemeneti láncot állítanak össze. Mint már említettük, az alaplapon már van egy hangszóró, amely a mikrokontroller analóg kimenetére csatlakozik, és vannak vezérlők (gomb és potenciométer).

Itt van a bemeneti áramkör vázlata:


A szoftver hibakeresése több lépésben történt:

  1. Minden szükséges periféria hibakeresése: ADC, DAC, időzítők, LED jelzés.
  2. Teszt jeldigitalizálással: az adatokat a kívánt sebességgel digitalizálom és egy pufferbe teszem, majd a pufferből kivonom az adatokat és lejátszom a jelet. Azok. egyszerű jeleltolódás időben, transzformációk nélkül. Ebben a szakaszban tesztelik a további munkához szükséges 2 pufferrel való munkavégzés mechanizmusát.
  3. NAK NEK előző verzió direkt és inverz Fourier transzformációkat adunk hozzá. Ez a teszt végül ellenőrzi az FFT kód helyes működését, valamint azt, hogy a kód illeszkedik-e az elérhető teljesítményhez.
  4. Ezt követően elkészült az alkalmazás fő váza, át lehet térni a gyakorlati alkalmazásokra.

A probléma az FFT kódba adása után jelentkezett: idegen zaj és sípok jelentek meg a jelben. Általában ez a viselkedés elég furcsának tűnt számomra, mert... Konverzió nélkül a digitális úton áthaladó jel meglehetősen tiszta maradt. Ennek első oka: az analóg áramkör után az ADC-n nem volt tele a jelamplitúdó (0-3,3V), hanem a lejátszó maximális hangerején csak 0,5-2V-on belül, a második: egész szám miatt elég erős zaj számítások (+-1 egység, ami elegendőnek bizonyult a hallható interferencia okozásához).

Az első probléma leküzdésére úgy döntöttek, hogy elkezdjük az analóg alkatrész beállítását. A zajprobléma megoldásához próbáljon meg egy aluláteresztő szűrőt használni.

1. alkalmazás: a jel hangszínének megváltoztatása

A táblán van egy potenciométer ( változtatható ellenállás), vezérlésre használható. Ebben az esetben úgy állítja be a jelspektrumot, hogy felfelé és lefelé toljon, ami elég ahhoz, hogy „átalakítsa” kedvenc kompozícióit.

Íme, mi történik a frekvenciatartományban:


Ebben az esetben a konverziós eredményt 2 puffer tartalmazza. Az egyik puffer a valós rész, a másik a képzeletbeli rész. A bennük kapott számok fizikai jelentése: a valós rész a felharmonikusok értékeit tartalmazza, a képzeletbeli rész pedig ezeknek a harmonikusoknak a fáziseltolását. Ezenkívül, amint látható, a kezdeti jelet N-értékek írják le, és a konverzió után 2N-értéket kapunk. Az információ mennyisége nem változik, az információmennyiség kétszeres növekedése pedig abból adódik, hogy a pufferadatok értékkettőzés formájában redundanciával rendelkeznek.




Top