Étape 3: Modifier defaults.cfg et exécutez synchronized_lights_LED_strip.py personnalisé
gpio_pins = 7,0,1,2,3
J’ai seulement 5 colonnes, donc j’ai juste tronqué de la liste des sorties à 5 numéros.
Si vous souhaitez utiliser la liste de lecture, changer la playlist_path
J’ai aussi changé le texte suivant
min_frequency = 50
max_frequency = 150000
Commentaire custom_channel_frequencies. Je veux juste réparti les min et max.
Enfin, exécutez le script personnalisé :
sudo py/synchronized_lights.py--fichier /home/pi/some_random_music_file.mp3
Pour le débogage, envisagez d’ajouter -v 2--readcache 0
J’ai été en mesure de décoder les mp3s et les jouer en même temps avec seulement quelques problèmes au début de la chanson. Le code de base possède une fonction où il écrit à tous les niveaux dans un fichier cache donc quand il joue la chanson encore une fois, qu'il n’a pas à courir à que la FFT. readcache 0 cela s’éteint si vous ne voulez pas avoir à supprimer le cache .gz il génère chaque fois.
--------------------
Quelques temps forts dans les changements que j’ai fait à l’original
--------------------
Les principales modifications consistent de décapage le code GPIO et son remplacement par code pour envoyer des niveaux à la bande de LED RVB. La meilleure façon de le faire serait de modifier le fichier hardware_controller.py, mais peu importe ce que certains changements à l’original serait nécessaire depuis que je suis non seulement sur marche/arrêt des signaux plus.
J’ai passé la plupart de mon temps à essayer d’optimiser la vitesse de la fonction calculate_levels(). J’ai découvert que la ligne
données = np.array (data, dtype = « h »)
, qui crée simplement un tableau numpy partir d’un tableau de python, a pris de 10ms, ce qui est autant que tout le traitement de la FFT ! Cela a été grandement accéléré en la remplaçant par une fonction qui charge un tableau binaire mémoire directement :
NP.frombuffer (données...
Le reste de mes changements seulement vraiment affecté les choses quand je faisais des tests avec pures sinusoïdes (voir fichiers de test ci-joint). Les ajustements dynamiques sur le code original fait le travail bien malgré tout en dessous. Assez grande !
Étant donné que le son est stéréo, j’ai jeter les nombres étant donné que ceux qui représentent le canal droit. Le code original analysait le signal stéréo comme si elle était mono, qui probablement ajouté un peu d’énergie à la bande de fréquence plus basse.
données [:] = data_stereo [:: 2]
La fft courait aussi sur un segment non-fenêtré d’audio. Lorsque vous exécutez une FFT sur un morceau d’audio creusé au milieu d’une chanson, les bords des qui ressemblera à gouttes raides à l’algorithme FFT. Cette opération ajoute un tas d’énergie dans l’ensemble de toutes les bandes. La solution consiste à effiler vers le bas de chaque morceau, ou « window » il. Vous pouvez voir qu'une photo de ce joint à cette page d’avant et après fenêtrage un morceau audio.
fenêtre = np.hanning(len(data))
données = données * fenêtre
Enfin, quand la puissance du son augmente d’un facteur 10, que nous entendons que comme un doublement, donc j’ai la somme de tous les emplacements dans chaque bande de fréquences et prendre le log10 de ceux donc les LEDs rebondissent deux fois plus élevé quand on entend le son double.
Pour tester les choses, essayez d’exécuter les fichiers audio ci-joint. Le fichier de bruit rose devrait faire rapport à la même puissance totale par bande de fréquences. C’est intéressant, parce qu’il y aura seulement les bacs 5 ou plus dans les premières bandes et des centaines dans le dernier, mais si l'on additionne toutes les énergies, ils devraient être les mêmes, malgré la différence dans plusieurs emplacements. Bruit rose sonne comme si c’était le même volume dans toute la gamme. Le fichier de balayage de bruit rose possède un filtre passe-bande être balayé de faible à élevé, et vous pouvez voir cette démonstration dans la vidéo.