Re: [問題] 聲音的bit轉換。。

看板C_and_CPP作者 (-858993460)時間15年前 (2010/11/28 01:37), 編輯推噓2(206)
留言8則, 5人參與, 最新討論串3/4 (看更多)
※ 引述《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
謝謝 完全懂了 這偏該m起來
11/28 02:57, 2F

11/28 03:34, , 3F
還有 :32 -> 16 的情形中 OLDMIN = -2^A NEWMIN = -2^B
11/28 03:34, 3F

11/28 03:35, , 4F
OLDMIN = -2^(A-1) NEWMIN = -2^(B-1) 吧
11/28 03:35, 4F

11/28 03:35, , 5F
不過最後結論是一樣的
11/28 03:35, 5F

11/28 04:12, , 6F
啊啊弄錯了XD 感謝指正
11/28 04:12, 6F

11/28 10:27, , 7F
m
11/28 10:27, 7F

11/28 13:05, , 8F
推 ... 那音量的處理也是 shift 就好了嗎?
11/28 13:05, 8F
文章代碼(AID): #1CyK7af- (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1CyK7af- (C_and_CPP)