Re: [問題] 聲音的bit轉換。。
※ 引述《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
→
11/28 01:43, , 1F
11/28 01:43, 1F
→
11/28 02:57, , 2F
11/28 02:57, 2F
→
11/28 03:34, , 3F
11/28 03:34, 3F
→
11/28 03:35, , 4F
11/28 03:35, 4F
→
11/28 03:35, , 5F
11/28 03:35, 5F
→
11/28 04:12, , 6F
11/28 04:12, 6F
推
11/28 10:27, , 7F
11/28 10:27, 7F
推
11/28 13:05, , 8F
11/28 13:05, 8F
討論串 (同標題文章)