2011-03-07 2 views
2

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

+0

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

+0

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

+0

Voir aussi: http://stackoverflow.com/questions/15087668/how-to-convert-pcm-samples-in-byte-array-as-floating-point-numbers-in-the-range – Brad

Répondre

1

Vous devez soustraire 32768 à partir de vos données non signées d'abord, il est donc 0 centré.

+0

Je ne suis pas sûr si ce que je l'ai fait a obtenu le même effet, mais il semble fonctionner avec l'ajout d'une variable SINT16 « éCHANTILLONS » utilisé pour transmettre la valeur de l'échantillon dans ... (Désolé, je ne pouvais pas travailler sur le formatage de mini-Markdown pour ajouter le code) – Sammio2

+0

vous pouvez également soustraire 0,5 du résultat de la division –

Questions connexes