Stap 4: Vereenvoudigde versie en aan de slag
Het meest complexe deel van de hardware is de audio input fase. Als u niet gebruiken van een stereo-installatie, maar een mono-signaal wilt, kunt u één van de input etappes gewoon knippen. Als u wilt dat het nog eenvoudiger kun je gewoon een heel simpel input etappe, die een hoge weerstand en alleen een filter heeft. Moet u wellicht een andere versterker stadium toevoegen aan dit.
Als u van een Arduino gebruikmaakt is het niet mogelijk om te kopiëren en plakken van de verstrekte broncode, aangezien de Arduino Board is niet gebaseerd op een atxmega-controller.
Als u gebruik wilt maken dit project met een andere controller, moet u zelf de code aan te passen. De volgende stappen moeten geven u een idee over wat te doen:
Het eerste wat dat je hoeft te doen is genieten van het audiosignaal. Wij moeten 128 gegevenspunten en wilt een samplefrequentie van ongeveer 32kHz. De eenvoudigste manier om dit te doen is om een lus, die leest de ADC en vervolgens wordt onderbroken voor over 30µs. De vertraging van de 30µs in combinatie met de tijd die nodig is om de gegevens te lezen moet een ruwweg nauwkeurige samplefrequentie geeft.
De volgende stap is de FFT. Sommige aardige vent zet de FFT-bibliotheek gebruikt in dit project in een handige bibliotheek voor de Arduino. Dit komt met een voorbeeld, waarin wordt uitgelegd hoe u het gebruikt. Het voorbeeld maakt gebruik van de gratis-run modus van de ADC, die helaas niet uitgevoerd vanaf 30kHz. Dit is niet noodzakelijk een slechte zaak, maar uw frequentiebereik zullen worden getroffen en uw FFT emmers heeft een verschillende resolutie. U kunt natuurlijk ook het officiële project van de FFT-bibliotheek.
Als u wilt gewoon een beat detectie implementeren Neem een kijkje op de uitleg in het deel van de software of de code van mijn project. Dit is elementaire wiskunde en kunt kopiëren/plakken.
Wat gebeurt er nadat dat is je fantasie. De meest gebruikte methoden om het maken van zoete animaties, kleur vervagen of wat u wilt doen, zijn deze:
- doel/werkelijke waarde: de doelwaarde is afgeleid van de FFT-gegevens. De werkelijke waarde verandert langzaam totdat de streefwaarde wordt bereikt.
- zwevend gemiddelde: U weet de laatste X-waarden. Deze waarden optellen en verdeel ze door X. Dit geeft u de voortschrijdend gemiddelde
- gewogen zwevend gemiddelde: dit is een beetje zoals het voortschrijdend gemiddelde, maar nieuwere waarden hebben een hogere invloed op het resultaat dan oudere waarden. waarde = ((waarde * (NUM - 1)) + nieuwe_waarde) / Numeri NUM kan vrij worden gekozen; Hoger betekent dat het past zich langzamer/vloeiender
Deze methoden kunnen u vloeiende uitziende animaties maken. Als u rechtstreeks de gegevens van de FFT verschijnt mogelijk het plotselinge sprongen in bijvoorbeeld uw kleur vervagen. Ik gebruik de werkelijke/waarde doelsysteem en het gewogen gemiddelde van de meeste van de tijd te verplaatsen.
Een heel eenvoudig voorbeeld over het gebruik van deze formules is deze coderegel: kleur = ((color * 15) + fft_bucket_h_l) / 16;
Het berekent een gewogen voortschrijdend gemiddelde van de FFT emmer met de hoogste waarde op het linker kanaal. Deze waarde kan vervolgens worden gebruikt om de kleur van een RGB-LED te stellen. Gefeliciteerd! U zojuist een LED, die verandert van kleur afhankelijk van de meest dominante frequentie.
Op het eerste gezicht alle deze wiskunde zou kunnen kijken overweldigend, maar gelukkig al het harde werk is al gedaan. Als u wat tijd om op uw manier in dit project ziet u dat u kunt maken geweldige effecten met sommige eenvoudige wiskunde die je op school hebt geleerd.
Belangrijke gegevens voor u te gebruiken
De FFT-gegevens toegankelijk zijn via de fft-klasse als volgt:
fft_result_t * fft_left = fft.getLeft(); voor kanaal 1
fft_result_t * fft_right = fft.getRight(); voor kanaal 2
De structuur van het resultaat ziet er zo uit:
typedef struct {}
uint16_t spectrum [FFT_N / 2];
uint16_t adc_min, adc_max;
} fft_result_t;
spectrum is een matrix van 64-elementen, die in het bezit van het resultaat uit de FFT. adc_min en adc_max zijn de minimale en maximale waarden van het signaal.
Binnen de animation.cpp, waar u uw animatie-code moet plaatsen hebt u toegang tot de volgende globale variabelen
uint16_t bands_l [ANIM_BAND_NUM], bands_r [ANIM_BAND_NUM]; arrays die de gegevens van de 7 houden condensed
banden uint16_t amplitude_l, amplitude_r; amplitude, afgeleid door de waarden adc_min en adc_max
uint8_t beats, bpm_h, bpm_m, bpm_l, bpm_all; beats bevat een bitmasker, waarin u kunt controleren of er een beat in een specifieke band was. De andere variabele geven u de beats per minuut voor de hoge, mid, low en alle (eventuele) band
uint8_t fft_bucket_h_l, fft_bucket_h_r, fft_bucket_l_l, fft_bucket_l_r; cijfer (0... 63) van de FFT verwijst emmer met de hoogste en laagste waarden voor alle variabelen _l naar het linker kanaal en _r naar rechts.