Dbmètre Arduino

Bonjour, je suis actuellement entrain de réaliser un projet dans lequel je dois relever le niveau d'intensité sonore en dB à l'aide de cette carte : SparkFun Electret Microphone Breakout - BOB-12758 - SparkFun Electronics
Je sais que le CAN renvoie une valeur comprise entre 0 et 1023 mais je ne vois pas du tout comment exploiter ces valeurs pour en ressortir des dB.
C'est là que j'aimerai avoir des éclaircissements par rapport à ça.

Merci de votre compréhension.

Bonjour,

Allez sur le liens que vous nous avez fourni, cliquez sur " hookup Guide " vous aurez toutes les infos nécessaires

Julien

un petit exemple de mesure en dba

// consts
#define AmpMax (1024 / 2)
#define MicSamples (1024*2) // Three of these time-weightings have been internationally standardised, 'S' (1 s) originally called Slow, 'F' (125 ms) originally called Fast and 'I' (35 ms) originally called Impulse.
 
// modes
#define ADCFlow // read data from adc with free-run (not interupt). much better data, dc low. hardcoded for A0.
 
// calculate volume level of the signal and print to serial and LCD
void MeasureVolume()
{
    long soundVolAvg = 0, soundVolMax = 0, soundVolRMS = 0, t0 = millis();
    for (int i = 0; i < MicSamples; i++)
    {
#ifdef ADCFlow
        while (!(ADCSRA & /*0x10*/_BV(ADIF))); // wait for adc to be ready (ADIF)
        sbi(ADCSRA, ADIF); // restart adc
        byte m = ADCL; // fetch adc data
        byte j = ADCH;
        int k = ((int)j << 8) | m; // form into an int
#else
        int k = analogRead(MicPin);
#endif
        int amp = abs(k - AmpMax);
        amp <<= VolumeGainFactorBits;
        soundVolMax = max(soundVolMax, amp);
        soundVolAvg += amp;
        soundVolRMS += ((long)amp*amp);
    }
    soundVolAvg /= MicSamples;
    soundVolRMS /= MicSamples;
    float soundVolRMSflt = sqrt(soundVolRMS);
    float dB = 20.0*log10(soundVolRMSflt/AmpMax);
 
    // convert from 0 to 100
    soundVolAvg = 100 * soundVolAvg / AmpMax; 
    soundVolMax = 100 * soundVolMax / AmpMax; 
    soundVolRMSflt = 100 * soundVolRMSflt / AmpMax;
    soundVolRMS = 10 * soundVolRMSflt / 7; // RMS to estimate peak (RMS is 0.7 of the peak in sin)
 
    // print
    Serial.print("Time: " + String(millis() - t0));
    Serial.print(" Amp: Max: " + String(soundVolMax));
    Serial.print("% Avg: " + String(soundVolAvg));
    Serial.print("% RMS: " + String(soundVolRMS));
    Serial.println("% dB: " + String(dB,3));
}

Transformer une mesure en dB c’est juste une transformation du rapport entre deux mesures de puissance à l’aide des logarithmes décimaux .

Ce qui est plus compliqué c’est de comprendre les déci-Bel dans l’application acoustique.
Pour ma part je jongle sans difficulté avec les déci-Bels électriques parce que leur définition est simple → par définition la référence de puissance est égale à 1 mW dans l’impédance considérée.

Mais je n’ai jamais compris qu’elle était la référence de puissance dans le cas d’une mesure acoustique.

Ce qu’il faut absolument connaître :

  • en acoustique quelle est la référence de puissance ?
  • comment relier une mesure de tension à une puissance ?

La “formule” est 10log(P/Pref) dans le cas général où on manipule des puissances.
Mais si on manipule des tensions on utilise 20
log(U/Uref) puisque P = U2/R et que log(U2)= 2*log(U)

Si les tensions mesurées sont une image d’une puissance faut-il utiliser le multiplicateur 10 ou 20 → voila la question .

Un_Castor:
Bonjour,

Allez sur le liens que vous nous avez fourni, cliquez sur " hookup Guide " vous aurez toutes les infos nécessaires

Julien

Bonjour,

Malheureusement ce lien n’indique pas comment convertir la valeur retournée par le CAN en dB…

Je sais aussi que la formule pour passer de la tension au niveau d’intensité sonore par rapport à un signal est : 10 log (<U²>/10e-6)

Les dB électronique c'est simple et d'ailleurs c'est pour les télécom que le Bel a été introduit, sinon pourquoi aurait-on donné à cette unité le nom de l'inventeur du téléphone ?

Les dB acoustique c'est le foutoir !
Je connaissais la correction psophométrique utilisé dans les télécom mais pas la psychophysiologique, on en apprend tous les jours ( à moins que ce ne soit la même chose).

Ce qu'il faut pour faire un dBmètre (le d vient du multiplicateur "deci" il se met en toujours en minuscule, l'unité c'est le B le Bel) c'est une puissance dans la bande passante de l'oreile.

Le problème est que la bande passante de l'oreille n'est pas constante en fonction du niveau reçu --> l'oreille humaine possède des systèmes d'auto défense.

Autre difficulté le convert de l'ADC ne mesure que des échantillons de tension et à partir de ces échantillons il faut obtenir une puissance.
Les vrais puissancemètre utilisent le principe d'un thermo couple pour faire une intégration large bande et font une correction derrière.

Tout n'est perdu on sait réaliser des dBmètres acoustiques mais vraiment il faut lire de la documentation spécialisée.
Je pense que le code attendra que le principe de conversion soit au point.

Bonnes lectures.