Stap 3: Bewerken van defaults.cfg en uitvoeren van aangepaste synchronized_lights_LED_strip.py
gpio_pins = 7,0,1,2,3
Ik heb alleen 5 kolommen, dus ik gewoon de lijst van uitgangen naar 5 nummers afgekapt.
Als u de afspeellijst gebruiken, wijzigt u de playlist_path wilt
Ik veranderde ook de volgende
min_frequency = 50
max_frequency = 150000
commentaar uit de custom_channel_frequencies. Ik wil alleen de min en max frequenties gelijkmatig verdeeld.
Tot slot, het aangepaste script uitvoeren:
sudo py/synchronized_lights.py--bestand /home/pi/some_random_music_file.mp3
Voor foutopsporing, kunt u overwegen - v 2--readcache 0
Ik kon decoderen mp3s en spelen ze op hetzelfde moment met slechts een paar glitches helemaal aan het begin van het nummer. De basiscode is een functie waar het schrijft uit alle niveaus naar een cachebestand, zodat wanneer het speelt het liedje weer dat het hoeft niet te lopen dat de readcache FFTs. 0 wordt dit uitgeschakeld als u niet wilt moet verwijderen van de cache .gz elke keer genereert.
--------------------
Enkele hoogtepunten in de wijzigingen aan het origineel
--------------------
De belangrijkste wijzigingen bestaan uit strippen van de GPIO code en vervangen door de code te sturen niveaus aan de RGB LED strip. De betere manier om dit te doen zou zijn om de hardware_controller.py bestand te wijzigen, maar ongeacht wat enkele wijzigingen aan het origineel nodig zou zijn aangezien ik ben niet alleen met behulp van aan/uit signalen meer.
Ik bracht het grootste deel van mijn tijd proberen voor het optimaliseren van de snelheid van de calculate_levels() functie. Ik ontdekte dat de lijn
gegevens = np.array (data, dtype = 'h')
, die gewoon creëert een numpy matrix uit een array van python, nam 10ms, die zo veel als alle de FFT processing is! Dit was zeer versneld door het te vervangen met een functie die wordt geladen een array van binaire geheugen direct:
NP.frombuffer (gegevens...
De rest van mijn wijzigingen beïnvloed pas echt dingen als ik was bezig met het testen met zuivere sinus golven (zie bijgevoegde testbestanden). De dynamische aanpassingen op de oorspronkelijke code maakte het werk goed ondanks alles hieronder. Mooie grote!
Aangezien de audio stereo, gooi ik uit de even nummers omdat die het rechterkanaal vertegenwoordigen. De originele code was het analyseren van de stereo signaal alsof het mono, die waarschijnlijk een beetje energie aan de laagste frequentieband toegevoegd.
gegevens [:] = data_stereo [:: 2]
De fft draaide ook op een niet-windowed stuk van audio. Wanneer u een FFT uitvoert op een stuk van audio gesneden uit het midden van een lied, de randen van die steile druppels het FFT-algoritme eruit. Dit voegt een heleboel energie over alle banden. De oplossing is om het onderaan elk stuk, of "venster"-conus. Ziet u dat een beeld van aangesloten op deze pagina van voor en na windowing een audio Brok.
venster = np.hanning(len(data))
gegevens = data * venster
Tot slot, wanneer de kracht van geluid met een factor 10, horen we dat als een verdubbeling stijgt, dus ik som van alle opslaglocaties in elke frequentieband en neem de log10 van degenen zodat de LEDs tweemaal zo hoog stuiteren als we het geluid dubbele horen.
Als u wilt dingen uit te testen, probeer de gekoppelde geluidsbestanden. Het roze ruis-bestand moet dezelfde totale vermogen per frequentieband verslag. Dit is interessant, want er alleen 5 of zo opslaglocaties in de eerste band, en in de laatste honderden zullen, maar als je alle de energieën optelt, zij dezelfde, ondanks het verschil in aantal opslaglocaties moeten. Roze ruis klinkt zoals het is het zelfde volume over het gehele spectrum. Het roze ruis sweep-bestand heeft een bandfilter filter geveegd van laag naar hoog, en u kunt deze manifestatie in de video zien.