Ceci est mon premier post, donc j'espère que quelqu'un peut vous aider! Je lis des données audio (dans CoreAudio) en utilisant la fonction AudioFileReadPackets, ce code fonctionne correctement et charge les valeurs PCM 16 bits dans un tampon.Conversion PCM 16bit valeurs en -1 à 1 valeurs
La première valeur de l'échantillon est la suivante: « 65491 » (Il est silence au début de cette audio). Je comprends qu'il s'agit d'un entier non signé, donc ma question est, comment convertir cette valeur en une gamme de -1 à 1.
Actuellement, je divise la valeur d'échantillon par 32768.0 en une variable float, comme si .. .
for (UInt32 i = 0; i < packetCount; i++){
sample = *(audioData + i);
//turn it into the range -1.0 - 1.0
monoFloatDataLeft[i] = (float)sample/32768.0;
}
Cependant, pour l'échantillon donné ci-dessus (comme exemple) il en résulte une sortie de « 1,998626709 » qui est non nul (comme cela devrait être le silence)? En disant ceci, quand je regarde un échantillon beaucoup plus tard dans le fichier, dont la valeur je sais être autour de la marque '0.3', le résultat de l'algorithme sort à '0.311584473' que je crois être correct?
Alors, pourquoi sont les premiers échantillons ne sont pas lu zéro, comme je les connais pour être?
Si quelqu'un peut aider, je serais très reconnaissant!
Sam
D'une manière générale +1,0 n'est pas une valeur d'échantillon valable pour virgule flottante. Cela permet une conversion sans perte de/vers float avec une simple multiplication ou division. – sbooth
Salut sbooth, merci, oui j'ai un autre sous-programme qui modifie toutes les valeurs de +1.0 à +0.999 ... avant tout autre traitement! – Sammio2
Voir aussi: http://stackoverflow.com/questions/15087668/how-to-convert-pcm-samples-in-byte-array-as-floating-point-numbers-in-the-range – Brad