看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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