Analiza spectrală a semnalelor. Aplicarea practică a transformatei Fourier pentru analiza semnalului. Introducere pentru începători Funcția continuă și reprezentarea ei în serie Fourier

În multe cazuri, sarcina de a obține (calcula) spectrul unui semnal arată astfel. Există un ADC care, cu o frecvență de eșantionare Fd, convertește un semnal continuu care ajunge la intrarea sa în timpul T în eșantioane digitale - N bucăți. Apoi, matricea de mostre este introdusă într-un anumit program care produce N/2 din unele valori numerice (programatorul care furat de pe internet a scris un program, asigură că face transformata Fourier).

Pentru a verifica dacă programul funcționează corect, vom forma o serie de eșantioane ca sumă a două sinusoide sin(10*2*pi*x)+0.5*sin(5*2*pi*x) și o vom introduce în program. . Programul a atras următoarele:

Fig.1 Graficul funcției timp semnal


Fig.2 Graficul spectrului de semnal

Pe graficul spectrului sunt două stick-uri (armonice) de 5 Hz cu o amplitudine de 0,5 V și 10 Hz cu o amplitudine de 1 V, totul este la fel ca în formula semnalului original. Totul este în regulă, bine făcut programator! Programul funcționează corect.

Aceasta înseamnă că dacă aplicăm un semnal real dintr-un amestec de două sinusoide la intrarea ADC, vom obține un spectru similar format din două armonice.

Total, al nostru real semnal măsurat cu durata de 5 secunde, digitizat de către ADC, adică reprezentat discret conteaza, are neperiodică discretă gamă.

Din punct de vedere matematic, câte erori există în această frază?

Acum autoritățile au decis, noi am decis că 5 secunde este prea lung, să măsurăm semnalul în 0,5 secunde.



Fig.3 Graficul funcției sin(10*2*pi*x)+0,5*sin(5*2*pi*x) pentru o perioadă de măsurare de 0,5 secunde


Fig.4 Spectrul de funcții

Ceva nu pare în regulă! Armonica de 10 Hz este desenată normal, dar în loc de stick-ul de 5 Hz apar câteva armonici ciudate. Ne uităm pe internet să vedem ce se întâmplă...

Ei bine, se spune că trebuie să adăugați zerouri la sfârșitul eșantionului și spectrul va fi desenat normal.


Fig.5 Se adaugă zerouri până la 5 secunde


Fig.6 Spectrul primit

Tot nu este la fel ca la 5 secunde. Va trebui să ne ocupăm de teorie. Să mergem la Wikipedia- sursa de cunoastere.

2. Funcția continuă și reprezentarea ei în serie Fourier

Matematic, semnalul nostru cu o durată de T secunde este o anumită funcție f(x) specificată pe intervalul (0, T) (X în acest caz este timpul). O astfel de funcție poate fi întotdeauna reprezentată ca o sumă de funcții armonice (sinus sau cosinus) de forma:

(1), unde:

K - numărul funcției trigonometrice (numărul componentei armonice, numărul armonicilor)
T - segment în care este definită funcția (durata semnalului)
Ak este amplitudinea componentei k-a armonică,
θk- faza inițială a componentei k-a armonică

Ce înseamnă să „reprezinți o funcție ca suma unei serii”? Aceasta înseamnă că prin adăugarea valorilor componentelor armonice ale seriei Fourier în fiecare punct, obținem valoarea funcției noastre în acest punct.

(Mai strict, abaterea rădăcină pătrată medie a seriei de la funcția f(x) va tinde spre zero, dar în ciuda convergenței rădăcină pătrată medie, seria Fourier a unei funcții, în general, nu este necesară pentru a converge punctual către el. A se vedea https://ru.wikipedia.org/wiki/Fourier_Series.)

Această serie poate fi scrisă și ca:

(2),
unde , k-a amplitudine complexă.

Relația dintre coeficienții (1) și (3) se exprimă prin următoarele formule:

Rețineți că toate aceste trei reprezentări ale seriei Fourier sunt complet echivalente. Uneori, atunci când lucrați cu seriile Fourier, este mai convenabil să folosiți exponenți ai argumentului imaginar în loc de sinusuri și cosinusuri, adică să folosiți transformata Fourier în formă complexă. Dar este convenabil pentru noi să folosim formula (1), în care seria Fourier este prezentată ca o sumă de cosinus cu amplitudinile și fazele corespunzătoare. În orice caz, este incorect să spunem că transformata Fourier a unui semnal real va avea ca rezultat amplitudini armonice complexe. După cum afirmă în mod corect Wiki, „Transformarea Fourier (ℱ) este o operație care asociază o funcție a unei variabile reale cu o altă funcție, de asemenea o variabilă reală.”

Total:
Baza matematică pentru analiza spectrală a semnalelor este transformata Fourier.

Transformata Fourier vă permite să reprezentați o funcție continuă f(x) (semnal), definită pe segmentul (0, T) ca suma unui număr infinit (serie infinită) de funcții trigonometrice (sinus și/sau cosinus) cu anumite amplitudini si faze, considerate si pe segmentul (0, T). O astfel de serie se numește serie Fourier.

Să mai notăm câteva puncte, a căror înțelegere este necesară pentru aplicarea corectă a transformatei Fourier la analiza semnalului. Dacă luăm în considerare seria Fourier (suma sinusoidelor) pe toată axa X, putem observa că în afara segmentului (0, T) funcția reprezentată de seria Fourier ne va repeta periodic funcția.

De exemplu, în graficul din Fig. 7, funcția originală este definită pe segment (-T\2, +T\2), iar seria Fourier reprezintă o funcție periodică definită pe întreaga axa x.

Acest lucru se întâmplă deoarece sinusoidele în sine sunt funcții periodice și, în consecință, suma lor va fi o funcție periodică.


Fig.7 Reprezentarea unei funcții originale neperiodice printr-o serie Fourier

Prin urmare:

Funcția noastră inițială este continuă, neperiodică, definită pe un anumit segment de lungime T.
Spectrul acestei funcții este discret, adică este prezentat sub forma unei serii infinite de componente armonice - seria Fourier.
De fapt, seria Fourier definește o anumită funcție periodică care coincide cu a noastră pe segmentul (0, T), dar pentru noi această periodicitate nu este semnificativă.

Perioadele componentelor armonice sunt multipli ai valorii segmentului (0, T) pe care este definită funcția inițială f(x). Cu alte cuvinte, perioadele armonice sunt multipli ai duratei măsurării semnalului. De exemplu, perioada primei armonice a seriei Fourier este egală cu intervalul T pe care este definită funcția f(x). Perioada celei de-a doua armonice a seriei Fourier este egală cu intervalul T/2. Și așa mai departe (vezi Fig. 8).


Fig.8 Perioadele (frecvențele) componentelor armonice ale seriei Fourier (aici T = 2π)

În consecință, frecvențele componentelor armonice sunt multipli de 1/T. Adică, frecvențele componentelor armonice Fk sunt egale cu Fk= k\T, unde k variază de la 0 la ∞, de exemplu k=0 F0=0; k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (la frecvență zero - componentă constantă).

Fie funcția noastră originală un semnal înregistrat în timpul T=1 sec. Atunci perioada primei armonice va fi egală cu durata semnalului nostru T1=T=1 sec, iar frecvența armonicii va fi de 1 Hz. Perioada celei de-a doua armonice va fi egală cu durata semnalului împărțită la 2 (T2=T/2=0,5 sec) și frecvența va fi de 2 Hz. Pentru a treia armonică T3=T/3 sec și frecvența este de 3 Hz. Și așa mai departe.

Pasul dintre armonici în acest caz este de 1 Hz.

Astfel, un semnal cu durata de 1 secundă poate fi descompus în componente armonice (obținând un spectru) cu o rezoluție de frecvență de 1 Hz.
Pentru a crește rezoluția de 2 ori la 0,5 Hz, trebuie să măriți durata măsurării de 2 ori - până la 2 secunde. Un semnal care durează 10 secunde poate fi descompus în componente armonice (pentru a obține un spectru) cu o rezoluție de frecvență de 0,1 Hz. Nu există alte modalități de a crește rezoluția frecvenței.

Există o modalitate de a crește în mod artificial durata unui semnal prin adăugarea de zerouri la matricea de mostre. Dar nu crește rezoluția reală a frecvenței.

3. Semnale discrete și transformată Fourier discretă

Odată cu dezvoltarea tehnologiei digitale, s-au schimbat și metodele de stocare a datelor de măsurare (semnale). Dacă anterior un semnal putea fi înregistrat pe un magnetofon și stocat pe bandă în formă analogică, acum semnalele sunt digitizate și stocate în fișiere în memoria computerului ca un set de numere (eșantioane).

Schema obișnuită pentru măsurarea și digitizarea unui semnal este următoarea.


Fig.9 Diagrama canalului de măsurare

Semnalul de la traductorul de măsurare ajunge la ADC într-o perioadă de timp T. Probele de semnal (eșantionare) obținute în timpul T sunt transmise computerului și stocate în memorie.


Fig. 10 Semnal digitizat - N eșantioane primite în timpul T

Care sunt cerințele pentru parametrii de digitizare a semnalului? Un dispozitiv care convertește un semnal analogic de intrare într-un cod discret (semnal digital) se numește convertor analog-digital (ADC) (Wiki).

Unul dintre parametrii principali ai ADC este frecvența maximă de eșantionare (sau rata de eșantionare, rata de eșantionare în limba engleză) - rata de eșantionare a unui semnal continuu în timp la eșantionarea acestuia. Se măsoară în herți. ((Wiki))

Conform teoremei lui Kotelnikov, dacă un semnal continuu are un spectru limitat de frecvența Fmax, atunci poate fi reconstruit complet și fără ambiguitate din eșantioanele sale discrete prelevate la intervale de timp. , adică cu frecvența Fd ≥ 2*Fmax, unde Fd este frecvența de eșantionare; Fmax - frecvența maximă a spectrului de semnal. Cu alte cuvinte, frecvența de digitizare a semnalului (frecvența de eșantionare ADC) trebuie să fie de cel puțin 2 ori mai mare decât frecvența maximă a semnalului pe care dorim să-l măsurăm.

Ce se va întâmpla dacă luăm mostre cu o frecvență mai mică decât cea cerută de teorema lui Kotelnikov?

În acest caz, apare efectul de „aliasing” (cunoscut și ca efect stroboscopic, efect moiré), în care un semnal de înaltă frecvență, după digitizare, se transformă într-un semnal de joasă frecvență, care de fapt nu există. În fig. Unda sinusoidală roșie de înaltă frecvență este un semnal real. O sinusoidă albastră de o frecvență inferioară este un semnal fictiv care apare din cauza faptului că în timpul timpului de eșantionare mai mult de jumătate de perioadă a semnalului de înaltă frecvență are timp să treacă.


Orez. 11. Apariția unui semnal fals de joasă frecvență la o rată de eșantionare insuficient de mare

Pentru a evita efectul de aliasing, un filtru special de anti-aliasing este plasat în fața ADC - un filtru low-pass (LPF), care trece frecvențele sub jumătate din frecvența de eșantionare ADC și oprește frecvențele mai mari.

Pentru a calcula spectrul unui semnal din eșantioanele sale discrete, se utilizează transformata Fourier discretă (DFT). Să remarcăm încă o dată că spectrul unui semnal discret „prin definiție” este limitat de frecvența Fmax, care este mai mică de jumătate din frecvența de eșantionare Fd. Prin urmare, spectrul unui semnal discret poate fi reprezentat prin suma unui număr finit de armonici, spre deosebire de suma infinită pentru seria Fourier a unui semnal continu, al cărui spectru poate fi nelimitat. Conform teoremei lui Kotelnikov, frecvența maximă a unei armonice trebuie să fie astfel încât să reprezinte cel puțin două eșantioane, prin urmare numărul de armonici este egal cu jumătate din numărul de eșantioane ale unui semnal discret. Adică, dacă există N eșantioane în eșantion, atunci numărul de armonici din spectru va fi egal cu N/2.

Să considerăm acum transformata Fourier discretă (DFT).

Compararea cu seria Fourier

Vedem că acestea coincid, cu excepția faptului că timpul în DFT este de natură discretă și numărul de armonici este limitat de N/2 - jumătate din numărul de mostre.

Formulele DFT sunt scrise în variabile întregi adimensionale k, s, unde k sunt numărul de mostre de semnal, s sunt numărul de componente spectrale.
Valoarea s arată numărul de oscilații armonice complete pe perioada T (durata măsurării semnalului). Transformata Fourier discretă este utilizată pentru a găsi amplitudinile și fazele armonicilor folosind o metodă numerică, de exemplu. "pe computer"

Revenind la rezultatele obținute la început. După cum sa menționat mai sus, atunci când extindeți o funcție non-periodică (semnalul nostru) într-o serie Fourier, seria Fourier rezultată corespunde de fapt unei funcții periodice cu perioada T (Fig. 12).


Fig. 12 Funcția periodică f(x) cu perioada T0, cu perioada de măsurare T>T0

După cum se poate observa în Fig. 12, funcția f(x) este periodică cu perioada T0. Totuși, datorită faptului că durata probei de măsurare T nu coincide cu perioada funcției T0, funcția obținută ca serie Fourier are o discontinuitate în punctul T. Ca urmare, spectrul acestei funcții va conține un număr mare de armonici de înaltă frecvență. Dacă durata eșantionului de măsurare T ar coincide cu perioada funcției T0, atunci spectrul obținut după transformarea Fourier ar conține doar prima armonică (sinusoidă cu o perioadă egală cu durata de eșantionare), întrucât funcția f(x) este o sinusoidă.

Cu alte cuvinte, programul DFT „nu știe” că semnalul nostru este o „piesă dintr-un sinusoid”, dar încearcă să reprezinte o funcție periodică sub forma unei serii, care are o discontinuitate din cauza inconsecvenței bucăților individuale de un sinusoid.

Ca urmare, în spectru apar armonici, care ar trebui să însumeze forma funcției, inclusiv această discontinuitate.

Astfel, pentru a obține spectrul „corect” al unui semnal, care este suma mai multor sinusoide cu perioade diferite, este necesar ca în perioada de măsurare a semnalului să se încadreze un număr întreg de perioade ale fiecărei sinusoide. În practică, această condiție poate fi îndeplinită pentru o durată suficient de lungă de măsurare a semnalului.


Fig. 13 Exemplu de funcție și spectru al semnalului de eroare cinematică a cutiei de viteze

Cu o durată mai scurtă, imaginea va arăta „mai rău”:


Fig. 14 Exemplu de funcție și spectru al unui semnal de vibrație a rotorului

În practică, poate fi dificil de înțeles unde sunt „componentele reale” și unde sunt „artefactele” cauzate de perioadele non-multiple ale componentelor și durata eșantionării semnalului sau „sărituri și întreruperi” în forma semnalului. . Desigur, cuvintele „componente reale” și „artefacte” sunt puse între ghilimele pentru un motiv. Prezența multor armonici pe graficul spectrului nu înseamnă că semnalul nostru „constă” de fapt din ele. Acest lucru este același cu a crede că numărul 7 „constă” din numerele 3 și 4. Numărul 7 poate fi reprezentat ca suma numerelor 3 și 4 - acest lucru este corect.

Deci semnalul nostru... sau mai degrabă nici măcar „semnalul nostru”, ci o funcție periodică compusă prin repetarea semnalului nostru (eșantionare) poate fi reprezentată ca o sumă de armonici (unde sinusoidale) cu anumite amplitudini și faze. Dar în multe cazuri care sunt importante pentru practică (a se vedea figurile de mai sus), este într-adevăr posibil să se asocieze armonicile obținute în spectru cu procese reale care sunt ciclice în natură și au o contribuție semnificativă la forma semnalului.

Câteva rezultate

1. Un semnal real măsurat cu o durată de T secunde, digitizat de un ADC, adică reprezentat printr-un set de mostre discrete (N bucăți), are un spectru discret neperiodic, reprezentat printr-un set de armonici (N/ 2 bucăți).

2. Semnalul este reprezentat de un set de valori reale, iar spectrul său este reprezentat de un set de valori reale. Frecvențele armonice sunt pozitive. Faptul că este mai convenabil pentru matematicieni să reprezinte spectrul într-o formă complexă folosind frecvențe negative nu înseamnă că „acest lucru este corect” și „acest lucru ar trebui făcut întotdeauna”.

3. Un semnal măsurat pe un interval de timp T este determinat doar pe un interval de timp T. Ce sa întâmplat înainte de a începe măsurarea semnalului și ce se va întâmpla după aceea, este necunoscut științei. Și în cazul nostru, nu este interesant. DFT-ul unui semnal limitat în timp oferă spectrul său „adevărat”, în sensul că, în anumite condiții, permite să se calculeze amplitudinea și frecvența componentelor sale.

Materiale folosite și alte materiale utile.

Teorie

În primul rând, o mică teorie. După cum știe toată lumea, astfel de analizoare folosesc transformata Fourier rapidă și se spune adesea că DFT nu poate fi folosit în astfel de modele, doar FFT și chiar și atunci în asamblare. Am folosit transformata Fourier discretă (DFT) și transformarea Walsh în schimb. Și în acest articol voi demonstra că poți chiar să folosești nu doar FFT, ci și DFT scris în C. Dar mai întâi, în ordine, cum să obții o funcție DFT simplă de la DFT și conform lui Walsh. În mod clasic, DFT arată astfel:

Deoarece μ are puține resurse, ele înlocuiesc cos și sin cu matrice de dimensiune N. În plus, μ este de 8 biți și este mai convenabil să stocați tablouri sub formă de valori de 8 biți. Deoarece cos și sin variază de la -1 la 1, cel mai bine este să creșteți acest interval de 127 de ori, deoarece o variabilă cu semn de 8 biți poate stoca valori de la -127 la 127. Astfel, ținând cont de transformările formulei , va fi:

unde m se schimbă de la 0 la N-1 cu un pas egal cu k, când m devine mai mare decât N, m este redus cu N-1. Sunt utilizate în total 12 canale, astfel încât puterea DFT este limitată la un număr atât de mic de canale.

De exemplu, avem 512 mostre ADC; trebuie să calculăm părțile imaginare și reale pentru 150 Hz la o frecvență de eșantionare de 19200 Hz:

Astfel, părțile reale și imaginare se obțin mult mai rapid decât în ​​mod tradițional, dar de 127 de ori mai mari. Pentru a obține valorile lor reale, trebuie să împărțiți la 127, dar MK nu are diviziune, ar fi mult mai rațional să nu împărțiți poezia, ci să o mutați! O schimbare este echivalentă cu împărțirea la 2. Adică, dacă deplasați un număr de 7 ori, în esență îl împărțiți la 128! Deoarece pierderile de precizie erau deja inevitabile, împărțirea la 128 nu va schimba imaginea.

Transformarea Fourier discretă pentru 150 Hz la o rată de eșantionare de 19200 Hz arată astfel:

Pentru Walsh, înlocuim undele sinus și cosinus cu mediile perioadelor corespunzătoare. Adică pentru păcatul de la 0 la 180 de grade va fi 1 și de la >180 la 360 va fi -1. În consecință, pentru un sinus de la 0 la 90 este 1, de la 90 la 270 este -1 și de la 270 la 360 este 1. Astfel, toate calculele părților imaginare și reale vor fi o simplă acumulare de sume și diferențe de valoarea ADC. Adică atunci când, de exemplu, sinusul este egal cu 1, atunci valoarea ADC este adăugată și când -1 este scăzut. Dezavantajul acestei soluții este din nou eroarea, care inevitabil crește și ajunge la 20%. Dar, deoarece designul meu are doar 8 valori, din nou puțini oameni vor observa o diferență semnificativă.

Un exemplu de implementare a calculării părților imaginare și reale pentru 150 Hz la o frecvență de eșantionare de 19200 și 512 eșantioane:

În acest fel obținem destul de repede părțile imaginare și reale fără proceduri de înmulțire.

Și astfel, obținând părțile imaginare și reale, este necesar să găsim amplitudinea spectrului. Pentru a face acest lucru, trebuie să găsiți rădăcina sumei pătratelor părților imaginare și reale. Dar dacă utilizați o funcție din biblioteca de matematică, extragerea va dura mult timp și funcția va consuma și o bucată destul de mare de ROM. După câteva săpături pe internet, am găsit o funcție elegantă, pe care apoi am simplificat-o puțin mai mult datorită faptului că funcționează pe valori mici. Aceasta este funcția:

După ce am comparat această funcție și funcția din biblioteca de matematică, am ajuns la concluzia că acuratețea ei este suficientă pentru ca rezultatul să fie același. Funcția în sine cântărește 2% față de 12% din ROM-ul MK. În plus, calculează mult mai repede.

Dar cum s-a întâmplat ca MK să reușească să calculeze 12 canale și chiar și în DFT. Pe lângă toate trucurile cu shift în loc de divizare și funcția de pătrat rapid, mai există un truc. Despre care vă voi povesti acum. Faptul este că, cu cât frecvența de selecție este mai mare, cu atât banda de trecere a filtrului este mai îngustă, deoarece tranziția dintre cos și sin se accelerează și numărul de perioade crește. Și cu cât astfel de treceri sunt mai multe cos și sin, cu atât lățimea de bandă este mai îngustă. De exemplu, pentru o frecvență de 150 Hz, cos și sin se repetă de 4 ori, iar pentru 1,2 kHz, cos și sin se repetă de 32 de ori. Din aceasta se poate observa că, pentru ca banda de trecere să fie uniformă pe toate intervalele și să acopere toate intervalele de frecvență, numărul de eșantioane trebuie redus cu creșterea frecvenței de filtrare. De exemplu, pentru 150 Hz sunt forate toate cele 512 eșantioane, pentru 600 Hz 256 de eșantioane și pentru 2,4 kHz 32 de eșantioane și așa mai departe. Nu este greu de înlocuit că prin reducerea numărului de eșantioane cu o frecvență crescândă, viteza DFT crește brusc, deoarece trebuie făcute mult mai puține înmulțiri și sume.

Implementare practică

Și astfel încât partea teoretică este pregătită, putem începe să descriem designul. Întregul design constă dintr-un microcontroler, 4 tranzistoare, mai mulți condensatori și multe rezistențe. Este mai bine să instalați o mulțime de rezistențe, deși vă puteți limita doar la rezistențe pe orizontală, adică. câte unul pentru fiecare pin de port. Schema este clasică, cu excepția singurului lucru că am folosit 3 porturi la 1 trecere de scanare dinamică în loc de 1, așa cum fac peste tot. Acest lucru a făcut posibilă reducerea frecvenței de baleiaj și reducerea numărului de tranzistori la 4. Rezultatul a fost de fapt o scară 24x4.

Analizorul de spectru funcționează la o rată de eșantionare de 19,2 kHz dintr-un cristal de 16 MHz.

Analizorul de spectru calculează amplitudinile spectrale ale următoarelor frecvențe:

9,6 kHz, 4,8 kHz, 2,4 kHz, 1,6 kHz, 1,2 kHz, 800 Hz, 600 Hz, 500 Hz, 400 Hz, 300 Hz, 150 Hz, 75 Hz. Programul a fost testat pentru 33 Hz și DFT a reușit în ciuda faptului că dimensiunile cos și sin au devenit egale cu 512, dar a decis să-l limiteze la 75 Hz.

Există frecvențe aici care nu sunt un multiplu de 2 la a n-a putere, dar sunt totuși calculate. De exemplu, 400 Hz când este împărțit la 19200 obținem 48 care nu este un multiplu de 2 la puterea n. Am ales o cale de ieșire din situație luând un număr apropiat de numărul 2 la puterea lui n. Cel mai apropiat este 240, este aproape de 256. Adică din 512 am luat doar 240 de mostre. În plus, nu poți lua ceva aproape. De exemplu, am putea lua 480, care este aproape de 512, dar cu toate acestea am luat aproape 256. Explicația pentru aceasta este că la frecvențe diferite, numărul de mostre afectează lățimea de bandă. Cu cât numărul de mostre este mai mare, cu atât lățimea de bandă este mai îngustă. Acest lucru se datorează faptului că la o frecvență înaltă cosinusul trece printr-o perioadă mult mai rapidă decât la una scăzută și amplitudinea este calculată atât de precis încât frecvențele învecinate sunt pur și simplu aruncate și se formează zone de frecvență oarbă între frecvențele care nu sunt percepute. de către analizor. Pentru ca analizorul să perceapă toate frecvențele și să acopere întregul spectru, este necesar să se extindă banda la frecvențe înalte prin luarea de mai puține eșantioane, iar la frecvențe joase să o restrângă cât mai mult posibil prin luarea corespunzătoare a mai multor mostre. Astfel, prin selectarea practică a numărului de citiri, am selectat următoarele:

9,6 kHz 16 numărători, 4,8 kHz 32 numărători, 2,4 kHz 32 numărători, 1,6 kHz 60 numărători, 1,2 kHz 64 numărători, 800 Hz 240 numărători, 600 Hz 256 000 Hz 400 numărători, 256 Hz 400 numărători s, 300 Hz 512 puncte, 150 Hz 512 numără, 75 Hz 512 numără.

Această alegere a numărului de eșantioane a permis ca banda să fie uniformă pe întregul interval de frecvență.

O altă capcană a avut loc la o frecvență de 9,6 kHz. Deoarece nu există o parte imaginară (acest lucru poate fi verificat cu ușurință prin înlocuirea cu 256 număr de spectru în formula de mai sus cu 512 eșantioane și sinusul va fi întotdeauna egal cu 0), partea reală se poate schimba destul de puternic datorită faptului că valoarea cosinusului va fi calculată de fiecare dată în antifază faţă de semnalul principal . Adică va fi calculat o dată. Pentru a evita acest lucru, este necesar să calculați cel puțin 2 valori ale părții reale deplasate cu 90 de grade și să selectați maximul dintre cele două valori.

Algoritmul programului acumulează 512 mostre în interval, transferă microcontrolerul în modul de repaus și se trezește când următoarea probă este gata. În plus, LED-urile sunt scanate la 150 Hz - aceasta este de 128 de ori frecvența de eșantionare de 19200. Adică, înainte ca ADC-ul să preia toate probele, va avea timp să finalizeze o scanare completă. De îndată ce toate probele sunt gata, toate amplitudinile spectrului sunt calculate în ciclul principal al programului. În acest moment, măturarea continuă, dar MK nu adoarme, ci numără amplitudinile. Imediat ce amplitudinile sunt calculate, microcontrolerul intră în somn și programul se repetă din nou. Amplitudinile sunt calculate pe baza unui interval de 20 dB, adică sunt logaritmice.

Pe baza timpului de primire a tuturor citirilor și a timpului de calcul al tuturor amplitudinilor, frecvența de actualizare este în regiunea 10-15 Hz.

Există multe procesoare specializate pentru procesarea semnalului digital (DSP), cum ar fi DSP din seria Texas Instruments TMS320, care include atât nuclee întregi simple, cât și monștri precum subfamilia C6000 care procesează date în virgulă mobilă. Există o serie întreagă de ADSP de la Analog Devices (care include BlackFin-ul mai mult sau mai puțin universal), există și soluții mai simple de la MicroChip - dsPIC.

Cu toate acestea, un DSP specializat este bun, dar este întotdeauna atât de necesar? Da, cu un flux imens de informații este pur și simplu de neînlocuit, dar există și sarcini de procesare mai simple. Mai exact, m-a interesat sarcina dublei conversii - semnalul audio este convolut, obținându-se astfel un spectru, apoi pot fi efectuate orice operații pe spectru și poate fi efectuată conversia inversă, obținându-se astfel un semnal procesat. Toate acestea trebuie făcute în timp real și să obțineți o calitate nu mai mică decât cea a telefonului.

Nu este anul 2000, există soluții cu un singur cip bazate pe nuclee de înaltă performanță ARM7/Cortex-M3 care au scăzut semnificativ la preț; sunt pe 32 de biți, au o implementare hardware a unei operațiuni de multiplicare pe 32 de biți (mai mult , aproape o operație de multiplicare-acumulare DSP și rezultat pe 64 de biți), iar Cortex-M3 include și diviziunea hardware.

Vreau să vă avertizez imediat că procesarea semnalului nu este specialitatea mea, aproape toate cunoștințele (sau mai bine zis, înțelegerea principiilor) au fost păstrate de la institut, dar acum am vrut doar să o testez și să o implementez. Ce vreau să spun este că pot exista inexactități în descriere, înlocuirea conceptelor etc. De fapt, acuratețea academică nu m-a îngrijorat prea mult.

Pentru aproape orice DSP, sarcina prezentată mai sus este simplă și directă. Dar cum se va comporta un nucleu RISC cu scop general pe el? Dacă luăm în considerare AVR sau PIC, atunci este puțin probabil să fie suficiente. 8 biți și frecvența joasă de ceas au un efect. Deși, Elm-Chan are modele în care efectuează o FFT pe AVR și desenează spectrul semnalului. Cu toate acestea, în acest caz, în timp real, se realizează o simplă vizualizare (cu o acuratețe minimă de procesare) și nu o procesare completă a semnalului cu o calitate audio acceptabilă.

LPC2146 a fost ales ca cip experimental, bazat pe nucleul ARM7TDMI-S și având o frecvență maximă de ceas de 60 MHz (în practică, nu funcționează la 72 sau chiar 84 MHz). De ce? În primul rând, am o placă de depanare pentru ea și, în al doilea rând, există un ADC și un DAC la bord, adică. tapițerie exterioară minimă necesară.

Puțină teorie

În primul rând, a fost interesant de evaluat performanța FFT (Fast Fourier Transform) pe microcontrolere ARM. Pe baza acestei evaluări, putem concluziona dacă are suficientă viteză pentru a procesa un flux de date audio și semnalul cu ce frecvență de eșantionare și câte canale pot fi procesate pe un astfel de microcontroler.

Pe baza transformării Fourier, puteți construi filtre inteligente (cu caracteristici foarte atractive). M-au interesat în primul rând problemele schimbării tonului semnalului (creșterea și scăderea spectrului) și „reflectarea” spectrului. Acesta din urmă este necesar în radiourile SDR pentru a asculta emisiunile radio LSB în bandă laterală inferioară.

Nu vă voi încărca cu teorie și vă voi explica ce este transformata Fourier; sunt destul de multe materiale pe această temă, din ce am folosit: un wiki și un capitol dintr-o carte foarte bună și informativă.

Implementare software

Există o mulțime de implementări software ale FFT, cu toate acestea, am scris-o pe ale mele. Scopul principal pe care l-am urmărit a fost optimizarea codului pentru o anumită arhitectură. În primul rând, m-am concentrat imediat pe 32 de biți, în al doilea rând, erau necesare doar calcule cu numere întregi și era de dorit să se evite operația de divizare. Găsirea a ceva gata făcut pentru a îndeplini aceste cerințe este deja problematică.

Toate constantele care puteau fi calculate în avans au fost calculate și plasate în tabele (mai ales valorile funcțiilor trigonometrice). Aceasta este principala optimizare a algoritmului, altfel repetă aproape complet algoritmul descris.

Cea mai importantă este cerința pentru calculele întregi. În timpul procesului de implementare, a existat chiar și o eroare care a provocat o depășire a uneia dintre variabilele buclei de 32 de biți. Mai mult decât atât, nu a apărut pe toate datele de testare, așa că a provocat destulă bătaie de cap până când a fost găsit.

Am adunat toate textele sursă într-o arhivă. Implementarea nu este finală, există calcule duplicate (simetria spectrului și fazei nu sunt luate în considerare), iar optimizarea utilizării bufferelor este necesară, deoarece în prezent este folosită prea multă RAM pentru calcule (aproape 12k pentru o conversie de 1024 de puncte). ).

Primele teste

Rularea tamburului: Testez viteza de conversie pentru un eșantion de 1024 de puncte, frecvența de bază a procesorului este de 60 MHz. Testarea a fost efectuată într-un emulator, deci nu pretinde a fi 100% precis, dar acest rezultat poate fi folosit ca indicator (în experiența mea anterioară, deși emulatorul a mințit, nu a fost mult). Testarea primei versiuni a codului, compilator RealView MDK, opțiunea de optimizare O3, modul de generare a codului ARM.

Deci ceea ce vedem:

6 ms pentru fiecare conversie, pentru un total de puțin peste 12 ms pentru conversia dus-întors. Se dovedește că, cu o frecvență de eșantionare de 44100Hz (standard pentru audio) și mostre cu o rezoluție de până la 16 biți, calculele pure vor dura ~44*12ms = 528ms. Și aceasta este pe o versiune intermediară a firmware-ului, când unele optimizări de cod nu au fost încă finalizate (conform estimărilor, algoritmul poate fi accelerat de aproape 2 ori)! În opinia mea, este doar un indicator excelent.

În total, sarcina de bază este de așteptat să fie în jur de 50%, încă 50% rămâne pentru conversii peste spectru și costuri generale atunci când lucrați cu ADC-uri, DAC-uri și alte transferuri de date. Dacă reduceți frecvența de eșantionare la nivelul „telefonului” (aproximativ 4800-9600Hz), atunci sarcina de bază va fi și mai mică (aproximativ 15-30%).

Deci, partea matematică este mai mult sau mai puțin clară. Puteți trece la implementarea concretă.

Fier

Pentru platforma de testare, am folosit o placă de dezvoltare Keil MCB2140 cu difuzor. Un cablu Mini-Jack este lipit pentru a se conecta la ieșirea liniară a dispozitivului și este asamblat un lanț simplu de intrare. După cum am menționat deja, placa are deja un difuzor conectat la ieșirea analogică a microcontrolerului și există comenzi (buton și potențiometru).

Iată o schiță a circuitului de intrare:


Depanarea software-ului a avut loc în etape:

  1. Depanarea tuturor perifericelor necesare: ADC, DAC, temporizatoare, indicare LED.
  2. Test cu digitizare semnal: digitizez datele la viteza cerută și le pun într-un buffer, apoi extrag datele din buffer și redau semnalul. Acestea. schimbare simplă a semnalului în timp, fără nicio transformare. În această etapă, este testat mecanismul de lucru cu 2 tampoane, necesare lucrărilor ulterioare.
  3. Transformările Fourier directe și inverse sunt adăugate la versiunea anterioară. Acest test verifică în cele din urmă funcționarea corectă a codului FFT, precum și verifică dacă codul se încadrează în performanța disponibilă.
  4. După aceasta, scheletul principal al aplicației este gata, puteți trece la aplicații practice.

Problema a apărut după adăugarea FFT la cod: au apărut zgomote străine și fluiere în semnal. În general, acest comportament mi s-a părut destul de ciudat, pentru că... Fără conversie, semnalul care trece prin calea digitală a rămas destul de curat. Primul motiv pentru aceasta: după circuitul analogic, amplitudinea semnalului pe ADC nu a fost plină (0-3,3V), ci doar în 0,5-2V la volumul maxim al playerului, al doilea: zgomot destul de puternic din cauza numărului întreg calcule (+-1 unitate, care s-a dovedit a fi suficientă pentru a provoca interferențe audibile).

Pentru a combate prima problemă, s-a decis să se înceapă reglarea părții analogice. Și pentru a rezolva problema cu zgomotul, încercați să utilizați un filtru lowpass.

Aplicația 1: schimbarea tonului semnalului

Placa are un potențiometru (rezistor variabil), care poate fi folosit pentru control. În acest caz, setează spectrul semnalului să se schimbe în sus și în jos, destul de mult pentru a „transforma” compozițiile tale preferate.

Iată ce se întâmplă în domeniul frecvenței:


În acest caz, rezultatul conversiei este conținut în 2 tampoane. Un tampon este partea reală, iar celălalt este partea imaginară. Semnificația fizică a numerelor obținute în ele: partea reală conține valorile armonicilor, partea imaginară conține schimbarea de fază pentru aceste armonici. Mai mult, după cum puteți vedea, semnalul inițial este descris prin valori N, iar după conversie se obțin valori 2N. Cantitatea de informații nu se modifică, iar creșterea de 2 ori a cantității de informații are loc datorită faptului că datele tampon au redundanță sub formă de duplicare a valorilor.

  • Electronice purtabile,
  • DIY sau Do It Yourself
  • În cel precedent, am conectat un ecran LCD chinezesc ieftin la placa Discovery STM32L4. Acum vom încerca să implementăm ceva pe această combinație care să depășească tradiționala clipire a unui LED, și anume un analizor de spectru audio care folosește microfonul de pe placă. În același timp, vă voi spune cum să utilizați sistemul de operare FreeRTOS și de ce este necesar, precum și de ce există 12 note într-o octavă muzicală și de ce 53 de note sunt mai bune decât 12.

    Digitalizare audio

    Dorim să primim un semnal de la un microfon, să calculăm spectrul acestuia folosind transformarea Fourier rapidă (FPU ne ajută) și să afișăm rezultatul pe LCD sub forma unei „cascade de culoare”. Vom codifica puterea sunetului după culoare. Vom desena o linie de pixeli de la marginea afișajului, unde pixelul din stânga va corespunde frecvenței minime, iar cel din dreapta la maxim, în timp ce imaginea anterioară se va deplasa cu o linie, făcând loc unei noi linii. Microcontrolerul nostru este prea complex pentru a începe de la zero, așa că vom începe cu un exemplu din kitul STM32Cube numit DFSDM_AudioRecord. Ce este DFSDM? Acesta este filtrul digital pentru modularea Sigma-Delta. Cert este că, spre deosebire de vechile microfoane analogice bune, cel de pe placa Discovery produce un semnal nu sub forma unei tensiuni proporționale cu presiunea sonoră, ci sub forma unei secvențe de zerouri și uni cu o frecvență de ceas de mai multe. megahertz. Dacă treceți această secvență printr-un filtru trece-jos, veți obține același semnal analogic. În modelele anterioare de microcontrolere, a fost necesară realizarea unui filtru digital pentru a obține semnalul audio în formă digitală. Acum microcontrolerul are un modul special pentru aceasta și tot ceea ce este necesar este să îl configurați la începutul programului. Pentru a face acest lucru, puteți fie să citiți mai profund documentația, fie să utilizați un exemplu gata făcut. Am luat-o pe a doua cale. Următoarea imagine ilustrează structura internă a programului DFSDM_AudioRecord.

    Sunetul digitizat este transferat într-un buffer de apel folosind DMA. DMA întrerupe de două ori: o dată când tamponul este pe jumătate plin și o dată când este complet plin. Rutina de gestionare a întreruperilor setează pur și simplu indicatorul corespunzător. Funcția main(), după inițializare, execută o buclă infinită în care aceste steaguri sunt verificate și, dacă steagul este setat, jumătatea corespunzătoare din buffer este copiată. Exemplul copiază datele într-un alt buffer, de unde, din nou folosind DMA, sunt trimise la amplificatorul pentru căști. Am părăsit această funcționalitate, adăugând calculul spectrului semnalului audio.

    Când sunt multe sarcini

    O modalitate simplă de a adăuga noi funcționalități la codul nostru este să adăugați mai multe casete de selectare și să scrieți funcții care vor fi apelate când acele casete de selectare sunt bifate. Rezultatul este de obicei o mizerie de steaguri, funcții de gestionare și un context global care este forțat să fie global, deoarece soluția unei probleme este împărțită în mulți pași mici implementați de funcții individuale - handlere de evenimente. O modalitate alternativă este de a delega gestionarea sarcinilor unui sistem de operare precum FreeRTOS. Acest lucru vă permite să simplificați semnificativ logica datorită faptului că fiecare sarcină este rezolvată în cadrul propriei bucle de procesare a evenimentelor, care interacționează între ele prin funcțiile sistemului de operare. De exemplu, putem adăuga o sarcină de procesare a datelor ca o buclă separată, care va aștepta ca datele să fie gata pe o primitivă de sincronizare - un semafor. Semaforul este foarte simplu: îl poți trece dacă steagul este ridicat, iar steagul este coborât automat. În cazul nostru, sursa de date va ridica steag atunci când pregătește datele pentru o altă sarcină. Într-un mod similar, puteți crea lanțuri arbitrare de sarcini surse de date și sarcini de consum de date, similar cu ceea ce se întâmplă, de exemplu, în sistemul de operare Linux.

    Desigur, simultaneitatea executării sarcinilor este o iluzie, mai ales când există un singur nucleu de calcul. În acest caz, putem spune că avem un singur fir de execuție a programului pe procesor. Semaforele, ca și alte primitive de sincronizare, acționează ca o groapă magică de iepure în care firul de execuție cade pentru a ieși la iveală într-o altă sarcină.

    Conectarea FreeRTOS la proiectul dvs. este destul de simplă. Trebuie doar să înlocuiți bucla fără sfârșit care de obicei încheie funcția main() din microcontroler cu un apel la osKernelStart(). După aceasta, compilatorul vă va explica exact ce lipsește pentru a compila. Toate acțiunile pe care le-ați efectuat anterior în buclă trebuie să fie transferate într-o activitate separată și înregistrate cu un apel la xTaskCreate. După aceea, puteți adăuga cât mai multe sarcini doriți. Trebuie să rețineți că este mai bine să nu plasați niciun cod care funcționează cu hardware între apelurile xTaskCreate și osKernelStart, deoarece cronometrul sistemului poate să nu funcționeze corect aici. Un apel la gestionarea temporizatorului sistemului de operare osSystickHandler() ar trebui adăugat la SysTick_Handler() și două funcții SVC_Handler și PendSV_Handler ar trebui eliminate din codul dvs., deoarece sunt implementate în codul OS. Când înregistrați sarcini, este important să nu faceți o greșeală cu dimensiunea stivei. Dacă este prea mic, vei avea accidente în cele mai neașteptate locuri. Atunci când are loc o depășire a stivei, structura însăși care descrie sarcina este prima care suferă. În IAR puteți vizualiza lista sarcinilor. Dacă vedeți o sarcină cu un nume schimbat în ea, atunci trebuie să măriți dimensiunea stivei.

    Calcularea spectrului

    Pentru a calcula spectrul vom folosi transformata Fourier rapidă. Funcția corespunzătoare este deja în bibliotecă. Primește un buffer plin cu date complexe și generează rezultatul acolo. În consecință, are nevoie de un buffer la intrare, unde sunetul digitizat alternează cu zerouri (partea complexă 0). La ieșire obținem numere complexe, pentru care calculăm imediat pătratul modulului adunând pătratele părților reale și imaginare. Facem asta doar pentru jumătate din buffer, deoarece spectrul este simetric. Am avea nevoie de a doua jumătate dacă am vrea să facem conversia inversă, dar pentru o simplă afișare a spectrului nu este nevoie. Este necesar un efort suplimentar pentru a putea calcula spectrul în diferite domenii spectrale. Pentru a obține spectrul de frecvență joasă, acumulez date pe mai multe citiri tampon, reducând efectiv audio-ul, care este inițial de 44,1 kHz. Rezultatul este 6 intervale - 20kHz, 10kHz, 5kHz, 2600Hz, 1300Hz, 650Hz. Pentru a schimba intervalele, utilizați joystick-ul și o sarcină separată. Joystick-ul realizează și funcții de pornire/oprire în cascadă, precum și reglarea sensibilității. Este mai convenabil să afișați spectrul în unități logaritmice (decibeli), deoarece intervalul său dinamic este de obicei foarte mare și, la scară liniară, vom putea distinge doar cele mai puternice componente ale spectrului. Logaritmul durează destul de mult să se calculeze chiar și pe FPU, așa că am înlocuit logaritmul real cu o aproximare liniară pe bucăți, care este ușor de obținut dacă cunoașteți formatul float32 pentru reprezentarea numărului. Cel mai semnificativ bit este un semn. Următorii 8 biți sunt exponentul binar plus 127. Biții rămași sunt partea fracțională a mantisei, în ciuda faptului că partea întreagă este egală cu 1 (vom omite nuanțele numerelor denormalizate pentru simplitate). Aceasta înseamnă că prin extragerea exponentului din float32 și luând mai mulți biți de ordin înalt ai mantisei, puteți obține o bună aproximare a logaritmului. Folosind un tabel pregătit în prealabil, convertim numărul rezultat într-un cod RGB pentru afișare pe LCD. Rezultă o scară de culoare de 90 sau 60 de decibeli. Nivelul volumului corespunzător cu zero al acestei scale poate fi reglat prin apăsarea joystick-ului în sus și în jos.

    Afișăm o imagine - despre beneficiile citirii fișelor de date

    Acum tot ce trebuie să facem este să afișăm imaginea și să ne animam „cascada”. Modul direct de a face acest lucru este să stocați o imagine a întregului ecran într-un buffer, să o actualizați acolo și să o redesenați de fiecare dată când apar date noi. Nu numai că această soluție este extrem de ineficientă, dar nici nu avem suficientă memorie pentru a stoca întreaga imagine. S-ar părea că LCD-ul în sine are suficientă memorie pentru asta și ar trebui să poată face ceva interesant cu el. Într-adevăr, studierea foii de date a făcut posibilă descoperirea unei comenzi de defilare neutilizate anterior, care vă permite să schimbați dinamic modul în care memoria controlerului LCD este afișată pe ecran. Să ne imaginăm că memoria este o bandă închisă într-un inel, pe care o vezi sub sticla ecranului. Comanda Vertical Scrolling Start Address (0x37) vă permite să setați o poziție pe panglică care corespunde marginii de sus a ecranului. Aceasta înseamnă că tot ce avem nevoie pentru a reînvia „cascada” este să scriem un nou spectru în această poziție și să parcurgem banda de memorie. Codul corespunzător a fost adăugat la driverul LCD, împrumutat de la respectatul Peter Drescher și adaptat așa cum este descris. Singurul dezavantaj al acestei abordări este că derularea funcționează doar pe partea lungă a ecranului. În consecință, doar partea scurtă este disponibilă pentru ieșirea spectrului.

    De ce sunt 12 note într-o octavă?

    Să trecem la aplicațiile practice ale dispozitivului nostru. Primul lucru care este ușor de văzut pe spectru sunt armonicile, adică frecvențele care sunt multipli ai frecvenței fundamentale. Există mai ales mulți dintre ei în voce. Ele se găsesc și în sunetele pe care le fac instrumentele muzicale. Este ușor de înțeles de ce notele octavelor învecinate diferă ca frecvență cu un factor de 2: atunci notele unei octave superioare coincid ca frecvență cu a doua armonică a notelor unei octave inferioare. Ei spun că în același timp sună „la unison”. Este puțin mai greu de înțeles de ce sunt 12 note într-o octavă - șapte principale (taste albe pe o tastatură de pian) plus 5 suplimentare (taste negre). Notele suplimentare sunt desemnate prin notele principale cu semne ascuțite și plate, deși în esență nu există nicio diferență între ele și notele principale - toate cele 12 note formează o progresie geometrică, astfel încât raportul de frecvență dintre notele adiacente este egal cu rădăcina a 12-a a 2. Semnificația acestei împărțiri a octavei pe note este că pentru orice notă există și alte note care diferă de ea ca frecvență de o dată și jumătate - această combinație se numește a cincea. Notele care formează un al cincilea sunet la unison, deoarece a doua armonică a unei note este aceeași frecvență cu cea de-a treia armonică a altei note. Fotografia de mai jos arată spectrul notelor C și G formând o cincime, armonicile care se potrivesc sunt încercuite în galben.

    Cum s-a întâmplat să fie 12 note? Deoarece notele formează o progresie geometrică, să trecem la logaritmi. ln(1,5)/ln(2) = 0,58496... Se obține o valoare apropiată din fracția 7/12 = 0,583... Adică șapte semitonuri (intervale între notele adiacente) se dovedesc a fi foarte apropiate de a cincea - 1.498. Interesant este că fracția 31/53 = 0,58491... oferă o precizie mult mai mare, așa că a cincea diferă de 1,5 doar în a cincea zecimală. Acest fapt nu a trecut neobservat, dar instrumentele muzicale cu 53 de note pe octava nu s-au răspândit. Sunt greu de acordat, greu de cântat, iar procentul de oameni care pot face diferența față de instrumentele convenționale este foarte mic.

    Toate semnalele, indiferent dacă le-ați inventat sau le-ați observat în Univers, sunt de fapt doar suma unor unde sinusoidale simple de diferite frecvențe.

    Am realizat un mic analizor de spectru audio (0 - 10 kHz) dintr-un LCD 16x2 si un microcontroler ATmega32. Am început cu DFT-uri simple (transformată Fourier discretă). FFT (Fast Fourier Transform) diferă de DFT doar prin viteza mai mare și un algoritm ceva mai complex, nu l-am folosit, poate îl voi adăuga mai târziu.

    DFT este lentă în comparație cu FFT. Analizatorul meu de spectru LCD nu necesită viteza mare pe care o poate oferi FFT, iar dacă imaginea de pe ecran se schimbă cu o rată de aproximativ 30 de cadre/sec, atunci aceasta este mai mult decât suficientă pentru a vizualiza spectrul audio. Dar pot atinge deja în jur de 100 fps, totuși, o rată de reîmprospătare prea mare nu este recomandată pentru un LCD. Audio eșantionat la 20 kHz produce 32 de puncte DFT. Deoarece rezultatul transformării este simetric, trebuie să folosesc doar primele 16 rezultate. În consecință, frecvența maximă este de 10 kHz. Astfel, 10kHz/16 = 625Hz.

    Am încercat să măresc viteza de calcul DFT. Dacă există un punct N DFT, atunci trebuie să găsim sinusul și cosinusul (N^2) / 2. Pentru un DFT cu 32 de puncte, trebuie să găsim sinusul și cosinusul lui 512. Înainte de a găsi sinusul și cosinusul, trebuie să găsim unghiul (grade) care ocupă ceva timp CPU. Pentru a face acest lucru, am făcut tabele pentru sinus și cosinus. Am făcut variabile sinus și cosinus pe 16 biți înmulțind valorile sinus și cosinus cu 10000. După conversie, trebuie să împart fiecare rezultat la 10000. Acum pot calcula 120 de DFT-uri cu 32 de puncte pe secundă, ceea ce este mai mult de suficient pentru un analizor de spectru.

    Afişa

    Am folosit caractere LCD personalizate încărcate în cei 64 de octeți ai memoriei LCD de la bord. Am văzut un videoclip online în care un LCD 16x2 este folosit ca afișaj pentru analizor de spectru și am folosit ideea asta.

    Intrare audio

    Una dintre cele mai importante părți ale unui analizor de spectru este obținerea semnalului de la un microfon electret. O atenție deosebită trebuie acordată designului unui preamplificator de microfon. Trebuie să setăm nivelul zero la intrarea ADC și nivelul maxim egal cu jumătate din tensiunea de alimentare, adică. 2,5 V. Poate fi alimentat cu tensiune de la -2,5V la +2,5V. Preamplificatorul trebuie configurat astfel încât să nu depășească aceste limite. Am folosit un amplificator operațional LM324 ca preamplificator de microfon.

    Lista radioelementelor

    Desemnare Tip Denumire Cantitate NotăMagazinBlocnotesul meu
    Afişa
    MK AVR pe 8 biți

    ATmega32

    1 La blocnotes
    Condensator22 pF2 La blocnotes
    Condensator0,1 uF1 La blocnotes
    Condensator electrolitic100 µF1 La blocnotes
    Rezistor

    100 ohmi

    1 La blocnotes
    Rezistor trimmer4,7 kOhm1 La blocnotes
    Rezonator cu cuarț16 MHz1 La blocnotes
    Ecran LCD16x21 La blocnotes
    unitate de putere5 V1 La blocnotes
    Intrare audio
    U1 Amplificator operațional

    LM324

    1 La blocnotes
    C1 Condensator1 µF1 La blocnotes
    C8 Condensator0,01 µF1 La blocnotes
    R1 Rezistor

    220 kOhm

    1 La blocnotes
    R2, R3 Rezistor

    10 kOhm

    2 La blocnotes
    R4, R9 Rezistor

    1 kOhm

    2 La blocnotes
    R5 Rezistor