53 lines
2.9 KiB
C++
53 lines
2.9 KiB
C++
|
#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<uint32_t, FIFOLEN> 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;
|
||
|
}
|