Capter le son d'un micro, le traiter, le déphaser

Bonjour à tous, à toutes.

Dans le cadre d’un projet de TIPE, j’aimerai capter un signal sonore, le traiter puis le déphaser. Il y aurait ainsi deux codes, correspondant à un traitement électrique et un traitement numérique du signal.
Etant en classe préparatoire, je n’ai pas beaucoup de temps pour apprendre le langage arduino, et c’est cela qui me pose problème, je ne comprends pas/ne connais pas ce langage, qui m’apparaît comme très compliqué en sachant que je ne connais que les bases de python et que, même içi j’ai du mal…
Voici le matériel à ma disposition :
-Ordinateurs
-ALI
-haut parleur
-Micro groove

Malgré de nombreuses recherches je ne trouve pas de code tout fait ni pour l’un ni pour l’autre…
Voici celui réalisé pour le traitement électrique. Il consiste à simplement capter le signal sonore, et le renvoyer à un montage électrique se chargeant de déphaser le signal (Il a déja été réalisé et fonctionne, on ne peut pas directement brancher le micro sur le montage pour des problèmes d’impédances).
Ce premier programme ne fonctionne pas :

flot sensorPin = A0;
    float sensorValue=0;
    float outpoutvalue=0;
    float analogOutPin=9;
    float valeur = 0
void setup() {
    tone(8,valeur);
    Serial.begin(9600);
}

void loop() {
   sensorValue=analogRead(sensorPin);
   valeur= analogWrite(9,sensorValue);
}

Le deuxième traitement , numérique cette fois-ci, consiste à capter, traiter,déphaser, et renvoyer le signal en un programme, j’ai décomposé ce programme en plusieurs programme, mais je bloque complètement sur le calcul d’un écart type, traiter un tableau de valeurs etc…
Le voici :

 //Récupérer le signal en analogique :
    //1024 points sur une plage de 5 volts donne une précision absolue de 4,9mV.
    //La précision de la mesure (10 bits) n'est pas modifiable, La mesure prend environ 100µs, cela fait un maximum de 10 000 mesures par seconde
    //mesurer une tension sur une broche non connectée retourne des valeurs de l'ordre de 300 à 500, même s’il n'y a pas de signal
    //Le résultat est sur 10 bits, soit entre 0 et 1023 (inclus).
void setup() {
  Serial.begin(9600); //initialise la communication avec le PC.
}
void loop() {
  int valeur = analogRead(A0); //Mesure la tension sur la broche A0

  float tension = valeur * (5.0 / 1023.0);  //Transforme le résultat de la mesure en un nombre à virgule (type float)

  Serial.println(tension);
  delay(10); //Envoie la valeur au PC et attendre 10ms pour avoir le temps de lire 
}

//Calculer moyenne lissé , Lissage : moyenne glissante

const int nEchantillons = 1000000;      // Nombre d'échantillons : sur 100s
int echantillon[nEchantillons,1];    // un tableau pour stocker les échantillons lus
int indice = 0;                    // l'indice de l'échantillon courant
float total = 0;                   // la somme des échantillons mémorisés
float moyenne = 0;                 // la moyenne des échantillons mémorisés
int inputPin = A0;
void setup() {
  // Initialisation du port série
  Serial.begin(9600);
  // On remplit le tableau d'échantillons avec des 0
  for (int i = 0; i < nEchantillons; i++) {
    echantillon[i] = 0;
  }
}
void loop() {
  // Soustraction de l'echantillon précédent
  total = total - echantillon[indice];
  
  // Lecture du capteur
  echantillon[indice] = analogRead(inputPin);
  Serial.print(echantillon[indice]);
  
  // Ajout du dernier echantillon
  total = total + echantillon[indice];
  
  // Incrémentation de l'indice
  indice++;
  // si on est à la fin du tableau ...
  if (indice >= nEchantillons) {
    // ...retour au début
    indice = 0;
  }
  // calcul de la moyenne
  moyenne = total / nEchantillons;
  Serial.print(",");
  Serial.println(moyenne);
  delay(1);
}


//Calculer l'écart type :



//Filtrer les points +- ecart type:
int echantillonfiltre[nEchantillons,1];    // un tableau pour stocker les échantillons filtres
  for (int i = 0; i < nEchantillons; i++) { 
  if echantillon[nEchantillons,1]<moyenne+ecarttype
  echantillonfiltre }
 // si on est à la fin du tableau ...
  if (indice >= nEchantillons) {  
  
  



//Nouveau tableau de valeurs filtrées 


//Calculer le maximum des valeurs filtrés
//Calculer le minimum des valeurs filtrés
//Avoir la valeur de t telle que V(t)=Vmin
//Avoir la valeur de t telle que V(t')=Vmax

//Calculer t'-t=T
//Renvoie les valeurs de t à t+T en digital :

//Idée : POur contrer le temps de réponse du système, ajouter t+T+A avec A : temps de rep du système

Pourriez vous m’aider à écrire ces programmes s’il vous plait ?

Quel Arduino ??

const int nEchantillons = 1000000;      // Nombre d'échantillons : sur 100s
int echantillon[nEchantillons,1];    // un tableau pour stocker les échantillons lus

Outre que la définition du tableau n'est pas bonne (vous n'allouez qu'un seul entier) sur la plupart des arduino vous n'aurez pas assez de mémoire pour stocker 1 millions d'échantillons !!

Un Uno dispose de 2048 octets de mémoire vive en tout et pour tout l'ensemble du programme. Ici vous lui en demandez 2 millions, quasiment 1000x plus que ce qui est dispo...

La puissance de calcul est aussi assez limitée sur les Uno, MEGA etc... pas forcément la plateforme la plus adaptée au traitement du son. Un RPi serait sans doute plus simple et vous pouvez programmer en python.

flot sensorPin = A0;

Deux erreurs :

  1. fôte d’ortografe → flot n’est pas un mot clé. Le résultat de la compilation a obligatoirement signalé une erreur.
  2. Les fonctions pinMode, digitalWrite/Read attendent un entier et non pas un nombre réel.
    Déclarer cette variable comme un entier constant et le compilateur fera les optimisations.

Précision :
IL N’Y A PAS DE LANGUAGE ARDUINO.
Le langage utilisé pour programmer avec l’IDE arduino est le C/C+.
Il n’existe que des fonctions et des classes écrites en C/C++ pour simplifier la gestion du microcontrôleur.
Si tu as des bases en python tu as déjà fait une grande partie du chemin.

Pour la documentation il y a le tuto d’Eskimon (pdf ou blog) qui est excellant.
Un tuto d’initiation au C ne peut pas faire de mal.
On peut aussi tout simplement cliquer sur “Documentation” dans le menu horizontal de ce site.

Il existe un grand nombre de bibliothèques pour gérer les composants.
Chaque bibliothèque est accompagnée d’exemples qui sont garantis fonctionnels. Il faut déjà réussir avec les exemples avant d’écrire son code, c’est la seule façon d’être assuré que l’on a câblé sans faire d’erreur.

Il faut savoir que l’IDE ne demande d’écrire que 2 fonctions setup et loop, tu peux en ajouter autant que tu veux.
L’ide construit un vrai fichier C++ à partir des fonctions que tu as écrites.
La structure du fichier que l’ide transmet au compilateur ressemble à ceci (c’est juste le principe pour comprendre ce qu’il se passe) :

#include Arduino.h
void main(){
 init() ;
 setup();
 while(1){
    loop();
 }
}

#include <Arduino.h> apporte les prédéclarations des fonctions et classes de l’IDE
init() est une fonction qui configure le microcontrôleur “à la sauce Arduino”
setup() est une fonction qui n’est exécutée qu’une seule fois
loop() est une fonction qui est placée dans une boucle infinie et dont on ne peut jamais sortie.
Dès que loop est terminée automatiquement on y retourne.

Il faut savoir que l'IDE ne demande d'écrire que 2 fonctions setup et loop, tu peux en ajouter autant que tu veux.

pour préciser, on peut rajouter autant d'autres fonctions que l'on veut si on ne les appelle pas setup() ou loop()... (car vous avez posté du code avec 2 fonctions setup et 2 loop)

Pour rester quasiment dans l'environnement Arduino il serait pour l'application envisagée, de se pencher vers certaines cartes Teensy, bien pourvues (sur le plan matériel et logiciel) pour faire du déphasage de signal audio.

Etant en classe préparatoire, je n'ai pas beaucoup de temps pour apprendre le langage arduino, et c'est cela qui me pose problème, je ne comprends pas/ne connais pas ce langage, qui m'apparaît comme très compliqué

Si Arduino paraît 'très compliqué' en classe prépa où va-t-on ?

Si ce TIPE doit se faire avec l'environnement Arduino il est indispensable de dégager du temps pour se former avec un site du genre : https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/ ça ira plus vite que les tentatives de 'pompage' ici ou là de bouts de code plus ou moin bien 'digérés'

l'entrée analogique d'un Arduino ne peut lire que des valeurs positives ( 0-5 V) Donc tu perds la moitié tu signal... et tu récupères pas mal de distorsion.

Je crois qu'il existe des cartes mezzanines (shields) pour avoir des entrées audio correctes.

Quelle est la fréquence d'échantillonage visée ? dans ton code c'est un peu moins de 100 Hz. Avec ça tu ne captes que des infrasons.

@q6424: Quel délai as-tu pour réaliser ce projet ? Quelle est exactement la consigne que ton prof de TIPE t'a donnée ? Dans le matériel que tu listes je ne vois pas de carte Arduino ...

Quelques remarques: Découpe ton projet en sous-parties que tu pourras plus facilement traiter. Même sans rien connaître en C/C++, tu peux penser que tu vas d'abord avoir à faire: * une conversion analogique vers numérique * une acquisition de données * un traitement des données (déphasage ?, etc...) * une conversion numérique vers analogique

Premièrement merci de vos réponses aussi rapides, je ne m'attendais pas à autant de réponses aussi vite.

[u]P[/u][u]our répondre a J-M-L :[/u]

Merci pour votre conseil d'utilisation d'un RPI, je vais pencher sur cette solution qui me permettra d'utiliser mes connaissances en python et surtout de bénéficier de l'aide de mes professeurs qui ne s'y connaissent en rien à arduino. Avez vous d'autres suggestions/ connaissances sur le traitement d'un signal avec un RPI ?

[u]Pour répondre à 68 tjs :[/u]

Merci de votre réponse détaillée, je vais pouvoir étudier votre message et continuer à essayer d'écrire dans le cas où le RPI proposé par J-M-L ne marche pas

[u]Pour répondre à alfch :[/u]

Arduino n'était pas nécessaire à utiliser, j'ai libre choix des logiciels que j'utilise. Ne connaissant rien d'autres qu'Arduino de nom, je suis partis la dessus, mais au vu des messages précédents et de mon temps impartis, je vais prendre la solution de J-M-L, que je ne connaissais pas, qui me permettra de gagner du temps. Merci de votre réponse également

[u]Pour répondre à ard_newbie :[/u]

J'ai jusqu'en marche pour le terminer, j'avais déja essayer de décomposer le code... En vain puisque je bloquais à la première étape... Merci de votre réponse également. Je n'ai aucune consigne ni aucune directive, mes profs me disent simplement si la direction choisie est bonne ou pas. Ils ont validés l'idée, mais n'y connaissant rien dans ce domaine ils n'ont pas pu m'aider à choisir logiciels et codages.

Bonne journée à tous et merci de vos réponses nombreuses et rapide. Je vous prie de m'excuser de la mienne qui se fait tardive... Un petit DS de thermodynamique prévu ce matin m'as pris absolument tout mon temps.

sur RPi vous aurez sans doute la possibilité d'utiliser différentes bibliothèques audio et son en python

il y a pas mal d'exemple en ligne, voici un lien qui discute de trucs audio

cela dit s'il n'y a pas d'obligation d'utiliser un petit ordinateur, pourquoi ne pas le faire directement sur votre PC en python ? vous avez le micro et les haut parleurs intégrés, plein de mémoire etc...