Bonjour tout le monde !
Ça faisait déjà pas mal de temps que j’avais prévu de faire cet article mais je n’avais pas encore eu le temps de me pencher dessus.
Le sujet du jour : concevoir un (pseudo) équalizeur audio avec les librairie TV-out et FixFFT.
Pour cet article je vais avoir besoin de deux librairies :
Tv-out qui permet de générer des signaux TV PAL ou NTSC (image noir et blanc), et FixFFT qui permet de réaliser des transformation de Fast Fourier (FFT) sur 8 bits.
Grâce à ces deux librairies je vais réaliser un (pseudo) équalizeur graphique à base d’arduino, avec sortie sur télévision.
Bon je préviens tout de suite, ça ne sera pas un truc très précis (voire même pas du tout) avec des bandes de fréquence bien délimitées.
Juste un truc réagissant plus ou moins aux sons capturés par le micro
Le matériel :
- Une carte arduino,
- Une shield Video-experiment, ou une "game shield", ou un connecteur TV composite et deux résistances (1K et 430 ohms),
- une breakout micro.
Afin de simplifier au maximum le montage j’utilise une shield video-experimenter, de ce fait le connecteur vidéo composite est directement câblé.
J’ai aussi utilisé mon astuces à base de digitalWrite() pour utiliser les broches A3 et A4 comme alimentation pour la breakout micro, ainsi aucun réel câblage n’est requis.
Si vous voulez reproduire mon montage avec une video-experimenter shield il faudra placer les jumper comme ceci :
Sync select : D9
Output select : Sync only
Voici un aperçu du montage fini.
Il ne reste plus qu’à ajouter une pile et un câble vidéo et tout est prêt !
Le code arduino :
#include <TVout.h> // Librairie TV-Out
#include <fix_fft.h> // Librairie FFT 8bits
TVout tv; // Objet TV-out
char im[128], data[128]; // Tableau contenant les nombres réels et imaginaires
byte i;
// setup()
void setup()
{
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
digitalWrite(A3, HIGH);
digitalWrite(A4, LOW); // Astuce pour brancher la breakout micro sans cablage
analogReference(DEFAULT); // Référence analogique sur 5 volts
tv.begin(_NTSC, 64, 128); // Initialisation de la librairie TV-out en NTSC 64x128 pixels
tv.fill(BLACK); // Ecran noir
}
// loop()
void loop()
{
for(i = 0; i < 128; i++){ // Acquisition des 128 mesures
data[i] = (analogRead(A5) / 4) - 128; // 100us
im[i] = 0; // Pas de nombres imaginaire
}
// fix_fft(reel, imaginaire, m, FFTinverse)
// m = log2(sizeof(data)) -> m = 7 car 2 ^ 7 = 128
fix_fft(data, im, 7, false);
tv.fill(BLACK); // Ecran noir
for(i = 1; i < 64; i++){ // Affichage des 64 bandes de résultats
data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); // Valeurs absolue
tv.draw_line(i, 0, i, data[i] * 2, WHITE); // Trace la ligne vertical
}
delay(10); // Rafraichissement 100Hz
}
Et le résultat en musique :
Enjoy !






Crois-tu qu’il est possible de faire pareil avec une entrée directe? C’est à dire si on prend une prise jack comme entrée analogique? Ou alors le signal sera trop faible?
Publié par N0ciple | 10 novembre 2012, 20 h 47 minUn signal audio brute je crois que c’est +-1v donc passage par un ampli-op obligatoire pour remonter le signal au dessus de 0v et l’amplifier un minimum.
Publié par skywodd | 11 novembre 2012, 13 h 24 min