#include "config.h" #include "system.h" #include "gpio.h" #include "fifo.h" #include "spectrum.h" #include "ws2812b.h" #include "adc.h" #include "spiclass.h" ////////////////////////////////////////////////////////////////////////// /* V mládí jsme stavěli různé "barevné hudby" což bylo pár analogových * pásmových propustí a na nich pověšený usměrňovač plus budič (barevné) * žárovky. * Tady jsem to zkusil celé udělat digitálně. ADC procesoru analogový * signál zdigitalizuje se vzorkovací frekvencí 8kHz, prožene se to rychlou * Fourierovou transformací a ze vzniklého spektra se vyberou ty správné * části, posčítají se amplitudy a to se předá do digitální LED. * Asi by se s tím daly dělat zajímavé efekty, zde je to jen napodobenina * toho analogového zažízení z mládí - 3 pásma pro basy, středy a výšky * a ledky svítí jednou barvou - červená pro basy, zelená středy a modrá * výšky. Míchat barvy do jedné ledky nevypadá dobře - je to poslední * komplementání ledka v řetězci - svítí většinou bíle. * Má to několik malých ďáblíků. Ledky se chovají jinak než žárovky. * Žárovka potřebuje určitý malý výkon aby vůbec jen trochu svítila. * Ledka svítí i při nepatrném proudu a působí to rušivě. Lze to odstranit * zavedením malého ofsetu. Ledka také nemá setrvačnost, takže to může * blikat velice divoce. Setrvačnost by šlo zavést programově, času je dost, * ale nepovažoval jsem to za nutné. * Rozdělení na pásma je proti analogu dost striktní. Na výšky je rezervováno * celé pásmo od 2 do 4kHz, ukazuje se však, že tam toho signálu stejně moc * není. Celé to nastavit je poměrně dost práce, zde to vyžaduje přibližně * úroveň linkového signálu ze zvukovky. Původně jsem předpokládal, že * bude nutné do ledek předávat něco jako logaritmus amplitudy signálu, * běžně se to tak FFT dělá a je to docela logické. Jenže takhle to nefunguje. * Lidský sluch i zrak mají citlivost přibližně logaritmickou a svit ledky * by pak byl vlastně komprimován dvakrát, z čehož je zrak pak zmaten. *///////////////////////////////////////////////////////////////////////// static GpioClass led (GPIOB, 8); // indikace běhu FFT static FIFO ring; // výměna barvy led static AdcDma adc; // zdroj signálu static Spectrum spectrum (ring, led);// vlastní FFT + vyhodnocení static ws2812b chain (ring); // řetězec led WS2812B static SpiClass spi (chain); // ovládání tt. retězce /////////////////////////////////////////////////////////////////////////// int main () { led << true; adc.attach(spectrum); spi.Init (); for (;;) { /* do nothing */ } return 0; }