Étape 3: logiciel
Vous pouvez trouver le logiciel en tant que projet de Studio de Atmel sur github
Il y a 2 projets dans cette git. Le projet de base comprend toutes les fonctions de base pour mesurer et calculer les données. Il inclut également une classe pour WS2812 LED. Le Matrixproject inclut toutes les données pour mon projet basé une une matrice 7 x 6 LED avec LED de WS2812. Comme c’est très spécifique, ce code est plus d’une inspiration et un exemple de ce que vous pouvez faire.
Cette partie est la plus complexe de ce projet, que le logiciel a besoin de faire beaucoup de choses.
Les données d’échantillonnage
Tout d’abord, vous devrez entrer les données dans le contrôleur. Cela se fait par échantillonnage du signal audio avec un ADC. La fréquence d’échantillonnage dépend de la bande passante avec que vous voulez travailler. Si vous échantillonnez le signal avec un taux de 32kHz, que vous pouvez recréer les signaux jusqu'à 16kHz avec la Transformation de Fourier (FT). Il s’agit de la gamme de fréquences, avec que nous voulons travailler.
Pour ce faire une minuterie pour déclencher avec une fréquence de 32kHz et lire une valeur à partir de l’ADC chaque fois que cela arrive. Étant donné que le contrôleur d’atxmega dispose d’un contrôleur DMA, cela sert à automatiser le processus. DMA (Direct Memory Access) permet de déplacer des données d’un point dans la mémoire à l’autre complètement dans le matériel. Le DMA est mis en place en quelque sorte, qu’elle bouge le résultat de l’ADC à un endroit précis dans la RAM chaque fois qu’elle est déclenchée par la minuterie. Nous avons déguster 128 valeurs par canal.
Transformation de Fourier rapide (FFT)
Nous utilisons la bibliothèque elmchan FFT pour ce projet.
Habituellement un pi utilise beaucoup de temps de calcul, mais vous permet de recréer chaque fréquence dans le spectre du signal donné. La FFT simplifie ce processus et il accélère. L’inconvénient, c’est qu’il ne vous donne pas des fréquences spécifiques mais les bandes de fréquences. Dans le but de ce projet, ces données sont assez bonnes.
Puisque nous avons déguster 128 valeurs, la FFT va nous donner 64 résultats. En raison de la fréquence d’échantillonnage (32 kHz), nous pouvons recréer des fréquences jusqu'à 16 kHz, qui sera divisé en 64 bandes par la FFT. 16000 / 64 = 250. Cela signifie que chaque bande FFT décrit le niveau de 250 Hz. FFT bande 1 donne une valeur de 1Hz à 250Hz, bande 2 pour 251Hz à 500Hz, bande 3 pour Hz 501 à 750Hz et ainsi de suite. En augmentant le nombre d’échantillons d’entrée, vous pourriez augmenter cette résolution, mais aussi augmenter le temps de calcul nécessaire.
Les 64 bandes sont regroupées en 7 bandes, qui sont utilisés pour la matrice, qui a une largeur de 7 LED. Certains effets sont fondent encore sur les bandes originales de 64.
L’algorithme pour calculer la FFT est codé de manière, qu’il ne fait pas toutes les étapes de calcul à la fois, mais eux divise en petits morceaux. Ceci est fait pour donner le temps de contrôleur pour calculer autre chose entre ces étapes. Si vous ne faites pas cela, les animations seront parfois bégayer, qui ne semble pas bon.
L’oreille humaine réagit différent à certaines fréquences. Il est très sensible aux fréquences autour de 4kHz et pas sensible à très basse et à haute fréquence. Dans un signal audio, que les fréquences basses auront une forte amplitude, ce qui conduit à des résultats élevés de FFT, et faibles amplitudes dans les fréquences moyennes, qui conduit à faibles résultats FFT. Ce qui rend difficile de faire des calculs avec. Pour contrer cela un système très simple d’une pondération inverse est utilisé. Les coefficients sont préalablement calculés pour chaque bande et multipliés avec chacune des 64 bandes FFT.
Battre la détection
L’idée derrière cela est simple : la puissance du niveau sonore moyenne. Si le niveau actuel est moyen supérieur à cette moyenne, vous avez un battement. Pour ce faire correctement, vous auriez besoin échantillonner le signal audio en continu, ce qui nous ne faisons pas. Mais nous utiliserons encore cette idée.
Les résultats de la FFT sont divisées en 3 catégories : faible, moyen et élevé. Ces valeurs sont en moyenne au fil du temps comme une moyenne mobile. Si le niveau actuel est plus élevé que 50 % à 100 % (selon la tranche) de cette moyenne, il est évalué comme battement. Cela fonctionne très bien avec un métronome, qui produit un son simple, mais ne fonctionne pas trop bien avec des signaux complexes comme des chansons. La détection des temps dans la bande du bas fonctionne le mieux et le pire au milieu de la bande lorsqu’il existe des voix dans la chanson.
Que faire avec ces données ?
A titre d’exemple, je vais vous expliquer comment fonctionne l’affichage du spectre mono. Vous pouvez trouver le code du projet complet dans animations.cpp dans le anim_monospektrum_step() de fonction Sub. Cette animation est utilisée dans la vidéo d’intro.
Les valeurs des 7 groupes consolidés sont définies comme des valeurs cibles pour la hauteur des colonnes. Il est gradué en une certaine manière, que cette valeur est comprise entre 0 et 9000. Le décalage de couleur cible est défini par l’amplitude. Les valeurs réelles, qui servira à calculer à la sortie, changent lentement leur valeur pour correspondre à la valeur cible. Cela rend l’animation très fluide et prévient des sauts soudains.
La matrice a une hauteur de 6 LED. Cela signifie que chaque LED couvre 9000 / 6 = 1500 chiffres de la valeur réelle. Si la valeur réelle d’une bande est 1500, seule la LED dans le fond s’illuminait. Si la valeur était de 3000 les deux inférieurs plus LED s’illuminait. Comme depuis longtemps la valeur réelle est supérieure à 1500 nous allume plus dirigé et soustraire les 1500 de la valeur. Si, après ce processus, la valeur n’est pas 0, la LED au-dessus de la dernière pleine-éclairé LED s’allume aussi bien, mais la luminosité est proportionnelle à la valeur. Plus les autres valeur, plus la luminosité.
Comme un détail supplémentaire les bandes seront met à clignoter lorsqu’un battement au sein de cette bande est détecté.