作者LPH66 (-858993460)
看板C_and_CPP
標題Re: [問題] 聲音的bit轉換。。
時間Sun Nov 28 01:37:37 2010
※ 引述《DrStein (啤酒肚)》之銘言:
: 推 stool100:把數值 右移 16 或是 24 bit 11/26 19:15
: → DrStein:右移不是把振幅小的給砍了? 而不是等比例縮放啊。。 11/26 19:23
: 推 shuckmol:& 0xFFFF 11/26 19:38
: → shuckmol:把在之前你應該先把 32bit的值除以 16bit的最大值65536 11/26 19:40
: 真的不是很懂啊。
: 32bit的最大值可以寫成 0xffffffff, 不過最大值不是 -INT_MAX嗎
: 0xffffffff不是-1這數字嗎?
: 還是聲音訊號是用unsigned ?
: 那我上面寫的 output = (short)( SHRT_MAX*((double)input/INT_MAX) )
: 該怎麼修正呢?
: & 0xFFFF 為何要按位,與1做與操作啊。。這什麼意思呢?
: 還請釋疑 謝謝。
根據我手上的資料表示
WAV 檔案在超過 8-bit 的 sample 是 signed
而那個 sample 值其實只是個相對數值
最大值是 011...1 最小值是 100...0
也就是說 如果你是要把 32 => 16 的話 右移就行了
但 8-bit 的 sample 卻是 unsigned
最大值是 11111111 最小值是 00000000
所以除了右移到剩下 8 bit 以外還要 +128
---
以下是這麼做為何是對的解釋
數學上這個 down-sampling (不是 cost-down...) 的式子是這樣
sample - OLDMIN newsmp - NEWMIN
--------------- = ---------------
OLDMAX - OLDMIN NEWMAX - NEWMIN
要注意的是因為 sample 值是代表在最大值和最小值之間的比例
所以 OLDMAX 對應到 NEWMAX 即是最大強度
OLDMIN 對應到 NEWMIN 即是最小強度
不管它們的值是多少都一樣
sample - OLDMIN
那麼 由上式可以解得 newsmp = --------------- * (NEWMAX - NEWMIN) + NEWMIN
OLDMAX - OLDMIN
若是 A bit down sample to B bit 則
OLDMAX - OLDMIN = 2^A
NEWMAX - NEWMIN = 2^B
(其實嚴格說起來這裡是 (2^A)-1 和 (2^B)-1 啦,
但如果你要算這麼嚴, 下面會得到一個長得醜醜的式子但是值卻差不多,
那還不如就直接去掉 -1 來算)
所以式子就變成 (sample - OLDMIN) / 2^(A-B) + NEWMIN
= sample/2^(A-B) - OLDMIN/2^(A-B) + NEWMIN
32 -> 16 的情形中 OLDMIN = -2^A NEWMIN = -2^B
也就是正好 OLDMIN/2^(A-B) 和 NEWMIN 一正一負抵消 式子剩下 sample/2^(A-B)
所以才有「直接右移就行了」的結論
而 down sample to 8 bit 時
OLDMIN = -2^(A-1) 所以 OLDMIN/2^(A-B) = -2^(B-1) = -2^(8-1) = -128
但 NEWMIN 是 0 所以才說右移後要加 128
以上
--
那個 &0xFFFF 單純是搞錯你的意思而已...
--
実琴:「
河野!你真的就這樣被
物質慾望給吸引過去了嗎?!」
亨:「只要
穿著女裝擺出親切的樣子,所有必要花費就能
全免,似乎一點都不壞啊。」
実琴:「難道你沒有
男人的尊嚴了嗎?!」
亨:(斷然道)「
沒有。在
節衣縮食且
生活吃緊的
學生面前,
沒有那種東西。」
--プリンセス・プリンセス 第二話
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.92
→ tropical72:推專業 11/28 01:43
→ DrStein:謝謝 完全懂了 這偏該m起來 11/28 02:57
→ DrStein:還有 :32 -> 16 的情形中 OLDMIN = -2^A NEWMIN = -2^B 11/28 03:34
→ DrStein:OLDMIN = -2^(A-1) NEWMIN = -2^(B-1) 吧 11/28 03:35
→ DrStein:不過最後結論是一樣的 11/28 03:35
→ LPH66:啊啊弄錯了XD 感謝指正 11/28 04:12
推 nowar100:m 11/28 10:27
推 legnaleurc:推 ... 那音量的處理也是 shift 就好了嗎? 11/28 13:05