Praktisk tillämpning av Fouriertransformen för signalbehandling. Digital signalbehandling på ARM7 mikrokontroller Fourier transform avr

Fouriersatsen säger att vilken signal som helst kan expanderas till en serie i termer av en ortonormal uppsättning periodiska funktioner (till exempel i termer av sinus och cosinus) med frekvenser som är multiplar av frekvensen för den periodiska signalen. Sålunda är spektralanalysen av signalen baserad på sökningen efter viktkoefficienter (i det allmänna fallet, komplexa), vars modul motsvarar bråkdelen av oscillationskraften för motsvarande överton som införs i den allmänna överlagringen av alla övertoner .

Snabb Fourier Transform

Den snabba Fouriertransformen är en beräkningsalgoritm som framgångsrikt utnyttjar periodicitetsegenskaperna hos trigonometriska funktioner för att undvika onödiga beräkningar i den diskreta Fouriertransformen (DFT), och därigenom hittar koefficienterna i Fourierexpansionen snabbare. Huvudskillnaden från den diskreta transformationen är bara i metoden för att beräkna numeriska värden (algoritm), och inte i själva signalbehandlingen. Och i fallet med FFT, och i fallet med DFT, är beräkningsresultatet detsamma. Det enda kravet för FFT-algoritmen är en provstorlek som är en multipel av N = 2L, där L är ett positivt heltal. De vanligaste bas-2 FFT-algoritmerna är tidsdecimerade och frekvensdecimerade.

I denna artikel implementeras FFT-algoritmen i bas 2 med tidsförtunning (Cooley-Tukey-algoritmen). Det är lätt att få det genom att undersöka några DFT-mönster. Låt oss introducera den så kallade vridningskoefficienten:

I detta fall, i DFT, uttrycks Fourierkoefficienterna för ett antal signalvärden (f0,f1,...,fN-1) av relationen:

Betrakta en signalserie med 4 värden: (f0,f1,f2,f3). Låt oss representera Fouriertransformen i matrisform (normaliseringskoefficienten 1/N anges i kolumnvektorn Cij på höger sida av uttrycket):

Efter att ha skrivit rotationskoefficienterna enligt Euler-formeln och efter att ha bestämt deras värden för k = 0, 1, 2, .. 9, är det möjligt att konstruera ett diagram (fig. 2), från vilket mönstret av upprepade koefficienter är synlig.

Figur 2. Effektserie w för N=4

Genom att ersätta de numeriska värdena i (4) får vi:

Det vill säga värdena på w från w4 är lika med motsvarande värde från w0 till w3. Därefter skriver vi om matrisekvationen (4) i en icke-standardiserad form (liknande beteckningar introduceras för att klargöra ytterligare operationer):

Låt oss byta matrisens kolumner och dela upp den i två grupper: med jämna f0, f2 och udda f1, f3-index:

Vi tar hänsyn till att wk+1 = wkw1, då kommer uttryck (6) att skrivas om som:

Använd förhållanden:

Vi får de önskade expansionskoefficienterna i form av en kolumnvektor med cellvärden:

Den grafiska representationen av algoritmen (fig. 3) ser ut som en fjäril med öppna vingar, så denna beräkningsmetod kallas en "fjäril".

Figur 3. Räkna "Fjäril" för en serie om 4 medlemmar

Så i det första steget av algoritmen delas medlemmarna i en serie signalvärden in i jämna och udda index. Sedan exekveras fjärilsgrafen, den består av två steg, deras antal är lika med kraften av två av provstorleken (N = 4 = 22). Vid varje steg utförs två "fjärilar" och deras totala antal är oförändrat. Varje fjärilsoperation motsvarar en multiplikationsoperation. Som jämförelse: i DFT med ett sampel på (f0,f1,f2,f3), skulle multiplikationsoperationen behöva utföras 4x4 = 16 gånger, och i fallet med FFT, endast 4 gånger.

Denna serie kan också skrivas som:

(2),
där , k-te komplex amplitud.

Förhållandet mellan koefficienterna (1) och (3) uttrycks med följande formler:

Observera att alla dessa tre representationer av Fourier-serien är helt likvärdiga. Ibland, när man arbetar med Fourierserier, är det bekvämare att använda exponenterna för det imaginära argumentet istället för sinus och cosinus, det vill säga att använda Fouriertransformen i komplex form. Men det är bekvämt för oss att använda formeln (1), där Fourierserien representeras som summan av cosinusvågor med motsvarande amplituder och faser. I vilket fall som helst är det felaktigt att säga att resultatet av Fouriertransformen av den verkliga signalen kommer att vara övertonernas komplexa amplituder. Som wikin korrekt säger, "Fouriertransformen (?) är en operation som mappar en funktion av en reell variabel till en annan funktion, också av en reell variabel."

Total:
Den matematiska grunden för spektralanalysen av signaler är Fouriertransformen.

Fouriertransformen tillåter oss att representera en kontinuerlig funktion f(x) (signal) definierad på segmentet (0, T) som summan av ett oändligt antal (oändliga serier) trigonometriska funktioner (sinus och/eller cosinus) med vissa amplituder och faser, även betraktade på segmentet (0, T). En sådan serie kallas Fourierserie.

Vi noterar ytterligare några punkter, vars förståelse krävs för korrekt tillämpning av Fouriertransformen på signalanalys. Om vi ​​betraktar Fourierserien (summan av sinusoider) på hela X-axeln, så kan vi se att utanför segmentet (0, T), kommer funktionen som representeras av Fourierserien periodiskt att upprepa vår funktion.

Till exempel, i grafen i fig. 7, är den ursprungliga funktionen definierad på segmentet (-T \ 2, + T \ 2), och Fourier-serien representerar en periodisk funktion definierad på hela x-axeln.

Detta beror på att sinusoiderna själva är periodiska funktioner, respektive, och deras summa kommer att vara en periodisk funktion.


fig.7 Representation av en icke-periodisk originalfunktion med en Fourier-serie

Således:

Vår ursprungliga funktion är kontinuerlig, icke-periodisk, definierad på något intervall med längden T.
Spektrum av denna funktion är diskret, det vill säga den presenteras som en oändlig serie av harmoniska komponenter - Fourier-serien.
Faktum är att en viss periodisk funktion definieras av Fourier-serien, som sammanfaller med vår på segmentet (0, T), men denna periodicitet är inte väsentlig för oss.

Perioderna för de övertonskomponenter är multiplar av segmentet (0, T) på vilket den ursprungliga funktionen f(x) är definierad. Med andra ord är de harmoniska perioderna multiplar av varaktigheten av signalmätningen. Till exempel är perioden för den första övertonen i Fourierserien lika med intervallet T på vilket funktionen f(x) är definierad. Perioden för den andra övertonen i Fourier-serien är lika med intervallet T/2. Och så vidare (se fig. 8).


fig.8 Perioder (frekvenser) för de harmoniska komponenterna i Fourierserien (här T = 2?)

Följaktligen är frekvenserna för de harmoniska komponenterna multiplar av 1/T. Det vill säga, frekvenserna för de övertonskomponenter Fk är lika med Fk= k\T, där k sträcker sig från 0 till?, till exempel k=0 F0=0; k=1 Fl=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (vid noll frekvens - konstant komponent).

Låt vår ursprungliga funktion vara en signal inspelad i T=1 sek. Då blir perioden för den första övertonen lika med varaktigheten av vår signal T1=T=1 sek och övertonens frekvens är 1 Hz. Perioden för den andra övertonen kommer att vara lika med varaktigheten av signalen dividerat med 2 (T2=T/2=0,5 sek) och frekvensen är 2 Hz. För den tredje övertonen T3=T/3 sek och frekvensen är 3 Hz. Och så vidare.

Steget mellan övertoner är i detta fall 1 Hz.

Således kan en signal med en varaktighet på 1 sek brytas upp i övertonskomponenter (för att erhålla ett spektrum) med en frekvensupplösning på 1 Hz.
För att öka upplösningen med 2 gånger till 0,5 Hz är det nödvändigt att öka mättiden med 2 gånger - upp till 2 sekunder. En signal med en varaktighet på 10 sekunder kan dekomponeras i övertonskomponenter (för att erhålla ett spektrum) med en frekvensupplösning på 0,1 Hz. Det finns inga andra sätt att öka frekvensupplösningen.

Det finns ett sätt att artificiellt öka signalens varaktighet genom att lägga till nollor till samlingen av sampel. Men det ökar inte den verkliga frekvensupplösningen.

3. Diskreta signaler och diskret Fouriertransform

Med utvecklingen av digital teknik har även sätten att lagra mätdata (signaler) förändrats. Om signalen tidigare kunde spelas in på en bandspelare och lagras på band i analog form, digitaliseras nu signalerna och lagras i filer i datorns minne som en uppsättning siffror (räkneverk).

Det vanliga schemat för att mäta och digitalisera en signal är som följer.


fig.9 Schema för mätkanalen

signal från mätgivare anländer till ADC:n under en tidsperiod T. Signalsamplen (sampel) som tas emot under tiden T överförs till datorn och lagras i minnet.


fig.10 Digitaliserad signal - N avläsningar mottagna i tid T

Vilka är kraven på parametrar för signaldigitalisering? En enhet som omvandlar en analog insignal till en diskret kod ( digital signal) kallas en analog-till-digital-omvandlare (ADC) (Wiki).

En av huvudparametrarna för ADC är den maximala samplingshastigheten (eller samplingshastigheten, engelska samplingshastigheten) - frekvensen för att ta sampel av en signal kontinuerligt i tiden under dess sampling. Mätt i hertz. ((Wiki))

Enligt Kotelnikov-satsen, om en kontinuerlig signal har ett spektrum begränsat av frekvensen Fmax, kan den återställas helt och unikt från dess diskreta sampel tagna med tidsintervall , dvs. med frekvens Fd ? 2*Fmax, där Fd - samplingsfrekvens; Fmax - maximal frekvens för signalspektrumet. Med andra ord måste signalsamplingshastigheten (ADC samplingshastighet) vara minst 2 gånger den maximala frekvensen för signalen som vi vill mäta.

Och vad händer om vi tar avläsningar med en lägre frekvens än vad Kotelnikovs sats kräver?

I det här fallet uppstår effekten av "aliasing" (aka stroboskopisk effekt, moiré-effekt), där den högfrekventa signalen efter digitalisering förvandlas till en lågfrekvent signal som faktiskt inte existerar. På fig. 5 högfrekvent röd sinusvåg är den verkliga signalen. Den lägre frekvensen blå sinusvågen är en dummysignal som härrör från det faktum att mer än en halv period av en högfrekvent signal hinner passera under samplingstiden.


Ris. 11. Uppkomsten av en falsk lågfrekvent signal när samplingshastigheten inte är tillräckligt hög

För att undvika effekten av aliasing placeras ett speciellt anti-aliasing-filter framför ADC - LPF (lågpassfilter), som släpper igenom frekvenser under halva ADC-samplingsfrekvensen och skär av högre frekvenser.

För att beräkna spektrumet av en signal från dess diskreta sampel, används den diskreta Fouriertransformen (DFT). Vi noterar återigen att spektrumet för en diskret signal är "per definition" begränsat av frekvensen Fmax, som är mindre än hälften av samplingsfrekvensen Fd. Därför kan spektrumet för en diskret signal representeras av summan av ett ändligt antal övertoner, i motsats till den oändliga summan för Fourierserien av en kontinuerlig signal, vars spektrum kan vara obegränsat. Enligt Kotelnikov-satsen måste den maximala övertonsfrekvensen vara sådan att den står för minst två sampel, så antalet övertoner är lika med hälften av antalet sampel av den diskreta signalen. Det vill säga, om det finns N sampel i samplet, kommer antalet övertoner i spektrumet att vara lika med N/2.

Betrakta nu den diskreta Fouriertransformen (DFT).

Jämför med Fourier-serien

Vi ser att de sammanfaller, förutom att tiden i DFT är diskret och antalet övertoner är begränsat till N/2 - hälften av antalet sampel.

DFT-formlerna är skrivna i dimensionslösa heltalsvariabler k, s, där k är antalet signalsampel, s är antalet spektrala komponenter.
Värdet på s visar antalet helsvängningar av övertonen i perioden T (längden på signalmätningen). Den diskreta Fouriertransformen används för att hitta amplituder och faser för övertoner numeriskt, dvs. "på datorn"

Återgå till resultaten från början. Som nämnts ovan, när man expanderar en icke-periodisk funktion (vår signal) till en Fourier-serie, motsvarar den resulterande Fourier-serien faktiskt en periodisk funktion med period T. (Fig. 12).


fig.12 Periodisk funktion f(x) med period Т0, med mätperiod Т>T0

Som kan ses i fig. 12 är funktionen f(x) periodisk med period Т0. På grund av det faktum att varaktigheten av mätprovet T inte sammanfaller med perioden för funktionen T0, har funktionen som erhålls som en Fourier-serie en diskontinuitet vid punkten T. Som ett resultat kommer spektrumet för denna funktion att innehåller ett stort antal högfrekventa övertoner. Om varaktigheten av mätsamplet T sammanföll med perioden för funktionen T0, så skulle endast den första övertonen (en sinusform med en period lika med samplingens varaktighet) finnas närvarande i spektrumet som erhålls efter Fouriertransformen, eftersom funktionen f (x) är en sinusform.

Med andra ord, DFT-programmet "vet inte" att vår signal är en "bit av en sinusvåg", men försöker representera en periodisk funktion som en serie, som har ett gap på grund av inkonsekvensen hos de enskilda delarna av sinusvågen.

Som ett resultat av detta uppstår övertoner i spektrumet, som totalt ska representera funktionens form, inklusive denna diskontinuitet.

För att erhålla det "korrekta" spektrumet av signalen, som är summan av flera sinusoider med olika perioder, är det således nödvändigt att ett heltal av perioder för varje sinusform passar in på signalmätperioden. I praktiken kan detta villkor uppfyllas under en tillräckligt lång varaktighet av signalmätningen.


Fig.13 Ett exempel på funktion och spektrum för signalen för växellådans kinematiska fel

Med en kortare varaktighet kommer bilden att se "sämre" ut:


Fig.14 Ett exempel på funktionen och spektrumet för rotorns vibrationssignal

I praktiken kan det vara svårt att förstå var de "riktiga komponenterna" finns och var är "artefakterna" orsakade av icke-mångfalden av komponenternas perioder och varaktigheten av signalsamplet eller "hopp och avbrott" av vågformen. Naturligtvis är orden "riktiga komponenter" och "artefakter" inte förgäves citerade. Närvaron av många övertoner på spektrumgrafen betyder inte att vår signal faktiskt "består" av dem. Det är som att tro att siffran 7 "består" av siffrorna 3 och 4. Siffran 7 kan representeras som summan av siffrorna 3 och 4 - det stämmer.

Så är vår signal ... eller snarare, inte ens "vår signal", utan en periodisk funktion som sammanställs genom att repetera vår signal (sampling) kan representeras som en summa av övertoner (sinusformar) med vissa amplituder och faser. Men i många fall som är viktiga för praktiken (se figurerna ovan) är det verkligen möjligt att relatera de övertoner som erhålls i spektrumet till verkliga processer som är cykliska till sin natur och som ger ett betydande bidrag till signalformen.

Några resultat

1. Den verkliga uppmätta signalen, varaktighet T sek, digitaliserad av ADC, det vill säga representerad av en uppsättning diskreta sampel (N stycken), har ett diskret icke-periodiskt spektrum, representerat av en uppsättning övertoner (N/2 stycken) ).

2. Signalen representeras av en uppsättning verkliga värden och dess spektrum representeras av en uppsättning verkliga värden. De harmoniska frekvenserna är positiva. Det faktum att det är bekvämare för matematiker att representera spektrumet i en komplex form med hjälp av negativa frekvenser betyder inte att "det är rätt" och "det ska alltid göras på det här sättet".

3. Signalen som mäts på tidsintervallet T bestäms endast på tidsintervallet T. Vad som hände innan vi började mäta signalen, och vad som kommer att hända efter det - detta är okänt för vetenskapen. Och i vårt fall - det är inte intressant. DFT för en tidsbegränsad signal ger sitt "riktiga" spektrum, i den meningen att den under vissa förhållanden låter dig beräkna amplituden och frekvensen för dess komponenter.

Begagnade material och andra användbara material.

En LCD-indikator med två rader används som displayenhet. Huvudpunkten i genomförandet av detta projekt är inte hårdvaran, utan mjukvaran, eller snarare implementeringen av den diskreta Fourier-transformen (DFT) på en 8-bitars mikrokontroller. Det bör genast noteras att författaren inte är någon expert på detta område och därför utgick från grunderna - med en enkel diskret Fouriertransform. Algoritmen för snabb Fouriertransform är inte bara snabb utan också ganska komplex.

Discrete Fourier Transform (i den engelska litteraturen DFT, Discrete Fourier Transform) är en av Fouriertransformerna som ofta används i digitala signalbehandlingsalgoritmer (dess modifieringar används vid ljudkomprimering i MP3, bildkomprimering i JPEG, etc.), samt inom andra områden relaterade till analys av frekvenser i en diskret (till exempel digitaliserad analog) signal. Den diskreta Fouriertransformen kräver en diskret funktion som indata. Sådana funktioner skapas ofta genom sampling (samplingvärden från kontinuerliga funktioner).

Schematiskt diagram av en spektrumanalysator ljudsignal Det är väldigt enkelt och villkorligt kan det delas upp i en digital del och en analog.

Den digitala delen bildas av en mikrokontroller och en LCD-indikator ansluten till den. Mikrokontrollern är klockad kvartsresonator 16 MHz, +5 V matningsspänning används som referensspänning för mikrokontrollerns ADC.
LCD-indikatorns databussen är ansluten till C-porten på mikrokontrollern (I/O-linjer PC0-PC3), kontrollbussen är ansluten till D(PD5, PD6)-porten på mikrokontrollern. Indikatorn fungerar i 4-bitarsläge. Ett 4,7 kΩ variabelt motstånd används för att justera kontrasten. För att arbeta med indikatorn skapades anpassade tecken för att visa 8 horisontella streck i analysatorn, dessa anpassade tecken upptar alla 64 byte av LCD-indikator-RAM.

Mikrokontrollern drivs av en extern 16 MHz kvartsresonator.

Den analoga delen av enheten är den viktigaste delen och är en förförstärkare av elektretmikrofonsignalen, vars utgång är ansluten till ADC0-kanalen på ADC:n inbyggd i mikrokontrollern. Vi måste ställa in nollnivån vid ADC-ingången till exakt halva referensspänningen, d.v.s. 2,5 V. I det här fallet kan vi använda signalens positiva och negativa halvvåg, men dess amplitud bör inte överstiga den inställda gränsen, dvs. förstärkningen måste finjusteras för att förhindra överbelastning. Alla ovanstående villkor uppfylls av ett vanligt lågeffekts operationsförstärkarchip.

DFT-algoritmen är något långsammare jämfört med Fast Fourier Transform. Men vår spektrumanalysator kräver ingen hög hastighet, och om den kan ge en uppdateringshastighet på cirka 30 bilder per sekund kommer detta att vara mer än tillräckligt för att visualisera spektrumet av en ljudsignal. I alla fall är det i vår version möjligt att uppnå en hastighet på 100 bilder per sekund, men detta är redan ett för högt parametervärde för en LCD-indikator med två rader och rekommenderas inte. Samplingsfrekvensen är 20 kHz för en 32 punkters diskret Fouriertransform och eftersom resultatet av transformationen är symmetrisk behöver vi bara använda den första halvan dvs. första 16 resultaten. Därför kan vi visa frekvensspektrum upp till 10 kHz och analysatorns upplösning är 10 kHz/16 = 625 Hz.

Författaren till designen gjorde försök att öka hastigheten för att beräkna DFT. Om denna transformation har N punkter måste vi hitta N2/2 sinus- och cosinusvärden. För vår 32-punktstransformation måste vi hitta 512 sinus- och cosinusvärden. Men innan vi hittar dem måste vi beräkna vinkeln (grader), vilket kommer att ta lite processortid, så det beslutades att använda värdetabeller för dessa beräkningar. Beräkningarna i mikrokontrollerprogrammet använder inte flyttalsberäkningar och dubbla precisionstal (dubbel), eftersom det kommer att ta längre tid att bearbeta på en 8-bitars mikrokontroller. Istället är värdena i uppslagstabellerna 16-bitars heltalsdata multiplicerat med 10000. Sedan, efter att konverteringen är utförd, divideras resultaten med 10000. Med detta tillvägagångssätt är det möjligt att utföra 120 32-punktskonverteringar per andra, vilket är mer än tillräckligt för våra enheter.

Demonstration av spektrumanalysatorns funktion på ATmega32 mikrokontroller

Nedladdningar

Källkod (mikrokontrollerprogram, sinus-, cosinus- och vinkeldatatabeller) -

  • Det är klart att på AVR-ke är det svårt att gå längre än lätt musik, inte samma parametrar. Men 120 32-punktskonverteringar per sekund kan räcka för de flesta uppgifter. Ett prov på 625Hz, naturligtvis, du kan ta ett annat, eller snarare, förlora uppdateringsfrekvensen. Det är värt att notera att MK kommer att må dåligt, prestationsmässigt är det lite man kan hänga på. Men här kan du också organisera utfärdandet av resultatet med hårdvarudataöverföringsmetoder. Då kommer det att vara en extra MK, och den viktigaste kommer bara att ta emot data från den och bearbeta den på ett sätt som är kompatibelt med andra processer. I stort sett vilar det fortfarande på processorns frekvens. En gång var det möjligt att överklocka megan över 20 MHz, men för dessa uppgifter kommer vi förmodligen bara att få fel på höga frekvenser. Tanken är bra, om bara mer av mattdelen skulle målas ... det är dess implementering på MK
  • Jag gjorde också mer intressanta analysatorer: You Tube eller en variant på en färg LCD: You Tube är baserad på det berömda Chen-biblioteket :)
  • "vi måste beräkna vinkeln (grader)" Kan någon utveckla hur värdena för dessa tabeller beräknas?
  • Med tabellen över sinus och cosinus är allt klart. Det är inte klart hur värdena i tabellen degree_lookup beräknas?

Alla signaler, oavsett om du uppfann dem eller observerade dem i universum, är egentligen bara summan av enkla sinusoider med olika frekvenser.

Jag gjorde en liten ljudspektrumanalysator (0 - 10 kHz) från en 16x2 LCD och en ATmega32 mikrokontroller. Jag började med enkla DFTs (Discrete Fourier Transform). FFT (Fast Fourier Transform) skiljer sig från DFT endast i högre hastighet och en lite mer komplex algoritm, jag använde den inte, kanske lägger jag till den senare.

DFT är långsam jämfört med FFT. Min LCD-spektrumanalysator kräver inte den höga hastighet som en FFT kan ge, och om skärmen ändras med en hastighet av cirka 30 bilder/sek, så är detta mer än tillräckligt för att visualisera ljudspektrumet. Men jag kan komma till runt 100 fps ändå, men för hög uppdateringsfrekvens rekommenderas inte för en LCD. Ljud samplade vid 20 kHz resulterar i 32 DFT-punkter. Eftersom resultatet av transformationen är symmetriskt behöver jag bara använda de första 16 resultaten. Följaktligen är den maximala frekvensen 10 kHz. Alltså 10kHz/16 = 625Hz.

Jag försökte påskynda beräkningen av DFT. Om det finns en N-punkts DFT måste vi hitta sinus och cosinus för (N^2) / 2. För en 32-punkts DFT måste vi hitta sinus och cosinus för 512. Innan vi letar efter sinus och cosinus måste vi hitta vinkeln (grader) som upptar lite CPU-tid. För att göra detta gjorde jag tabeller för sinus och cosinus. Jag gjorde sinus och cosinus 16-bitarsvariabler genom att multiplicera sinus- och cosinusvärdena med 10000. Efter konverteringen måste jag dividera varje resultat med 10000. Nu kan jag beräkna 120 32-punkts DFT per sekund, vilket är mer än tillräckligt för en spektrumanalysator.

Visa

Jag använde anpassade tecken för LCD-skärmen som laddades in i LCD-skärmens interna minne på 64 bytes. På Internet såg jag en video där en 16x2 LCD används som en spektrumanalysator och använde denna idé.

Ljudingång

En av de viktigaste delarna av en spektrumanalysator är att få signalen från elektretmikrofonen. Särskild uppmärksamhet bör ägnas utvecklingen förförstärkare för mikrofon. Vi måste ställa in nollnivån vid ADC-ingången och maxnivån lika med halva matningsspänningen, d.v.s. 2,5V. Spänning från -2,5V till +2,5V kan appliceras på den. Förförstärkaren måste ställas in för att inte överskrida dessa gränser. Jag använde en LM324 op-förstärkare som mikrofonförförstärkare.

Lista över radioelement

Beteckning Typ Valör Kvantitet NoteraaffärMitt anteckningsblock
Visa
MK AVR 8-bitars

ATmega32

1 Till anteckningsblock
Kondensator22 pF2 Till anteckningsblock
Kondensator0,1 uF1 Till anteckningsblock
Elektrolytkondensator100uF1 Till anteckningsblock
Motstånd

100 ohm

1 Till anteckningsblock
Trimmermotstånd4,7 kOhm1 Till anteckningsblock
Kvartsresonator16 MHz1 Till anteckningsblock
LCD skärm16x21 Till anteckningsblock
kraftenhet5 V1 Till anteckningsblock
Ljudingång
U1 Operationsförstärkare

LM324

1 Till anteckningsblock
C1 Kondensator1 uF1 Till anteckningsblock
C8 Kondensator0,01 uF1 Till anteckningsblock
R1 Motstånd

220 kOhm

1 Till anteckningsblock
R2, R3 Motstånd

10 kOhm

2 Till anteckningsblock
R4, R9 Motstånd

1 kOhm

2 Till anteckningsblock
R5 Motstånd

För digital signalbehandling (DSP) finns det många specialiserade processorer, detta är Texas Instruments TMS320 DSP-serien, som inkluderar både enkla heltalskärnor och sådana monster som C6000-familjens underfamilj som behandlar flyttalsdata. Det finns en hel serie ADSP:er från Analog Devices (som inkluderar den mer eller mindre universella BlackFin), det finns fler enkla lösningar från MicroChip - dsPIC.

En specialiserad DSP är dock bra, men är det alltid så nödvändigt? Ja, med ett enormt informationsflöde är det helt enkelt oumbärligt, men det finns också enklare bearbetningsuppgifter. Specifikt var jag intresserad av uppgiften med dubbelkonvertering - ljudsignalen är konvolverad, och erhåller därigenom ett spektrum, sedan kan alla operationer utföras på spektrumet och den omvända omvandlingen kan utföras, och därigenom erhålla en bearbetad signal. Allt detta måste göras i realtid och få en kvalitet som inte är lägre än en telefon.

Nu är det inte år 2000, det finns enchipslösningar baserade på produktiva ARM7 / Cortex-M3-kärnor som har sjunkit avsevärt i pris, de är 32-bitars, har en hårdvaruimplementering av en 32-bitars multiplikationsoperation (desutom nästan en DSP-multiplikationsoperation med ackumulering och 64-bitars resultat), och Cortex-M3 inkluderar även hårdvarudelning.

Jag vill genast varna för att signalbehandling inte är min profil, nästan all kunskap (eller snarare förståelsen av principerna) har bevarats sedan institutet, nu ville jag bara kolla och implementera dem. Detta menar jag att det kan finnas felaktigheter i beskrivningen, utbyte av begrepp och så vidare. Egentligen störde akademisk noggrannhet mig inte särskilt mycket.

För nästan alla DSP är ovanstående uppgift enkel och lätt. Men hur kommer en allmän RISC-kärna att bete sig på den? Om vi ​​överväger AVR eller PIC, är det osannolikt att de räcker. Det påverkar 8-bitars och låg klockfrekvens. Även om Elm-Chan har design där han utför en FFT på AVR och ritar signalspektrumet. Men i det här fallet görs realtidsrendering bara (med minimal bearbetningsnoggrannhet), och inte full signalbehandling med acceptabel ljudkvalitet.

LPC2146 baserad på ARM7TDMI-S-kärnan och med en maximal klockfrekvens på 60 MHz valdes som ett experimentchip (i praktiken fungerar det inte på 72 eller ens 84 MHz). Varför? För det första har jag ett debug-kort för det, och för det andra finns det en ADC och DAC ombord, d.v.s. minimal extern trimning krävs.

Lite teori

Först och främst var det intressant att utvärdera prestandan hos FFT (Fast Fourier Transform) på ARM-mikrokontroller. Baserat på denna bedömning kan vi dra slutsatsen: kommer den att ha tillräckligt med hastighet för att bearbeta ljuddataströmmen, och signalen med vilken samplingshastighet och hur många kanaler som kan behandlas på en sådan mikrokontroller.

På basis av Fourier-transformen kan du bygga knepiga filter (och med mycket frestande egenskaper). Jag var i första hand intresserad av uppgifterna att ändra signalens ton (höja och sänka spektrumet) och spektrumets "reflektion". Det senare krävs i SDR-radio för att lyssna på en radiosändning i det nedre LSB-sidobandet.

Jag kommer inte att ladda ner teorin och förklara vad Fouriertransformen är, det finns ganska mycket material om detta ämne, från det jag använde: en wiki och ett kapitel från en mycket bra och informativ bok.

Mjukvaruimplementering

Det finns många programvaruimplementationer av FFT, men jag skrev min egen. Det huvudsakliga målet jag eftersträvade var att optimera koden för en specifik arkitektur. För det första fokuserade jag omedelbart på 32-bitars, och för det andra krävdes bara heltalsberäkningar och det var önskvärt att undvika divisionsoperationen. Under dessa krav är det redan problematiskt att hämta något färdigt.

Alla konstanter som kunde beräknas i förväg beräknades och placerades i tabeller (mest värdena för trigonometriska funktioner). Detta är den huvudsakliga optimeringen av algoritmen, annars upprepar den nästan helt den beskrivna algoritmen.

Det viktigaste är kravet på heltalsberäkningar. Under implementeringen gjordes till och med ett misstag, på grund av vilket ett spill inträffade i en av 32-bitars loopvariabler. Dessutom förekom det inte på alla testdata, så det orsakade en anständig huvudvärk tills den hittades.

Jag samlade alla källtexter i ett arkiv. Implementeringen är inte slutgiltig, det finns dubbla beräkningar (symmetrin i spektrum och faser tas inte med i beräkningen), och optimering av användningen av buffertar krävs, eftersom för närvarande används för många för beräkningar random access minne(nästan 12k att konvertera från 1024 poäng).

Första proven

Trumrulle: testa omvandlingens hastighet för ett sampel på 1024 punkter, frekvensen för processorkärnan är 60 MHz. Testning utfördes i emulatorn, så den gör inte anspråk på att vara 100% korrekt, men detta resultat kan användas som en indikator (i min tidigare erfarenhet ljög emulatorn, men inte mycket). Test av den första versionen av koden, RealView MDK-kompilator, O3-optimeringsalternativ, ARM-kodgenereringsläge.

Så vad ser vi:

6ms för varje omvandling, totalt drygt 12ms för omvandlingen tur och retur. Det visar sig att med en samplingshastighet på 44100Hz (standard för ljud) och samplingar med en upplösning på upp till 16 bitar, kommer rena beräkningar att ta ~44 * 12ms = 528ms. Och det här är på en mellanversion av firmware, när vissa kodoptimeringar ännu inte har slutförts (enligt uppskattningar kan algoritmen accelereras med nästan 2 gånger mer)! Jag tycker bara att det är en bra poäng.

Totalt förväntas kärnbelastningen vara runt 50 %, ytterligare 50 % återstår för konverteringar över spektrumet och omkostnader när man arbetar med ADC:er, DAC:er och andra dataöverföringar. Om vi ​​sänker samplingsfrekvensen till "telefon"-nivån (ca 4800-9600Hz), så blir kärnbelastningen ännu lägre (ca 15-30%).

Så den matematiska delen är mer eller mindre tydlig. Du kan gå vidare till en specifik implementering.

Järn

För testplattformen togs ett Keil MCB2140 felsökningskort med högtalare. En Mini-Jack-sladd löddes för anslutning till enhetens linjära utgång och en enkel ingångskedja monterades. Som redan nämnts har kortet redan en högtalare ansluten till den analoga utgången på mikrokontrollern och det finns kontroller (en knapp och en potentiometer).

Här är en skiss av ingångskretsen:


Programvarufelsökning skedde i steg:

  1. Felsökning av all nödvändig kringutrustning: ADC, DAC, timers, LED-indikering.
  2. Testa med signaldigitalisering: Jag digitaliserar data med önskad hastighet och lägger den i bufferten, sedan extraherar jag data från bufferten och spelar upp signalen. De där. enkel signalförskjutning i tid, utan några transformationer. I detta skede testas mekanismen för att arbeta med 2 buffertar, vilket är nödvändigt för fortsatt arbete.
  3. TILL föregående version framåt och invers Fourier-transformerna läggs till. Detta test kontrollerar slutligen korrektheten av FFT-koden, samt kontrollerar att koden passar in i den tillgängliga prestandan.
  4. Efter det är den huvudsakliga ryggraden i applikationen klar, du kan gå vidare till praktiska applikationer.

Problemet uppstod efter att FFT lades till i koden: främmande brus och visslingar dök upp i signalen. I allmänhet verkade detta beteende ganska konstigt för mig, eftersom. utan omvandling förblev signalen som passerade genom den digitala banan ganska ren. Det första skälet till detta: efter den analoga kretsen var amplituden för signalen till ADC inte full (0-3,3V), utan bara inom 0,5-2V vid spelarens maximala volym, den andra: ganska starkt brus på grund av heltalsberäkningar (+ -1 enhet, vilket visade sig vara tillräckligt för uppkomsten av hörbar störning).

För att bekämpa det första problemet beslutades det att börja ställa in den analoga delen. Och för att lösa brusproblemet, försök att använda ett lågpassfilter.

Applikation 1: Ändra signaltonen

Kortet har en potentiometer ( variabelt motstånd), kan den användas för kontroll. I det här fallet ställer den in upp- och nerförskjutningen av signalspektrat, tillräckligt för att "förvandla" dina favoritkompositioner.

Så här händer i frekvensdomänen:


Resultatet av omvandlingen finns i 2 buffertar. En buffert är den verkliga delen och den andra är den imaginära delen. Den fysiska betydelsen av siffrorna som erhålls i dem: den verkliga delen innehåller värdena för övertonerna, den imaginära delen innehåller fasförskjutningen för dessa övertoner. Dessutom, som du kan se, beskrivs den ursprungliga signalen av N-värden, och efter transformationen erhålls 2N-värden. Informationsmängden förändras inte, och ökningen av informationsmängden med 2 gånger beror på att buffertdata har redundans i form av duplicering av värden.




Topp