Praktisk anvendelse av Fourier-transformasjonen for signalbehandling. Digital signalbehandling på ARM7 mikrokontrollere Fourier transform avr

Fouriers teorem sier at ethvert signal kan utvides til en serie i et ortonormalt sett med periodiske funksjoner (for eksempel sinus og cosinus) med frekvenser som er multipler av frekvensen til det periodiske signalet. Dermed er spektralanalysen av et signal basert på søket etter vektkoeffisienter (i det generelle tilfellet komplekse), hvis modul tilsvarer brøkdelen av oscillasjonskraften til den tilsvarende harmoniske introdusert i den generelle superposisjonen av alle harmoniske .

Rask Fourier-transformasjon

Fast Fourier Transform er en beregningsalgoritme som vellykket utnytter periodisitetsegenskapene til trigonometriske funksjoner for å unngå unødvendige beregninger i den diskrete Fourier-transformasjonen (DFT), og dermed gjør det raskere å finne koeffisienter i Fourier-utvidelsen. Hovedforskjellen fra diskret konvertering er bare i metoden for å beregne numeriske verdier (algoritme), og ikke i selve signalbehandlingen. Både når det gjelder FFT og når det gjelder DFT er resultatet av beregningene det samme. Det eneste kravet for FFT-algoritmen er en prøvestørrelse som er et multiplum av N = 2L, der L er et hvilket som helst positivt heltall. De vanligste base-2 FFT-algoritmene er: tidsdesimert og frekvensdesimert.

I dette arbeidet er en radix-2 FFT-algoritme med tidstynning (Cooley-Tukey-algoritme) implementert. Det er enkelt å få tak i ved å undersøke noen DFT-lover. La oss introdusere den såkalte rotasjonskoeffisienten:

I dette tilfellet, i DFT, er Fourier-koeffisientene for et antall signalverdier (f0,f1,...,fN-1) uttrykt av relasjonen:

Tenk på en signalserie med 4 verdier: (f0,f1,f2,f3). La oss presentere Fourier-transformasjonen i matriseform (normaliseringskoeffisienten 1/N er inkludert i kolonnevektoren Cij på høyre side av uttrykket):

Etter å ha skrevet rotasjonskoeffisientene ved hjelp av Eulers formel og bestemt verdiene deres for k = 0, 1, 2, .. 9, kan du konstruere et diagram (fig. 2), hvorfra mønsteret av gjentatte koeffisienter kan sees.

Figur 2. Effektserie w for N=4

Ved å erstatte numeriske verdier i (4) får vi:

Det vil si at verdiene til w, fra w4, er lik den tilsvarende verdien fra w0 til w3. Deretter omskriver vi matriseligningen (4) i en ikke-standard form (lignende notasjoner er introdusert for klarhet i videre operasjoner):

La oss bytte kolonnene i matrisen, dele den inn i to grupper: etter partall f0, f2 og oddetall f1, f3 indekser:

La oss ta i betraktning at wk+1 = wkw1, så vil uttrykk (6) bli omskrevet som:

Bruke forholdstallene:

Vi får de nødvendige ekspansjonskoeffisientene i form av en kolonnevektor med celleverdier:

Den grafiske representasjonen av algoritmen (fig. 3) ser ut som en sommerfugl med åpne vinger, og derfor kalles denne beregningsmetoden "sommerfugl".

Figur 3. Sommerfuglgraf for en serie på 4 ledd

Så, i det første trinnet av algoritmen, er medlemmene av en rekke signalverdier delt inn i partalls- og oddetallsindekser. Deretter utføres "sommerfugl"-grafen den består av to stadier, deres antall er lik kraften til to av prøvestørrelsen (N = 4 = 22). På hvert trinn utføres to "sommerfugler", og deres totale antall forblir uendret. Hver sommerfugloperasjon tilsvarer én multiplikasjonsoperasjon. Til sammenligning: i DFT med sampling (f0,f1,f2,f3), må multiplikasjonsoperasjonen utføres 4×4 = 16 ganger, og i tilfelle av FFT bare 4 ganger.

Denne serien kan også skrives som:

(2),
hvor , k-te kompleks amplitude.

Forholdet mellom koeffisientene (1) og (3) uttrykkes med følgende formler:

Merk at alle disse tre representasjonene av Fourier-serien er helt like. Noen ganger, når du arbeider med Fourier-serier, er det mer praktisk å bruke eksponenter for det imaginære argumentet i stedet for sinus og cosinus, det vil si å bruke Fourier-transformasjonen i kompleks form. Men det er praktisk for oss å bruke formel (1), der Fourier-serien presenteres som en sum av cosinus med tilsvarende amplituder og faser. I alle fall er det feil å si at Fourier-transformasjonen av et reelt signal vil resultere i komplekse harmoniske amplituder. Som Wiki korrekt sier, "Fourier-transformasjonen (?) er en operasjon som assosierer en funksjon av en reell variabel med en annen funksjon, også en reell variabel."

Total:
Det matematiske grunnlaget for spektralanalyse av signaler er Fourier-transformasjonen.

Fourier-transformasjonen lar deg representere en kontinuerlig funksjon f(x) (signal), definert på segmentet (0, T) som summen av et uendelig antall (uendelig rekke) av trigonometriske funksjoner (sinus og/eller cosinus) med visse amplituder og faser, også vurdert på segmentet (0, T). En slik serie kalles en Fourier-serie.

La oss merke seg noen flere punkter, hvor forståelsen er nødvendig for riktig anvendelse av Fourier-transformasjonen til signalanalyse. Hvis vi tar for oss Fourier-serien (summen av sinusoider) på hele X-aksen, kan vi se at utenfor segmentet (0, T) vil funksjonen representert av Fourier-serien periodisk gjenta funksjonen vår.

For eksempel, i grafen i fig. 7, er den opprinnelige funksjonen definert på segmentet (-T\2, +T\2), og Fourier-serien representerer en periodisk funksjon definert på hele x-aksen.

Dette skjer fordi sinusoider i seg selv er periodiske funksjoner, og følgelig vil summen deres være en periodisk funksjon.


Fig.7 Representasjon av en ikke-periodisk opprinnelig funksjon ved en Fourier-serie

Dermed:

Vår opprinnelige funksjon er kontinuerlig, ikke-periodisk, definert på et visst segment med lengde T.
Spekteret til denne funksjonen er diskret, det vil si at det presenteres i form av en uendelig rekke harmoniske komponenter - Fourier-serien.
Faktisk definerer Fourier-serien en viss periodisk funksjon som sammenfaller med vår på segmentet (0, T), men for oss er ikke denne periodisiteten signifikant.

Periodene til de harmoniske komponentene er multipler av verdien til segmentet (0, T) som den opprinnelige funksjonen f(x) er definert på. Med andre ord er de harmoniske periodene multipler av varigheten av signalmålingen. For eksempel er perioden til den første harmoniske av Fourier-serien lik intervallet T som funksjonen f(x) er definert på. Perioden til den andre harmoniske av Fourier-serien er lik intervallet T/2. Og så videre (se fig. 8).


Fig.8 Perioder (frekvenser) for de harmoniske komponentene i Fourier-serien (her T = 2?)

Følgelig er frekvensene til de harmoniske komponentene multipler av 1/T. Det vil si at frekvensene til de harmoniske komponentene Fk er lik Fk = k\T, hvor k varierer fra 0 til?, for eksempel k = 0 F0 = 0; k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (ved null frekvens - konstant komponent).

La vår opprinnelige funksjon være et signal registrert under T=1 sek. Da vil perioden til den første harmoniske være lik varigheten av signalet vårt T1=T=1 sek og den harmoniske frekvensen vil være 1 Hz. Perioden til den andre harmoniske vil være lik signalvarigheten delt på 2 (T2=T/2=0,5 sek) og frekvensen vil være 2 Hz. For den tredje harmoniske T3=T/3 sek og frekvensen er 3 Hz. Og så videre.

Steget mellom harmoniske i dette tilfellet er 1 Hz.

Dermed kan et signal med en varighet på 1 sekund dekomponeres til harmoniske komponenter (oppnå et spektrum) med en frekvensoppløsning på 1 Hz.
For å øke oppløsningen med 2 ganger til 0,5 Hz, må du øke målevarigheten med 2 ganger - opptil 2 sekunder. Et signal som varer i 10 sekunder kan dekomponeres til harmoniske komponenter (for å oppnå et spektrum) med en frekvensoppløsning på 0,1 Hz. Det er ingen andre måter å øke frekvensoppløsningen på.

Det er en måte å kunstig øke varigheten av et signal ved å legge til nuller til utvalget av prøver. Men det øker ikke den faktiske frekvensoppløsningen.

3. Diskrete signaler og diskret Fouriertransformasjon

Med utviklingen av digital teknologi har også metodene for lagring av måledata (signaler) endret seg. Hvis et signal tidligere kunne tas opp på en båndopptaker og lagres på bånd i analog form, digitaliseres nå signaler og lagres i filer i dataminnet som et sett med tall (prøver).

Det vanlige opplegget for måling og digitalisering av et signal er som følger.


Fig.9 Diagram over målekanalen

Signal fra måletransduser ankommer ADC i løpet av en tidsperiode T. Signalsamplingene (samplingen) oppnådd under tiden T blir overført til datamaskinen og lagret i minnet.


Fig. 10 Digitalisert signal - N prøver mottatt under tiden T

Hva er kravene til parametere for signaldigitalisering? En enhet som konverterer et analogt inngangssignal til en diskret kode ( digitalt signal) kalles en analog-til-digital-omformer (ADC, engelsk analog-til-digital-omformer, ADC) (Wiki).

En av hovedparametrene til ADC er den maksimale samplingsfrekvensen (eller samplingsfrekvensen, engelsk samplingsfrekvens) - samplingshastigheten til et tidskontinuerlig signal ved sampling. Det måles i hertz. ((Wiki))

I følge Kotelnikovs teorem, hvis et kontinuerlig signal har et spektrum begrenset av frekvensen Fmax, kan det rekonstrueres fullstendig og entydig fra dets diskrete prøver tatt med tidsintervaller , dvs. med frekvens Fd? 2*Fmax, hvor Fd er samplingsfrekvensen; Fmax - maksimal frekvens for signalspekteret. Med andre ord må signaldigitaliseringsfrekvensen (ADC samplingsfrekvens) være minst 2 ganger høyere enn den maksimale frekvensen til signalet vi ønsker å måle.

Hva vil skje hvis vi tar prøver med en lavere frekvens enn det som kreves av Kotelnikovs teorem?

I dette tilfellet oppstår "aliasing"-effekten (også kjent som den stroboskopiske effekten, moiré-effekten), der et høyfrekvent signal, etter digitalisering, blir til et lavfrekvent signal, som faktisk ikke eksisterer. I fig. 5 rød høyfrekvent sinusbølge er et ekte signal. En blå sinusoide med lavere frekvens er et fiktivt signal som oppstår på grunn av at i løpet av samplingstiden rekker mer enn en halv periode av høyfrekvente signalet å passere.


Ris. 11. Utseendet til et falskt lavfrekvent signal med en utilstrekkelig høy samplingshastighet

For å unngå aliasing-effekten er det plassert et spesielt anti-aliasing-filter foran ADC - et lavpassfilter (LPF), som sender frekvenser under halvparten av ADC-samplingsfrekvensen, og kutter av høyere frekvenser.

For å beregne spekteret til et signal fra dets diskrete sampler, brukes den diskrete Fourier-transformasjonen (DFT). La oss merke igjen at spekteret til et diskret signal "per definisjon" er begrenset av frekvensen Fmax, som er mindre enn halvparten av samplingsfrekvensen Fd. Derfor kan spekteret til et diskret signal representeres av summen av et endelig antall harmoniske, i motsetning til den uendelige summen for Fourier-serien til et kontinuerlig signal, hvis spektrum kan være ubegrenset. I følge Kotelnikovs teorem må den maksimale frekvensen til en harmonisk være slik at den står for minst to sampler, derfor er antallet harmoniske lik halvparten av antallet samples av et diskret signal. Det vil si at hvis det er N sampler i samplet, vil antallet harmoniske i spekteret være lik N/2.

La oss nå vurdere den diskrete Fourier-transformasjonen (DFT).

Sammenligning med Fourier-serier

Vi ser at de er sammenfallende, bortsett fra at tiden i DFT er diskret av natur og antallet harmoniske er begrenset av N/2 - halvparten av antallet sampler.

DFT-formler er skrevet i dimensjonsløse heltallsvariabler k, s, hvor k er antallet signalprøver, s er antallet spektralkomponenter.
Verdien s viser antall komplette harmoniske oscillasjoner over periode T (varighet av signalmåling). Den diskrete Fourier-transformasjonen brukes til å finne amplitudene og fasene til harmoniske ved hjelp av en numerisk metode, dvs. "på datamaskinen"

Gå tilbake til resultatene som ble oppnådd i begynnelsen. Som nevnt ovenfor, når en ikke-periodisk funksjon (vårt signal) utvides til en Fourier-serie, tilsvarer den resulterende Fourier-serien faktisk en periodisk funksjon med periode T (fig. 12).


Fig. 12 Periodisk funksjon f(x) med periode T0, med måleperiode T>T0

Som det kan sees i fig. 12, er funksjonen f(x) periodisk med periode T0. Men på grunn av det faktum at varigheten av måleprøven T ikke sammenfaller med perioden til funksjonen T0, har funksjonen oppnådd som en Fourier-serie en diskontinuitet i punkt T. Som et resultat vil spekteret til denne funksjonen inneholde et stort antall høyfrekvente harmoniske. Hvis varigheten av måleprøven T falt sammen med perioden for funksjonen T0, ville spekteret oppnådd etter Fourier-transformasjonen bare inneholde den første harmoniske (sinusformet med en periode lik samplingsvarigheten), siden funksjonen f(x) er en sinusoid.

Med andre ord, DFT-programmet "vet ikke" at signalet vårt er en "bit av en sinusoid", men prøver å representere en periodisk funksjon i form av en serie, som har en diskontinuitet på grunn av inkonsistensen til individuelle deler av en sinusoid.

Som et resultat dukker det opp harmoniske i spekteret, som skal oppsummere formen til funksjonen, inkludert denne diskontinuiteten.

For å oppnå det "riktige" spekteret til et signal, som er summen av flere sinusoider med forskjellige perioder, er det derfor nødvendig at et helt antall perioder av hver sinusoid passer inn i signalmåleperioden. I praksis kan denne betingelsen oppfylles for en tilstrekkelig lang varighet av signalmålingen.


Fig. 13 Eksempel på funksjonen og spekteret til girkassens kinematiske feilsignal

Med kortere varighet vil bildet se "verre" ut:


Fig. 14 Eksempel på funksjonen og spekteret til et rotorvibrasjonssignal

I praksis kan det være vanskelig å forstå hvor de "virkelige komponentene" er og hvor er "artefaktene" forårsaket av komponentenes ikke-flere perioder og varigheten av signalsamplingen eller "hopp og brudd" i signalformen . Selvfølgelig er ordene "ekte komponenter" og "artefakter" satt i anførselstegn av en grunn. Tilstedeværelsen av mange harmoniske på spektrumgrafen betyr ikke at signalet vårt faktisk "består" av dem. Dette er det samme som å tenke at tallet 7 "består" av tallene 3 og 4. Tallet 7 kan representeres som summen av tallene 3 og 4 - dette er riktig.

Så vårt signal ... eller rettere sagt ikke engang "vårt signal", men en periodisk funksjon som består av å gjenta signalet vårt (sampling) kan representeres som en sum av harmoniske (sinusbølger) med visse amplituder og faser. Men i mange tilfeller som er viktige for praksis (se figurene ovenfor), er det faktisk mulig å assosiere harmoniske oppnådd i spekteret med reelle prosesser som er sykliske i naturen og gir et betydelig bidrag til signalformen.

Noen resultater

1. Et reelt målt signal med en varighet på T sekunder, digitalisert av en ADC, det vil si representert av et sett med diskrete sampler (N stykker), har et diskret ikke-periodisk spektrum, representert av et sett med harmoniske (N/ 2 stykker).

2. Signalet er representert av et sett med reelle verdier og spekteret er representert av et sett med reelle verdier. Harmoniske frekvenser er positive. Det faktum at det er mer praktisk for matematikere å representere spekteret i kompleks form ved å bruke negative frekvenser, betyr ikke at "dette er riktig" og "dette bør alltid gjøres."

3. Et signal målt over et tidsintervall T bestemmes kun over et tidsintervall T. Hva som skjedde før vi begynte å måle signalet, og hva som vil skje etter det, er ukjent for vitenskapen. Og i vårt tilfelle er det ikke interessant. DFT til et tidsbegrenset signal gir dets "sanne" spekter, i den forstand at det under visse forhold lar en beregne amplituden og frekvensen til komponentene.

Materialer som brukes og andre nyttige materialer.

En LCD-indikator med to linjer brukes som en visningsenhet. Hovedpoenget i implementeringen av dette prosjektet er ikke maskinvaren, men programvaren, mer presist implementeringen av den diskrete Fourier-transformasjonen (DFT) på en 8-bits mikrokontroller. Det skal bemerkes med en gang at forfatteren ikke er en ekspert på dette feltet og startet derfor med det grunnleggende - med en enkel diskret Fourier-transformasjon. Den raske Fourier-transformasjonsalgoritmen er ikke bare rask, men også ganske kompleks.

Discrete Fourier Transform (i engelsk litteratur DFT, Discrete Fourier Transform) er en av Fourier-transformasjonene som er mye brukt i digitale signalbehandlingsalgoritmer (modifikasjonene brukes i lydkomprimering i MP3, bildekomprimering i JPEG, etc.), så vel som i andre områder knyttet til analyse av frekvenser i et diskret (for eksempel digitalisert analogt) signal. Den diskrete Fourier-transformasjonen krever en diskret funksjon som input. Slike funksjoner lages ofte ved sampling (samplingverdier fra kontinuerlige funksjoner).

Skjematisk diagram av en spektrumanalysator lydsignal er veldig enkel og kan grovt deles inn i en digital del og en analog del.

Den digitale delen er dannet av en mikrokontroller og en LCD-indikator koblet til den. Mikrokontrolleren er klokket fra kvartsresonator 16 MHz, forsyningsspenningen på +5 V brukes som referansespenning for ADC til mikrokontrolleren.
Databussen til LCD-indikatoren er koblet til port C på mikrokontrolleren (inngangs-/utgangslinjer PC0-PC3), kontrollbussen er koblet til port D (PD5, PD6) på mikrokontrolleren. Indikatoren fungerer i 4-bits modus. En variabel motstand med en nominell verdi på 4,7 kOhm brukes til å justere kontrasten. For å jobbe med indikatoren ble det opprettet egendefinerte symboler for å vise 8 horisontale kolonner i analysatoren.

Mikrokontrolleren opererer fra en ekstern 16 MHz kvartsresonator.

Den analoge delen av enheten er den viktigste delen og er en forforsterker av elektretmikrofonsignalet, hvis utgang er koblet til ADC0-kanalen til ADC innebygd i mikrokontrolleren. Vi må sette nullnivået på ADC-inngangen til nøyaktig halvparten av referansespenningen, dvs. 2,5 V. I dette tilfellet kan vi bruke den positive og negative halvbølgen til signalet, men amplituden bør ikke overstige den etablerte grensen, dvs. Forsterkningen må finjusteres for å forhindre overbelastning. Alle de ovennevnte betingelsene oppfylles av en felles laveffekts operasjonsforsterkermikrokrets.

DFT-algoritmen er litt tregere sammenlignet med Fast Fourier Transform. Men vår spektrumanalysator krever ikke høy hastighet, og hvis den kan gi en oppdateringshastighet på rundt 30 bilder per sekund, vil dette være mer enn nok til å visualisere spekteret til et lydsignal. I alle fall, i vår versjon er det mulig å oppnå en hastighet på 100 bilder per sekund, men dette er allerede en for høy parameterverdi for en LCD-indikator med to linjer og anbefales ikke. Samplingsfrekvensen er 20 kHz for en 32-punkts diskret Fourier-transformasjon og siden resultatet av transformasjonen er symmetrisk trenger vi kun å bruke den første halvdelen, dvs. første 16 resultater. Derfor kan vi vise frekvensspekteret opp til 10 kHz og analysatoroppløsningen er 10 kHz/16 = 625 Hz.

Forfatteren av designet gjorde forsøk på å øke hastigheten på DFT-beregninger. Hvis denne transformasjonen har N poeng, må vi finne N2/2-verdier av sinus og cosinus. For vår 32-punktstransformasjon må vi finne 512 sinus- og cosinusverdier. Men før vi finner dem, må vi beregne vinkelen (grader), noe som vil ta litt CPU-tid, så det ble bestemt å bruke verditabeller for disse beregningene. Ved beregning i mikrokontrollerprogrammet brukes ikke flyttall og doble presisjonstall, da dette vil ta lengre tid å behandle på en 8-bits mikrokontroller. I stedet bruker verdiene i oppslagstabellene 16-bits heltallsdata multiplisert med 10000. Deretter, etter at konverteringen er utført, deles resultatene på 10000. Med denne tilnærmingen er det mulig å utføre 120 32-punkts konverteringer pr. andre, noe som er mer enn nok for enhetene våre.

Demonstrasjon av driften av en spektrumanalysator på en ATmega32 mikrokontroller

Nedlastinger

Kildekode (mikrokontrollerprogram, sinus-, cosinus- og vinkeldatatabeller) -

  • Det er tydelig at det er vanskelig å gå lenger enn lys og musikk på en AVR, parameterne stemmer ikke. Men 120 32-punkts konverteringer per sekund kan være tilstrekkelig for de fleste oppgaver. Og selvfølgelig kan du ta en ny 625Hz prøve, eller rettere sagt miste oppdateringsfrekvensen. Det er verdt å merke seg at MK vil føle seg dårlig når det gjelder ytelse, det er lite annet du kan feste på den. Men her kan du organisere resultatet av resultatet ved hjelp av maskinvaredataoverføringsmetoder. Da vil det være en ekstra mikrokontroller, og den viktigste vil bare motta data fra den og behandle den kompatibel med andre prosesser. I det store og hele avhenger det fortsatt av frekvensen til prosessoren. En gang var det mulig å overklokke megaen over 20 MHz, men for disse oppgavene vil vi nok bare få feil ved høye frekvenser. Ideen er god, hvis bare flere av de matematiske delene ville blitt skrevet... det er implementeringen på MK
  • Jeg har også laget mer interessante analysatorer: You Tube eller en farge LCD-versjon: You Tube er basert på det berømte Chen-biblioteket :)
  • "vi må beregne vinkelen (grader)" Kan noen fortelle oss mer detaljert hvordan verdiene for disse tabellene beregnes?
  • Alt er klart med tabellen over sinus og cosinus. Det er ikke klart hvordan verdiene i grade_lookup-tabellen beregnes?

Alle signaler, enten du har laget dem eller observert dem i universet, er egentlig bare summen av enkle sinusbølger med forskjellige frekvenser.

Jeg laget en liten lydspektrumanalysator (0 - 10 kHz) fra en 16x2 LCD og en ATmega32 mikrokontroller. Jeg startet med enkle DFT-er (Discrete Fourier Transform). FFT (Fast Fourier Transform) skiller seg fra DFT bare i større hastighet og en litt mer kompleks algoritme, jeg brukte den ikke, kanskje jeg legger den til senere.

DFT er treg sammenlignet med FFT. LCD-spektrumanalysatoren min krever ikke den høye hastigheten som FFT kan gi, og hvis bildet på skjermen endres med en hastighet på ca 30 bilder/sek., så er dette mer enn nok til å visualisere lydspekteret. Men jeg kan allerede nå rundt 100 fps, men for høy oppdateringsfrekvens anbefales ikke for en LCD. Lyd samplet ved 20 kHz produserer 32 DFT-punkter. Siden transformasjonsresultatet er symmetrisk, trenger jeg bare å bruke de første 16 resultatene. Følgelig er den maksimale frekvensen 10 kHz. Dermed er 10kHz/16 = 625Hz.

Jeg prøvde å øke hastigheten på DFT-beregningen. Hvis det er et punkt N DFT, må vi finne sinus og cosinus (N^2)/2 For en 32-punkts DFT må vi finne sinus og cosinus til 512. Før vi finner sinus og cosinus. vi må finne vinkelen (grader) som opptar litt CPU-tid. For å gjøre dette laget jeg tabeller for sinus og cosinus. Jeg laget sinus og cosinus 16-bits variabler ved å multiplisere sinus- og cosinusverdiene med 10000. Etter konverteringen må jeg dele hvert resultat med 10000. Nå kan jeg beregne 120 32-punkts DFT per sekund, som er mer enn nok for en spektrumanalysator.

Vise

Jeg brukte egendefinerte LCD-tegn lastet inn i 64 byte med innebygd LCD-minne. Jeg så en video på nettet der en 16x2 LCD-skjerm brukes som en spektrumanalysator, og brukte den ideen.

Lydinngang

En av de viktigste delene av en spektrumanalysator er å hente signalet fra en elektretmikrofon. Spesiell oppmerksomhet bør rettes mot utviklingen forforsterker for mikrofon. Vi må sette nullnivået ved ADC-inngangen og maksimalnivået lik halve forsyningsspenningen, dvs. 2,5V. Den kan forsynes med spenning fra -2,5V til +2,5V. Forforsterkeren må konfigureres slik at den ikke overskrider disse grensene. Jeg brukte en LM324 op-forsterker som mikrofonforforsterker.

Liste over radioelementer

Betegnelse Type Valør Mengde MerkButikkNotisblokken min
Vise
MK AVR 8-bit

ATmega32

1 Til notisblokk
Kondensator22 pF2 Til notisblokk
Kondensator0,1 µF1 Til notisblokk
Elektrolytisk kondensator100 µF1 Til notisblokk
Motstand

100 Ohm

1 Til notisblokk
Trimmermotstand4,7 kOhm1 Til notisblokk
Kvarts resonator16 MHz1 Til notisblokk
LCD-skjerm16x21 Til notisblokk
kraftenhet5 V1 Til notisblokk
Lydinngang
U1 Operasjonsforsterker

LM324

1 Til notisblokk
C1 Kondensator1 µF1 Til notisblokk
C8 Kondensator0,01 µF1 Til notisblokk
R1 Motstand

220 kOhm

1 Til notisblokk
R2, R3 Motstand

10 kOhm

2 Til notisblokk
R4, R9 Motstand

1 kOhm

2 Til notisblokk
R5 Motstand

Det finnes mange spesialiserte prosessorer for digital signalbehandling (DSP), slik som DSP fra Texas Instruments TMS320-serien, som inkluderer både enkle heltallskjerner og slike monstre som C6000-familiens underfamilie som behandler flyttallsdata. Det er en hel ADSP-serie fra Analog Devices (som inkluderer den mer eller mindre universelle BlackFin), det er også flere enkle løsninger fra MicroChip - dsPIC.

En spesialisert DSP er imidlertid bra, men er det alltid så nødvendig? Ja, med en enorm informasjonsflyt er den rett og slett uerstattelig, men det finnes også enklere behandlingsoppgaver. Spesielt var jeg interessert i oppgaven med dobbel konvertering - lydsignalet er konvolvert, og oppnår dermed et spektrum, deretter kan alle operasjoner utføres på spekteret og den inverse konverteringen kan utføres, og dermed oppnå et behandlet signal. Alt dette må gjøres i sanntid og få kvalitet som ikke er lavere enn telefonkvalitet.

Dette er ikke år 2000, det er enkeltbrikkeløsninger basert på høyytelses ARM7/Cortex-M3-kjerner som har falt betydelig i pris, de er 32-biters, har en maskinvareimplementering av en 32-bits multiplikasjonsoperasjon (i tillegg , nesten en DSP-multiog 64-bits resultat), og Cortex-M3 inkluderer også maskinvaredivisjon.

Jeg vil med en gang advare deg om at signalbehandling ikke er min spesialitet, nesten all kunnskapen (eller rettere sagt, forståelsen av prinsippene) ble bevart fra instituttet, men nå ville jeg bare teste og implementere det. Det jeg mener er at det kan være unøyaktigheter i beskrivelsen, substitusjon av begreper osv. Faktisk bekymret ikke akademisk nøyaktighet meg særlig.

For nesten alle DSP er oppgaven skissert ovenfor enkel og grei. Men hvordan vil en generell RISC-kjerne oppføre seg på den? Hvis vi vurderer AVR eller PIC, vil de neppe være nok. 8-bit og lav klokkefrekvens har en effekt. Selv om Elm-Chan har design der han utfører en FFT på AVR og tegner spekteret til signalet. Men i dette tilfellet, i sanntid, gjøres ganske enkelt visualisering (med minimal prosesseringsnøyaktighet), og ikke fullstendig signalbehandling med akseptabel lydkvalitet.

LPC2146 ble valgt som en eksperimentell brikke, basert på ARM7TDMI-S-kjernen og med en maksimal klokkefrekvens på 60 MHz (i praksis fungerer den ikke på 72 eller til og med 84 MHz). Hvorfor? For det første har jeg et debug-kort for det, og for det andre er det en ADC og DAC ombord, dvs. minimal ekstern trim nødvendig.

Litt teori

Først av alt var det interessant å evaluere ytelsen til FFT (Fast Fourier Transform) på ARM-mikrokontrollere. Basert på denne vurderingen kan vi konkludere om den har nok hastighet til å behandle en strøm av lyddata, og signalet med hvilken samplingsfrekvens og hvor mange kanaler som kan behandles på en slik mikrokontroller.

Basert på Fourier-transformasjonen kan du bygge smarte filtre (med svært attraktive egenskaper). Jeg var først og fremst interessert i problemene med å endre tonen i signalet (øke og senke spekteret) og "reflektere" spekteret. Sistnevnte kreves i SDR-radioer for å lytte til LSB-radiosendinger med lavere sidebånd.

Jeg vil ikke laste deg med teori og forklare hva Fourier-transformasjonen er det er ganske mye materiale om dette emnet, fra det jeg brukte: en wiki og et kapittel fra en veldig god og informativ bok.

Programvareimplementering

Det er mange programvareimplementeringer av FFT, men jeg skrev min egen. Hovedmålet jeg forfulgte var å optimalisere koden for en spesifikk arkitektur. For det første fokuserte jeg umiddelbart på 32-bit, for det andre var det kun nødvendig med heltallsberegninger og det var ønskelig å unngå divisjonsoperasjonen. Å finne noe ferdig for å oppfylle disse kravene er allerede problematisk.

Alle konstanter som kunne beregnes på forhånd ble beregnet og plassert i tabeller (for det meste verdiene til trigonometriske funksjoner). Dette er hovedoptimaliseringen av algoritmen, ellers gjentar den nesten fullstendig den beskrevne algoritmen.

Det viktigste er kravet til heltallsberegninger. Under implementeringsprosessen var det til og med en feil som forårsaket overløp i en av 32-bits sløyfevariablene. Dessuten dukket det ikke opp på alle testdata, så det forårsaket ganske hodepine før det ble funnet.

Jeg samlet alle kildetekstene i ett arkiv. Implementeringen er ikke endelig, det er dupliserte beregninger (spekter og fasesymmetri er ikke tatt i betraktning), og optimalisering av bruken av buffere er nødvendig, siden det for tiden brukes for mange til beregninger tilfeldig tilgang minne(nesten 12k for en konvertering på 1024 punkter).

Første tester

Trommelrull: Jeg tester konverteringshastigheten for en prøve på 1024 poeng, prosessorens kjernefrekvens er 60 MHz. Testing ble utført i en emulator, så den hevder ikke å være 100% nøyaktig, men dette resultatet kan brukes som en indikator (i min tidligere erfaring, selv om emulatoren løy, var det ikke mye). Test av den første versjonen av koden, RealView MDK-kompilator, O3-optimeringsalternativ, ARM-kodegenereringsmodus.

Så det vi ser:

6ms for hver konvertering, totalt i overkant av 12ms for rundturskonverteringen. Det viser seg at med en samplingsfrekvens på 44100Hz (standard for lyd) og sampler med en oppløsning på opptil 16 bits, vil rene beregninger ta ~44*12ms = 528ms. Og dette er på en mellomversjon av fastvaren, når noen kodeoptimaliseringer ennå ikke er fullført (ifølge estimater kan algoritmen akselereres med nesten 2 ganger)! Etter min mening er det bare en utmerket indikator.

Totalt forventes kjernebelastningen å være rundt 50 %, ytterligere 50 % gjenstår for konverteringer over spekteret og overheadkostnader ved arbeid med ADC-er, DAC-er og andre dataoverføringer. Hvis du senker samplingsfrekvensen til "telefon"-nivået (ca. 4800-9600Hz), vil kjernebelastningen være enda lavere (ca. 15-30%).

Så den matematiske delen er mer eller mindre klar. Du kan gå videre til konkret implementering.

Jern

For testplattformen brukte vi et Keil MCB2140 utviklingskort med høyttaler. En Mini-Jack-ledning er loddet for å koble til den lineære utgangen på enheten og en enkel inngangskjede er satt sammen. Som allerede nevnt har brettet allerede en høyttaler koblet til den analoge utgangen på mikrokontrolleren og det er kontroller (knapp og potensiometer).

Her er en skisse av inngangskretsen:


Feilsøking av programvaren skjedde i trinn:

  1. Feilsøking av alt nødvendig periferiutstyr: ADC, DAC, timere, LED-indikasjon.
  2. Test med signaldigitalisering: Jeg digitaliserer dataene med ønsket hastighet og legger dem i en buffer, så trekker jeg ut dataene fra bufferen og spiller av signalet. De. enkel signalforskyvning i tid, uten noen transformasjoner. På dette stadiet testes mekanismen for å arbeide med 2 buffere, nødvendig for videre arbeid.
  3. TIL forrige versjon direkte og inverse Fourier-transformasjoner legges til. Denne testen verifiserer til slutt riktig funksjon av FFT-koden, samt kontrollerer at koden passer innenfor den tilgjengelige ytelsen.
  4. Etter dette er hovedskjelettet til applikasjonen ferdig, du kan gå videre til praktiske applikasjoner.

Problemet oppsto etter å ha lagt til FFT i koden: fremmed støy og fløyter dukket opp i signalet. Generelt virket denne oppførselen ganske merkelig for meg, fordi... Uten konvertering forble signalet som passerer gjennom den digitale banen ganske rent. Den første grunnen til dette: etter den analoge kretsen var signalamplituden på ADC ikke full (0-3,3V), men bare innenfor 0,5-2V ved maksimalt volum til spilleren, den andre: ganske sterk støy på grunn av heltall beregninger (+-1 enhet, som viste seg å være tilstrekkelig til å forårsake hørbar interferens).

For å bekjempe det første problemet, ble det besluttet å begynne å justere den analoge delen. Og for å løse problemet med støy, prøv å bruke et lavpassfilter.

Applikasjon 1: endre tonen på signalet

Brettet har et potensiometer ( variabel motstand), kan den brukes til kontroll. I dette tilfellet setter den signalspekteret til å skifte opp og ned, ganske nok til å "transformere" favorittkomposisjonene dine.

Her er hva som skjer i frekvensdomenet:


I dette tilfellet er konverteringsresultatet inneholdt i 2 buffere. En buffer er den virkelige delen, og den andre er den imaginære delen. Den fysiske betydningen av tallene oppnådd i dem: den virkelige delen inneholder verdiene til harmonikkene, den imaginære delen inneholder faseforskyvningen for disse harmoniske. Dessuten, som du kan se, er startsignalet beskrevet av N-verdier, og etter konvertering oppnås 2N-verdier. Informasjonsmengden endres ikke, og 2-doblingen i informasjonsmengden oppstår på grunn av at bufferdataene har redundans i form av duplisering av verdier.




Topp