Göra lampor reagera på ljud (4 / 5 steg)
Steg 4: Förenklad Version och komma igång
Den mest komplexa delen av maskinvaran är audio input scenen. Om du inte vill använda en stereo, men en mono signal, kan du helt enkelt klippa en av de ingående stegen. Om du vill det ännu enklare kan du bara en mycket enkel input etapp, som har en hög motståndskraft och endast ett filter. Du kan behöva lägga till en annan förstärkare scenen i detta.
Om du använder en Arduino är det inte möjligt att kopiera och klistra in den medföljande källkoden, eftersom Arduino styrelsen inte är baserad på en atxmega domänkontrollant.
Om du vill använda detta projekt med en annan styrenhet, måste du anpassa koden själv. Följande steg bör ge dig en idé om vad man ska göra:
Det första du behöver göra är att prova ljudsignalen. Vi behöver 128 datapunkter och vill ha en samplingsfrekvens på ca 32kHz. Det enklaste sättet att göra detta är att göra en loop, som läser ADC och sedan pausar för om 30µs. 30µs förseningen i kombination med den tid som behövs för att läsa data bör ge en ungefär exakt samplingsfrekvens.
Nästa steg är FFTEN. En trevlig kille sätta FFT biblioteket används i detta projekt i ett bekvämt bibliotek för Arduino. Detta kommer med ett exempel, som förklarar hur du använder den. Exemplet använder gratis-run funktionsläget av ADC, som tyvärr inte fungerar på 30kHz. Detta är inte nödvändigtvis en dålig sak, men dina frekvensområde kommer att påverkas och din FFT hinkar har en annan upplösning. Du kan naturligtvis också kontrollera officiella projektet av FFT biblioteket.
Om du vill genomföra en slå upptäckt bara ta en titt på förklaringen i programvara del eller koden för mitt projekt. Detta är grundläggande matematik och kan kopiera/klistras.
Vad händer efter det är du fantasi. De mest använda metoderna för att göra söta animationer, färg bleknar eller vad du vill göra är dessa:
- mål/faktiska värde: målvärdet är härrör från FFT data. Det faktiska värdet ändras långsamt tills den når målvärdet.
- glidande medelvärde: du kommer ihåg sist X-värden. Summera dessa värden och dela dem med X. Detta ger dig glidande medelvärde
- viktade glidande medelvärde: detta är lite som glidande medelvärde, men nyare värden har en högre inflytande på resultatet än äldre värden. värde = ((värde * (NUM - 1)) + new_value) / NUM. NUM kan vara fritt valt; Högre betyder det anpassar sig långsammare/mjukare
Dessa metoder kan du göra flytande snygga animationer. Om du tar direkt data från FFTEN du kanske ser plötsligt hoppar i t.ex. din färg bleknar. Jag använder den faktiska värde/målsystemet och vägda flyttanden genomsnitt för det mesta.
Ett mycket enkelt exempel på hur man använder denna formler är denna kodrad: färg = ((color * 15) + fft_bucket_h_l) / 16;
Beräknas ett viktat glidande medelvärde för FFT hinken med det högsta värdet på den vänstra kanalen. Det här värdet kan sedan användas för att ange färg för en RGB LED. Grattis! Du har precis gjort en LED, som ändrar dess färg beroende på den mest dominerande frekvensen.
Vid första anblicken denna matematik kan se överväldigande, men lyckligtvis allt hårt arbete är redan gjort. Om du spenderar lite tid att arbeta dig in i detta projekt ser du att du kan göra awesome effekter med några enkla matematiska du lärt dig i skolan.
Viktiga data som du kan använda
FFT data kan nås via klassen fft såhär:
fft_result_t * fft_left = fft.getLeft(); för kanal 1
fft_result_t * fft_right = fft.getRight(); för kanal 2
Resultatet strukturen ser ut så här:
TypeDef struct {
uint16_t spektrum [FFT_N / 2];
uint16_t adc_min, adc_max;
} fft_result_t;
spektrum är en matris av 64 beståndsdelar, som håller resultatet från FFTEN. adc_min och adc_max är de minsta och största värdena av signalen.
Inom animation.cpp, där du ska placera din animering kod har du tillgång till följande globala variabler
uint16_t bands_l [ANIM_BAND_NUM], bands_r [ANIM_BAND_NUM]; matriser som innehar data av 7 i sammandrag
band uint16_t amplitude_l, amplitude_r; amplitud, härlett av värdena adc_min och adc_max
uint8_t beats, bpm_h, bpm_m, bpm_l, bpm_all; beats innehåller en bitmask, som låter dig kontrollera om det fanns ett beat i ett specifikt band. Den andra variabeln ger dig taktslagen per minut för hög, medel, låg och alla (alla) band
uint8_t fft_bucket_h_l, fft_bucket_h_r, fft_bucket_l_l, fft_bucket_l_r; nummer (0... 63) av FFTEN hänvisar hink med högsta och lägsta värdet för alla variabler _l till vänster kanal och Triton till höger.