Raspberry Pi spektrumanalysator med RGB LED Strip och Python (3 / 3 steg)
Steg 3: Redigera defaults.cfg och köra anpassade synchronized_lights_LED_strip.py
gpio_pins = 7,0,1,2,3
Jag har bara 5 kolumner, så jag bara trunkeras listan över utgångar till 5 nummer.
Om du vill använda spellistan, ändra playlist_path
Jag ändrade också följande
min_frequency = 50
max_frequency = 150000
kommentera ut custom_channel_frequencies. Jag vill bara dela min och max frekvenser jämnt.
Slutligen kör anpassade skript:
sudo py/synchronized_lights.py--fil /home/pi/some_random_music_file.mp3
För felsökning, överväga att lägga till - v 2--readcache 0
Jag kunde avkoda mp3s och spela upp dem samtidigt med bara några buggar precis i början av låten. Tarvlig koden har en funktion där den skriver ut alla nivåer till en cachefil så när den spelar låten igen det behöver inte köra den FFTs. readcache 0 inaktiverar detta om du inte vill ta bort .gz cachen genereras varje gång.
--------------------
Några höjdpunkter i de ändringar jag gjort till ursprungliga
--------------------
De viktigaste förändringarna består av strippning ut GPIO koden och ersätta den med koden sända nivåer till RGB LED strip. Ett bättre sätt att göra detta vore att ändra filen hardware_controller.py, men oavsett vilka några förändringar till ursprungliga skulle behövas eftersom jag inte bara använder på/av signaler längre.
Jag tillbringade större delen av min tid att försöka optimera hastigheten på funktionen calculate_levels(). Jag fick reda på att linjen
data = np.array (data, dtype = "h")
, som skapar helt enkelt en numpy matris från en python array, tog 10 MS, vilket är lika mycket som alla FFT behandling! Detta var kraftigt påskyndas genom att ersätta den med en funktion som läser in en binär minnesmatrisen direkt:
np.frombuffer (data...
Resten av mina ändringar påverkas egentligen bara saker när jag gjorde tester med pure sine vågor (se bifogade testfiler). De dynamiska justeringarna på den ursprungliga koden gjorde det fungera väl trots allt nedan. Ganska bra!
Eftersom ljud är stereo, kasta jag ut jämna nummer eftersom de utgör den högra kanalen. Den ursprungliga koden var analysera stereo signalen som om det vore mono, som förmodligen lagt lite energi till det lägsta frekvensbandet.
data [:] = data_stereo [:: 2]
FFTEN var också körs på en icke-windowed bit av ljud. När du kör en FFT på en bit av audio snidade i mitten av en låt, kanter som kommer att se ut som brant droppar för FFT-algoritm. Detta lägger en massa energi över alla band. Lösningen är att gå ner varje bit, eller "fönster". Du kan se en bild av detta bifogas denna sida av före och efter fönstersystem en audio bit.
fönster = np.hanning(len(data))
data = data * fönster
Slutligen, när strömmen av ljud går med en faktor på 10, vi hör det som en fördubbling, jag summera alla lagerplatser i varje frekvensband och ta log10 dem så lysdioderna studsa dubbelt så hög när vi hör dubbelt så bra.
För att testa saker ut, prova att köra de bifogade ljudfilerna. Skärt brus filen bör rapportera samma totala makt per frekvensband. Detta är intressant, eftersom man endast 5 eller så lagerplatser i första bandet, och hundratals i sist, men om du lägger upp alla energier, de bör vara samma, trots skillnaden i antal lagerplatser. Skärt brus låter som det är samma ljudstyrka över hela spektrumet. Skärt brus sopa filen har ett bandpassfilter som sopas från låg till hög och du kan se denna demo i videon.