作爲一個小型實驗性音樂作品,我試圖用標準C編寫一首歌曲。代碼輸出一個可導入Audacity的原始PCM文件。目前一切正常,但我在嘗試將每個採樣寫入16位時遇到問題,而不是當前使用的8位。編寫16位原始PCM文件時出現問題
直到被寫入的點,當前樣本計算爲一個浮點數,並且其邊界幾乎保留在有符號的8位整數的範圍內。然後在重複下一個採樣的過程之前將其寫爲8位整數。這工作正常,並正常播放。當我嘗試將它寫入16位原始PCM文件時出現問題 - 我將浮點數乘以256,並將結果複製到整數,於是我使用fwrite寫入所得的16位整數。這在導入時不會給出預期的結果,導致我期望的結果高度扭曲。
我已經添加了下面的有效代碼,因爲問題只發生在寫作階段。
工作的8位代碼:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
putc(out,fo);
不工作的16位代碼:
if (out<-127) {out=-128;} else if (out>126) {out=127;}
pcm=out*256;
fwrite(&pcm,2,1,fo);
我可能只是缺少明顯的東西,但我一直在努力工作吧用了幾個小時。提前致謝!
是pcm an int16_t? – RWS 2010-07-24 14:41:52
嗯...我認爲8位WAV文件應該使用*無符號*樣本。 – 2010-07-24 14:43:14
你需要顯示'pcm'的聲明。 – caf 2010-07-25 03:59:40