RISC-V/V203F6P6/disco/main.cpp
2025-02-11 14:22:40 +01:00

52 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;
}