Table des matières
http://arduino.cc/en/Tutorial/AnalogInputPins
http://www.microsmart.co.za/technical/2014/03/01/advanced-arduino-adc/
http://www.instructables.com/id/Arduino-is-Slow-and-how-to-fix-it/
doc atmel 328p: http://www.atmel.com/images/doc8161.pdf
ligne de commande
plot
qt
http://www.qcustomplot.com/index.php/download
installation:
tar -xvf QCustomPlot-source.tar.gz tar -xvf QCustomPlot.tar.gz cd qcustomplot tar -xvf ../QCustomPlot-sharedlib.tar.gz cd qcustomplot-sharedlib/sharedlib-compilation/ qmake sharedlib-compilation.pro make cd ../../examples/plots qmake plot-examples.pro make
gnuplot
tns
http://iowahills.com/A7ExampleCodePage.html
https://sestevenson.wordpress.com/implementation-of-fir-filtering-in-c-part-1/
https://www.youtube.com/watch?v=fdCAsZkjpSg
objectif
appli audio
filtre passe bande sur gbf-
equation de récurence fournie
1° dev sous qt: on travaille sur des wav en double précision fitres simples, echo/ reverb
boite génération signal (sinus amplitude et fréquence variable)
filtre décimation
programmation IT/timer
adc 12 bits sur nucleo
implémentation arduino
Pour connaître la place disponible en ram: http://playground.arduino.cc/Code/AvailableMemory
int freeRam () {
extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); }
De base avec Serial, il reste de l'ordre de 1600 octets disponibles en RAM
install arduino 1.6.0
ouvrir une un console
cd ~/Téléchargements/ wget http://arduino.cc/download_handler.php?f=/arduino-1.6.0-linux64.tar.xz tar xf download_handler.php?f=%2Farduino-1.6.0-linux64.tar.xz cd arduino-1.6.0 ./arduino
Cette nouvelle version utilisera le même fichier de config ~/.arduino que la version 1.5 et ira chercher les sketchs dans ~/sketchbook
La nouvelle version affiche:
Le croquis utilise 450 octets (1%) de l'espace de stockage de programmes. Le maximum est de 32 256 octets. Les variables globales utilisent 9 octets (0%) de mémoire dynamique, ce qui laisse 2 039 octets pour les variables locales. Le maximum est de 2 048 octets.
Gestion fichiers wav
TODO: vérifier qu'on a le nécessaire pour lire les wav sinon ajouter à apt-get:
sudo apt-get install libsndfile1-dev sndfile-tools
http://www.mega-nerd.com/libsndfile/
http://www.mega-nerd.com/libsndfile/api.html
http://www.mega-nerd.com/libsndfile/tools/
code source du chirp: http://sndfile-tools.sourcearchive.com/documentation/1.03-2/sndfile-generate-chirp_8c-source.html
sndfile-generate-chirp -linear -from 100 -to 2000 11000 5 /tmp/chirp.wav sndfile-spectrogram /tmp/chirp.wav 800 800 /tmp/image.png && display /tmp/image.png
sndfile-spectrogram /home/bvandepo/Bureau/IUT/qt/wav/cartoon1.wav 800 800 /tmp/image.png && display /tmp/image.png sndfile-spectrogram /home/bvandepo/Bureau/IUT/qt/wav/jonathan_chirp.wav 800 800 /tmp/image.png && display /tmp/image.png sndfile-spectrogram /home/bvandepo/Bureau/IUT/qt/wav/jonathan_chirpout.wav 800 800 /tmp/image.png && display /tmp/image.png
Calcul du module d'un filtre numérique en C
- calc_module.c
// coefficients fournis dans tableau num et den en double. Résultat dans tableau module en double void calc_module (unsigned int nb_pt, long unsigned int fmin,long unsigned int fmax,long unsigned int fe, double* num,double* den, short unsigned int taille_num,short unsigned int taille_den, double* module ) {double ren,imn,red,imd,freq ; for (unsigned int ind=0; ind<=nb_pt-1; ind++) { freq = fmin + ind*(double(fmax-fmin))/(double(nb_pt-1)); ren=0;imn=0;red=0;imd=0; for (unsigned int k=0; k<taille_num; k++) { ren=ren + (num[k]*cos(2*M_PI*freq*k/fe)); imn=imn + (num[k]*sin(2*M_PI*freq*k/fe)); } for (unsigned int k=0; k<taille_den; k++) { red=red + (den[k]*cos(2*M_PI*freq*k/fe)); imd=imd + (den[k]*sin(2*M_PI*freq*k/fe)); } module[ind] = sqrt((pow(ren,2)+pow(imn,2))/(pow(red,2)+pow(imd,2))); } }
Tests :
- tests.c
//Pbas butter ordre 2, fc=1000, fe=100000 double n_rii[3] = {0.0009446918438402,0.0018893836876803,0.0009446918438402}; double d_rii[3] = {1.0000000000000000,-1.9111970674260730,0.9149758348014336}; //LPC10, fe=8000 double n_lpc[1] = {1.0000000000000000}; double d_lpc[10] = {-0.9066005084154077,-0.0894023777130527,-0.0737403635454538,-0.1058346286389015,-0.0805322009937170,0.7530041872610538,-0.2893637471696474,-0.0765682373294319,0.1198196170751025,-0.0831829803216555}; //PHaut FIR ordre20, fe=48000, fs=1000, fp=2000 double n_fir[21] = {-0.0242371571968972,-0.0301724044152419,-0.0361555490565042,-0.0420070672503898,-0.0475441084943809,-0.0525880968984849,-0.0569723066108962,-0.0605490435416172,-0.0631960811056043,-0.0648220319326880,0.9346296113838384,-0.0648220319326880,-0.0631960811056043,-0.0605490435416172,-0.0569723066108962,-0.0525880968984849,-0.0475441084943809,-0.0420070672503898,-0.0361555490565042,-0.0301724044152419,-0.0242371571968972}; double d_fir[1] = {1.0}; double module[1000]; // calc_module(1000,100,50000,100000,n_rii,d_rii,3,3,module); // calc_module(1000,100,4000,8000,n_lpc,d_lpc,1,10,module); calc_module(1000,100,24000,48000,n_fir,d_fir,21,1,module);