Stap 3: Software
U vindt de software als Atmel Studio Project op github
Er zijn 2 projecten in deze git. De Basic project omvat alle basisfuncties om te meten en berekenen van de gegevens. Het bevat ook een klasse voor WS2812 LED. De Matrixproject bevat alle gegevens voor mijn project gebaseerd een een 7 x 6 LED-matrix met WS2812 LED. Dit is zeer specifiek, is deze code meer van een inspiratie en voorbeeld voor wat u kunt doen.
Dit deel is de meest complexe van dit project, zoals de software moet doen een heleboel dingen.
Bemonstering van de gegevens
Eerst moet u om de gegevens in de controller. Dit wordt gedaan door het audiosignaal bij een steekproef met een ADC. De sampling-frequentie hangt af van de frequentie-bereik die u wilt werken. Als u genieten van het signaal met een frequentie van 32kHz, die kunt u opnieuw maken signalen tot 16kHz met de Fourier transformatie (FT). Dit is het frequentiebereik, dat we werken willen met.
Te halen zulks werkzaamheden ligt een timer activeren met een frequentie van 32kHz en een waarde afgelezen de ADC telkens wanneer die dit gebeurt. Aangezien de atxmega controller een DMA-controller heeft, wordt dit gebruikt om het proces te automatiseren. DMA (Direct Memory Access) kunt u gegevens verplaatsen van het ene punt in het geheugen naar het andere volledig in hardware. De DMA is ingesteld op een manier dat het beweegt het resultaat van de ADC naar een bepaalde locatie in het RAM-geheugen wanneer het door de timer wordt geactiveerd. We proeven 128 waarden per kanaal.
Snelle Fourier transformatie (FFT)
We gebruiken de elmchan FFT bibliotheek voor dit project.
Meestal een FT gebruikt veel tijd van de berekening, maar u kunt elke frequentie binnen het spectrum van bepaalde signaal opnieuw. De FFT dit proces vereenvoudigt en versnelt het. Het nadeel is, dat geeft geen specifieke frequenties maar beschikbaar te stellen frequentiebanden. Voor de toepassing van dit project is deze gegevens goed genoeg.
Aangezien we 128 waarden proeven, zal de FFT ons 64 resultaten geven. Vanwege de sampling-snelheid (32 kHz) kunnen we opnieuw frequenties tot 16 kHz, die zal worden verdeeld in 64 bands door de FFT. 16000 / 64 = 250. Dit betekent dat elke FFT band beschrijving van het niveau van 250 Hz. FFT band 1 geeft een waarde van 1Hz tot 250Hz, band 2 voor 251Hz tot 500Hz, 3 band voor 501Hz tot 750Hz, enzovoort. Doordat het aantal input monsters kunt u verhogen van deze resolutie, maar ook het verhogen van de berekening van de benodigde tijd.
Deze 64 banden zijn samengevoegd met 7 banden, die worden gebruikt voor de matrix, die een breedte van 7 heeft LED. Sommige effecten zijn nog steeds gebaseerd op de originele 64 bands.
Het algoritme voor het berekenen van de FFT is gecodeerd op een manier dat het niet in één keer alle Berekeningsstappen, maar deze in kleinere stukken splitst. Dit wordt gedaan om de tijd van de controller om te berekenen van andere ding tussen deze stappen. Doet u dit niet, de animaties zal soms stotteren, niet die er goed uitzien.
Het menselijk oor reageert anders op bepaalde frequenties. Het is zeer verstandig tot frequenties rond 4kHz en niet verstandig aan zeer lage en hoge frequenties. In een audio signaal van die de lage frequenties hebben zal een hoge amplitude, die tot hoge FFT resultaten leidt, en lage amplitudes in de middelste frequenties, wat leidt tot lage FFT resultaten. Dit maakt het moeilijk om te doen met berekeningen. Om dit tegen te een zeer eenvoudig systeem voor het omgekeerde a-weging wordt gebruikt. De coëfficiënten zijn vooraf berekend voor elke band en vermenigvuldigd met elk van de 64 FFT-bands.
Beat detectie
Het basisidee achter deze is eenvoudig: het gemiddelde van de kracht van het geluidsniveau. Als het huidige energieniveau veel hoger dan dit gemiddelde is heb je een beat. Om dit te doen behoorlijk zou u wilt genieten van het audiosignaal continu, die we niet doen. Maar we zullen nog steeds gebruik maken van dit idee.
De FFT-resultaten zijn opgesplitst in 3 bands: lage, medium en high. Het gemiddelde van de waarden wordt berekend na verloop van tijd als een zwevend gemiddelde. Als het huidige niveau hoger is dan 50% tot 100% (afhankelijk van de band) van dit gemiddelde wordt dit geëvalueerd als beat. Dit werkt zeer goed met een metronoom, die een eenvoudige geluid produceert, maar werkt ook goed met complexe signalen zoals liedjes. De beat detectie in de onderste band werkt het beste en het midden band het ergste wanneer er zang in het lied.
Wat te doen met die gegevens?
Als voorbeeld zal ik uitleggen hoe het mono spectrum display werkt. Kunt u de code in het volledige project in animations.cpp in de functie void anim_monospektrum_step(). Deze animatie wordt gebruikt in de intro video.
De waarden van de 7 geconsolideerde bands worden als streefwaarden voor de hoogte van de kolommen ingesteld. Het wordt geschaald op een manier, dat deze waarde tussen 0 en 9000 varieert. De doelgroep kleur verschuiving wordt bepaald door de amplitude. De werkelijke waarden, die zal worden gebruikt voor het berekenen van de output, veranderen langzaam hun waarde zodat deze overeenkomt met de streefwaarde. Dit maakt de animatie zeer vloeistof kijken en voorkomt plotselinge sprongen.
De matrix heeft een hoogte van 6 LED. Dit betekent dat elke LED dekt 9000 / 6 = 1500 telt van de werkelijke waarde. Als de werkelijke waarde van een band 1500 is, wordt alleen de LED in de bodem zou oplichten. Als de waarde werd 3000 de twee meest onderste LED zou oplichten. Zo lang de werkelijke waarde is groter dan 1500 we oplichten een meer geleid en aftrekken van 1500 van de waarde. Indien, na dit proces, is de waarde 0, de LED boven de laatste volledige verlichte LED is zo goed verlicht, maar de helderheid wordt geschaald met de waarde. Hoe lager de resterende waarde, hoe lager de helderheid.
Als een extra detail knipperen de banden wanneer een beat binnen deze band wordt gedetecteerd.