Étape 4: Version simplifiée et mise en route
La partie la plus complexe du matériel est à l’étage d’entrée audio. Si vous ne voulez pas utiliser une chaîne stéréo, mais un signal mono, vous pouvez simplement couper l’une des étapes d’entrée. Si vous voulez qu’il est encore plus simple, vous pourriez juste un étage d’entrée très simple, qui a une haute résistance et seulement un filtre. Vous devrez peut-être ajouter un autre étage amplificateur à cela.
Si vous utilisez un Arduino, il n’est pas possible de copier et coller le code source fourni, étant donné que la carte Arduino n’est pas basée sur un contrôleur d’atxmega.
Si vous souhaitez utiliser ce projet avec un autre contrôleur, vous devez adapter le code vous-même. Les étapes suivantes devraient vous donner une idée sur ce qu’il faut faire :
La première chose que vous devez faire, c’est savourer le signal audio. Nous avons besoin de 128 points de données et que vous voulez une fréquence d’échantillonnage de 32kHz. La façon la plus simple de le faire est de faire une boucle, qui lit l’ADC et puis mise en pause pour tout 30µs. Le retard de 30µs en combinaison avec le temps nécessaire pour lire les données devrait donner une fréquence d’échantillonnage à peu près exacte.
L’étape suivante est la FFT. Certains gars sympa, mettez la bibliothèque FFT utilisée dans ce projet dans une bibliothèque commode pour Arduino. Cela vient avec un exemple, qui explique comment l’utiliser. L’exemple utilise le mode de goutte de l’ADC, qui malheureusement ne fonctionne pas à 30kHz. Ce n’est pas nécessairement une mauvaise chose, mais affectera votre bande passante et vos seaux FFT aura une résolution différente. Vous pouvez bien sûr également vérifier le projet officiel de la bibliothèque de la FFT.
Si vous souhaitez mettre en place une détection temps juste jeter un oeil à l’explication donnée dans la partie du logiciel ou le code de mon projet. C’est des maths de base et peut être copier/coller.
Que se passe-t-il une fois que vous imagination. Les méthodes les plus utilisées pour faire des animations douces, décoloration des couleurs ou tout ce que vous voulez faire sont les suivants :
- valeur cible/réelle : la valeur cible est dérivée des données FFT. La valeur réelle change lentement jusqu'à ce qu’il atteigne la valeur cible.
- moyenne mobile : vous rappelez la dernière valeurs X. Additionner les valeurs et les diviser par X. Cela vous donne la moyenne mobile
- pondérée moyenne mobile : c’est un peu comme la moyenne mobile, mais des valeurs plus récents ont une influence plus élevée sur le résultat que les anciennes valeurs. valeur = ((valeur * (n - 1)) + nouvelle_valeur) / NUM NUM. peut être librement choisi ; Plus haut signifie qu'il s’adapte plus lent/lisse
Ces méthodes vous permettent de faire des animations fluides de la recherche. Si vous prenez les données en direct la FFT que vous verrez peut-être des sauts soudains dans votre décoloration des couleurs par exemple. J’utilise le système de valeur réelle/cible et pondéré se déplaçant la plupart du temps moyenne.
Cette ligne de code en est un exemple très simple sur la façon d’utiliser cette formule : color = ((color * 15) + fft_bucket_h_l) / 16 ;
Il calcule une moyenne mobile pondérée du seau FFT avec la valeur la plus élevée sur le canal gauche. Cette valeur peut ensuite être utilisée pour définir la couleur d’une LED RGB. Félicitations ! Vous venez de faire une LED, qui change de couleur selon la fréquence dominante.
Au premier coup de œil tout ce math peut sembler écrasante, mais heureusement tout le travail est déjà fait. Si vous passer du temps pour travailler votre chemin dans ce projet, vous verrez que vous pouvez faire des effets impressionnants avec quelques calculs simples, que vous avez appris à l’école.
Données importantes que vous pouvez utiliser
Les données de la FFT est accessible via la classe fft comme suit :
fft_result_t * fft_left = fft.getLeft() ; pour le canal 1
fft_result_t * fft_right = fft.getRight() ; pour le canal 2
La structure du résultat ressemble à ceci :
typedef struct {}
uint16_t spectre [FFT_N / 2] ;
uint16_t adc_min, adc_max ;
} fft_result_t ;
spectre est un tableau de 64 éléments qui contenir le résultat de la FFT. adc_min et adc_max sont les valeurs minimales et maximales du signal.
Au sein de la animation.cpp, où vous devrez placer votre code de l’animation vous avez accès aux variables globales suivantes
uint16_t bands_l [ANIM_BAND_NUM], bands_r [ANIM_BAND_NUM] ; condensent des tableaux qui contiennent les données des 7
bandes uint16_t amplitude_l, amplitude_r ; amplitude, tiré par les valeurs adc_min et adc_max
uint8_t bat, bpm_h, bpm_m, bpm_l, bpm_all ; bat contient un masque de bits, qui vous permet de vérifier s’il y avait un battement à un groupe spécifique. L’autre variable vous donne les battements par minute pour le high, mid, low et toute une bande (quelconque)
uint8_t fft_bucket_h_l, fft_bucket_h_r, fft_bucket_l_l, fft_bucket_l_r ; nombre (0... 63) de la FFT seau avec la valeur maximale et minimale pour toutes les variables _l désigne le canal gauche et _r vers la droite.