2011-03-07 70 views
2

這是我的第一篇文章,所以我希望有人可以幫忙!將16位PCM值轉換爲-1到1的值

我正在使用AudioFileReadPackets函數讀取音頻數據(在CoreAudio中),此代碼正常工作並將16位PCM值加載到緩衝區中。

第一個樣本值是這樣的:'65491'(在此音頻開始處有沉默)。我知道這是一個無符號整數,所以我的問題是,如何將此值轉換爲-1到1的範圍。

目前,我將樣本值除以32768.0爲浮點變量,就像這樣.. 。

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; 

     } 

然而,對於樣品上面給出(如實施例),這導致的「1.998626709」的輸出不爲0(因爲它應該是爲沉默)?

說了這麼多,當我在文件的很多後面看樣本時,我知道它的值在'0.3'附近,算法的結果出來在'0.311584473',我相信正確嗎?

那麼爲什麼第一個樣本不會被讀爲零,因爲我知道他們是?

如果有人能幫助我,我將不勝感激!

山姆

+0

一般來說+1.0不是浮點的有效樣本值。這允許通過簡單的乘法或除法無損地轉換/從浮點數轉換。 – sbooth 2011-03-09 16:46:48

+0

嗨sbooth,謝謝,是的,我有一個進一步的子程序,在任何進一步處理之前,將+1.0值改爲+0.999。 – Sammio2 2011-03-18 20:41:39

+0

另請參閱:http://stackoverflow.com/questions/15087668/how-to-convert-pcm-samples-in-byte-array-as-floating-point-numbers-in-the-range – Brad 2013-12-27 05:03:38

回答

1

您需要首先減去你的無符號數32768,所以它的0居中。

+0

我不是當然,如果我所做的已經達到了同樣的效果,但它似乎與另外一個SInt16變量'sampleS'一起用於將樣本中的值傳遞給... (對不起,我無法工作用迷你Markdown格式添加代碼) – Sammio2 2011-03-07 16:59:32

+0

你也可以從除法結果中減去0.5 – 2013-08-02 03:39:39