Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

Menu principal

Échantillonneur-bloqueur pour microphone arduino

Démarré par Ayobo, Mars 20, 2020, 09:01:37 AM

« précédent - suivant »

Ayobo

Bonjour à  tous, mon but est d’échantillonner-bloquer puis ensuite numérisée un signal provenant d'un module microphone arduino en utilisant un lf398 pour la fonction EB et le CAN de l'arduino nano pour la fonction de numérisation. Cependant j'ai quelques questions :

1) Quelle est la fréquence du signal provenant du microphone est t'elle variable ou non, si variable quelles sont les fréquences min/max possible. Est-ce [20Hz;20Khz] ?. Comment le vérifier si nous avons pas de matos.

2) Pour entré un peu plus dans le détail de la fonction EB, si j'ai bien compris la datasheet du lf398, l'entrée LOGIQUE permet d'envoyer des impulsion dont la fréquence est l'image de la fréquence d'échantillonnage (Mode SAMPLE) ?? De plus la capacité appeler Ch (hold capacity) permet donc de maintenir le signal après chaque échantillon prélever (Mode HOLD) ??

3) D'après le point numéros 3  la fréquence des impulsions logiques haut doivent respecter la loi de shanon ?? La capacité Ch doit être dimensionnée de tel sort a avoir un temps de maintient supérieur à  la fréquence échantillonnage mais pas trop pour pas perdre des échantillons donc de l'information !

4) Quelle serait la fréquence d’échantillonnage et de maintient idéal pour un signal provenant d'un module microphone arduino pour avoir une qualité acceptable ??

Lorsque je met des points d’interrogations se sont vraiment des questions que je pose et non des affirmations !

Merci pour vos réponse futur et prenez soin de vous ;)

Curiosus

#1
Bonjour Ayobo, et tout le forum,

CitationÉcrit par Ayobo : mon but est d’échantillonner-bloquer puis ensuite numérisée un signal provenant d'un module microphone

Regarde le procéder utilisé avec un oscilloscope, j'en parle ici : http://forum.bidouilleur.ca/index.php?topic=698.0


CitationÉcrit par Ayobo : 1) Quelle est la fréquence du signal provenant du microphone

La fréquence dépend de ton microphone(qualité), en général celle-ci est comprise entre 20 Hz à  20000 Hz, après reste à  voir avec la datasheet
de ton microphone.

CitationÉcrit par Ayobo : est t'elle variable ou non

Ben ouais, elle est variable

CitationÉcrit par Ayobo : si variable quelles sont les fréquences min/max possible. Est-ce [20Hz;20Khz] ?

Pour ton oreille c'est 20Hz à  20000 Hz mais certain arrive à  entendre au-delà , (comme les chiens, les chats, chauve souris.......)

CitationÉcrit par Ayobo :2) Pour entré un peu plus dans le détail de la fonction EB, si j'ai bien compris la datasheet du lf398, l'entrée LOGIQUE permet d'envoyer des impulsion dont la fréquence est l'image de la fréquence d'échantillonnage (Mode SAMPLE) ?? De plus la capacité appeler Ch (hold capacity) permet donc de maintenir le signal après chaque échantillon prélever (Mode HOLD) ??

Pour plus d'info voici une vidéo :https://www.youtube.com/watch?v=Y3B1tQ9Hk4I

CitationÉcrit par Ayobo : Quelle serait la fréquence d’échantillonnage et de maintient idéal pour un signal provenant d'un module microphone arduino pour avoir une qualité acceptable ??

Un échantillonnage ça dure quelle que micro-seconde, de plus il te faut plusieurs échantillonnage pour créer un son.

CitationÉcrit par Ayobo : Comment le vérifier si nous avons pas de matos.

Apparemment tu as les outils nécessaire, car tu possèdes un microcontrôleur (l’Arduino-Nano), après faut savoir s'en servir.......

Je peux t'aider, mais pas avec Arduino-Nano

Moi je travaille avec des microcontrôleur Microchip(Pic) et son datasheet, dans le langage ASM, ce qui me permets de bien comprendre le microcontrôleur.

Exemple du Théorème de Shannon :https://www.f-legrand.fr/scidoc/docimg/numerique/tfd/echantillonnage/echantillonnage.html

Pour moi, et vu mon niveau, le Théorème de Shannon ça me fait trop de mathématique, je suis partit sur des points, avec l'algorithme de Bresenham voir ici pour les plus intéressées : https://fr.wikipedia.org/wiki/Algorithme_de_trac%C3%A9_de_segment_de_Bresenham

A+



Ayobo

Merci pour vôtre réponse étant donnée que la fréquence provenant du microphone est variable la fréquence d'échantillonage  de ce signal est fe>2*20KhZ dont 20 Khz représente la fréquence maximal du signal microphone ? .

Curiosus

#3
Bonsoir,

CitationÉcrit par Ayobo : 2*20KhZ

Non, c'est pas 2*20KHz

Ton micro c'est 20Hz au minimum et 20KHz au maximum, après tout dépends de celui-ci.

Ton microcontrôleur possède un ADC (Convertiseur analogique) qui est généralement sous 10 bits, ça te fait de 0 -1023 ça veut dire que si tu prends une tension de référence de 5 volts tu auras un pas de

5 volts / 1023 = 0,004887 volts

il te faudra amplifier ton signal ou prendre un module comme celui-ci https://www.ebay.fr/itm/GY-4466-MAX4466-Electret-Microphone-Amplifier-Adjustable-Gain-for-Arduino/113877068629?_trkparms=aid%3D555018%26algo%3DPL.SIM%26ao%3D1%26asc%3D20131003132420%26meid%3Dfe492ec7e38b4bb0a86934beb388e9e3%26pid%3D100005%26rk%3D2%26rkt%3D12%26mehot%3Dco%26sd%3D283259784596%26itm%3D113877068629%26pmt%3D1%26noa%3D0%26pg%3D2047675%26algv%3DSimplAMLv5PairwiseWeb&_trksid=p2047675.c100005.m1851

Qui est réglable en amplitude

A savoir que tu peux enregistrer et sauvegarder les données avec ton microcontrôleur, en sdram pour plus de rapidité puis le récupérer après.

Si tu veux réussir à  faire ton projet, tu devras apprendre pas mal de chose.

A+

Ayobo

Je vais utiliser un module microphone arduino + une puce ids1420 (enregistrement vocal) à  la sortie de cette puce de base c'est un haut parleur 8 ohms qui vient ce connecté (donc il se trouve une tension analogique), a la place je vais le connecter sur mon arduino pour le numérisé, supposons qu'a cette étape le signal est bien conditionné, il me resteras plus qu'a convertir les datas numérisée en fichier audio .wave et c'est la ou ce pose maintenant mon réel soucis, je ne connais pas trop la démarche à  suivre. Il va falloir faire des recherches internet.

Curiosus

#5
Bonjour,

Si tu pratique un langage de programmation sur PC, tu pourrais écrire un programme pour comprendre le principe (je le fais systématiquement pour tout ce que je comprends pas et sa m'aide vraiment) 

Pour commencer :  lecture de l'entête de celui-ci, puis quand tu as bien assimilé cela tu fais un lecteur de fichier Wav.

Après tu pourras passer au microcontrôleur ou ça seras plus dur, car tu travailles pour le type de ton microcontrôleur en 8 bits, mais avec une résolution de 10 bits ;) pour ADC

Regarde ici https://fr.wikipedia.org/wiki/Waveform_Audio_File_Format Il donne le code source que je remets ici

Citation

                                                                            Bloc de déclaration d'un fichier au format WAVE

   FileTypeBlocID  (4 octets) : Constante «RIFF»  (0x52,0x49,0x46,0x46)
   FileSize        (4 octets) : Taille du fichier moins 8 octets
   FileFormatID    (4 octets) : Format = «WAVE»  (0x57,0x41,0x56,0x45)

[Bloc décrivant le format audio]
   FormatBlocID    (4 octets) : Identifiant «fmt »  (0x66,0x6D, 0x74,0x20)
   BlocSize        (4 octets) : Nombre d'octets du bloc - 16  (0x10)

   AudioFormat     (2 octets) : Format du stockage dans le fichier (1: PCM, ...)
   NbrCanaux       (2 octets) : Nombre de canaux (de 1 à  6, cf. ci-dessous)
   Frequence       (4 octets) : Fréquence d'échantillonnage (en hertz) [Valeurs standardisées : 11 025, 22 050, 44 100 et éventuellement 48 000 et 96 000]
   BytePerSec      (4 octets) : Nombre d'octets à  lire par seconde (c.-à -d., Frequence * BytePerBloc).
   BytePerBloc     (2 octets) : Nombre d'octets par bloc d'échantillonnage (c.-à -d., tous canaux confondus : NbrCanaux * BitsPerSample/8).
   BitsPerSample   (2 octets) : Nombre de bits utilisés pour le codage de chaque échantillon (8, 16, 24)

[Bloc des données]
   DataBlocID      (4 octets) : Constante «data»  (0x64,0x61,0x74,0x61)
   DataSize        (4 octets) : Nombre d'octets des données (c.-à -d. "Data[]", c.-à -d. taille_du_fichier - taille_de_l'entête  (qui fait 44 octets normalement).
   DATAS[] : [Octets du Sample 1 du Canal 1] [Octets du Sample 1 du Canal 2] [Octets du Sample 2 du Canal 1] [Octets du Sample 2 du Canal 2]

   * Les Canaux :
      1 pour mono,
      2 pour stéréo
      3 pour gauche, droit et centre
      4 pour face gauche, face droit, arrière gauche, arrière droit
      5 pour gauche, centre, droit, surround (ambiant)
      6 pour centre gauche, gauche, centre, centre droit, droit, surround (ambiant)


Ici :https://audio.online-convert.com/fr/convertir-en-wav il propose de convertir un fichier audio au format WAV regarde bien car il parle résolution, d'échantillonnage, canaux.

Modifier la résolution en bits : 8 bits, 16 bits, 24 bits, 32 bits

Modifier le taux d'échantillonnage : 8000 Hz, 11025 Hz, 16000 Hz, 22050 Hz, 32000 Hz,44100 Hz, 48000 Hz, 96000 Hz

Modifier les canaux audio : mono, stéréo

Si tu arrives à  comprendre ça, c'est que tu as tout compris ;)

    A+


Ayobo

#6
Daccord merci pour ton aide, si j'ai bien compris tu veut que je crée un C un premier code permetant la lecture d'un fichier audio pour bien mettre en oeuvre l'en tête du programme puis ensuite créer en C le code complet permettant directement de crée un fichier audio via les donnée numérique provenant du signal microphone.

Sa semble pas facile je vais déjà  essayer de comprendre tous sa, ce qu'il manque ces vraiment des exemple en C qui permette de créer un fichier wave! c'est peut être moi qui recherche avec les mauvais mot clé sur la toile! En tous cas merci .

Edit :
Finalement j'ai trouver le site suivant qui à  l'air pas mal !

http://fvirtman.free.fr/recueil/01_09_03_wav.c.php

Curiosus

#7
Bonsoir,

Si j'ai le temps, je vais te l'écrire en RapidQ, voir ici https://fr.wikipedia.org/wiki/RapidQ 

C'est du basic, langage de programmation entièrement gratuit, fonctionne sous linux et jusquâ€™à  maintenant sur tous les Windows et même sous dos. ;)

Pour faire des petits programmes pour applications électroniques, il y a pas mieux.

A+


Curiosus

Bonsoir,

Voila pour commencer un exemple d'une lecture de l'entête d'un fichier Wav, essai de comprendre ça.

Par la suite, quand j'aurais le temps, je vais te montrer comment créer un fichier Wav.

A+

Ayobo

Bonjour merci pour ta réponse pour le moment j'ai récuperer un code en C permettant de créer une sinus en même temps de créer un fichier wave en manipulant une variable de type fichier :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int FREQUENCE =1000;
#define BITPERSAMPLE 16
#define PI 3.1415927

typedef int int32;
typedef short int16;
typedef char int8;

struct WavHeader
{
    int8 FileTypeBlocID[4];
    int32 FileSize;
    int8 FileFormatID[4];
};

struct WavFmt
{
    int8 FormatBlocID[4];
    int32 BlocSize;
    int16 AudioFormat;
    int16 NbrCanaux;
    int32 Frequence;
    int32 BytePerSec;
    int16 BytePerBloc;
    int16 BitsPerSample;
};

FILE * wavfile_open( const char *filename )
{
    struct WavHeader head = {{'R','I','F','F'},0,{'W','A','V','E'}};
    struct WavFmt Fmt = {{'f','m','t',' '},16,1,1,FREQUENCE,FREQUENCE*BITPERSAMPLE/8,BITPERSAMPLE/8,BITPERSAMPLE};
    FILE* F;
    F = fopen(filename,"wb");
    if(!F)
        return 0;
    fwrite(&head,sizeof(head),1,F);
    fwrite(&Fmt,sizeof(Fmt),1,F);
    return F;
}

void wavfile_write(FILE *F, double* data,int32 length )
{
    char subhead[5] = "data";
    fwrite(subhead,4,1,F);
    fwrite(&length,sizeof(length),1,F);
    fwrite(data,sizeof(double),length,F);

}

void wavfile_close( FILE *file )
{
    int file_length = ftell(file);
    int32 FileSize = file_length - 8;
    fseek(file,4,SEEK_SET);
    fwrite(&FileSize,sizeof(FileSize),1,file);
    fclose(file);
}

int main()
{
    FILE* F;
    int i;
    int nbsecondes = 10;
    int updown = 1;
    double* y = malloc(nbsecondes*FREQUENCE*sizeof(double));
   

    for(i=0;i<(nbsecondes*FREQUENCE);i++)
            {y=sin(2*PI*FREQUENCE);}
       

    F = wavfile_open("sound.wav");
    if (!F)
    return -1;
    wavfile_write(F,y,nbsecondes*FREQUENCE);
    free(y);
    wavfile_close(F);
    return 0;
}

Ayobo

Cependant à  la place de la sinus dans la structure wavefil_write il faudrait que j'envoie mon tableau qui contient les valeur numérisé du signal analogique provenant de mon microphone, Si la résolution permet d'avoir une bonne dynamique du signal, alors le fichier wave créer seras de qualité acceptable.

Curiosus

#12
Bonsoir,

Le gros problème c'est que tu veux aller trop vite, sans comprendre le fonctionnement d'un enregistrement d'un fichier Wav

Sais tu ce que c'est un échantillonnage ?

Si oui, as tu une idée de la façon de procéder ?   

Pour faire un fichier Wav, il faut paramétrer ce que je viens de citer au-dessus, et tu feras de même pour ton convertisseur numérique de ton microcontrôleur ou sans lui, avec autre composant. 

Sous Windows il y a winmm.dll qui s'occupe de ça, mais si tu la paramètre pas l'enregistrement ne se feras pas.

Copier du code source je suis pas contre, mais si tu comprends pas un minimum tu feras pas grand chose. 

Je te conseille de lire ceci : http://culturesciencesphysique.ens-lyon.fr/ressource/numerisation-acoustique-Chareyron2.xml

C'est pas pour t'embêter que je dis ça, c'est pour que tu progresses  ;)

A+

Ayobo

Alors tous d'abord je vais te présenter un bloc fonctionnelle correspondant à  mon projet pour avoir les idées plus clair, tu as aussi le bloc diagramme interne de la puce ids1820 qui est un CI permettant l'enregistrement vocal à  partir du microphone la durée d'enregistrement vocal est de 16 secondes par défaut et paramétrable.

En partant sur le fait que le signal analogique provenant du microphone est analogique est de fréquences variable selon le thon de la voix on va dire une étendue de [20Hz;20KHZ], il faut choisir au niveaux de l’échantillonneur bloqueur la fréquence d'échantillon permettant d'avoir une bonne dynamique du signal, sur le liens que tu ma présenter en générale une fréquence d'échantillon de 44100 HZ est utilisée pour pouvoir restitué cette étendue de fréquence, Ce qui correspond a une période d’échantillonnage de 22.6 uSecondes, Le Temp de maintient (mode hold) doit être légèrement supérieur à  la période d'échantillonnage, admettons que Th = 32.6 uSeconde
La fréquence d’échantillonnage du CAN qui lui auras pour rôle de numérise les échantillons prélever par l’échantillonneur-bloqueur doit alors avoir une Fe = 44100HZ ?

Les ordres de grandeurs que je t'es données notamment Th et Fe du CAN semble plausible pour la restitution du signal numérise ?

J'ai remarqué que le signal microphone à  la sortie de la puce ids1820 est déjà  en partie échantillonné selon la durée d'enregistrement, je te met sa en pièce jointe.

Je réfléchis-serais  ensuite à  la construction de mon fichier wave et l'espace mémoire qu'il prendras en fonction de la chaîne de traitement du signal. J'avoue qu'il pas mal de chose flou sur la construction de ce fichier même si j'ai compris quelques truc.

PS : J'ai pas non plus besoin d'un son 5 étoile juste ce qu'il faut donc si tous n'est pas dimensionné en a la microsonde près c'est pas bien grave.