看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《DrStein (啤酒肚)》之銘言: : 對聲音不是很清楚啊,還請大大指點: : 現在有聲音 原為32 bit : 想costdown為 16 bit ,甚至8 bit : 請問程式要怎寫呢?? : 我是假設原本聲音為 32bit ,可用int(DWORD)表式 : 16就是short(WORD) : 所以 : int input;/*輸入*/ : short output;/*輸出 被cost down的結果*/ : output = (short)( SHRT_MAX*((double)input/INT_MAX) ) : 請問是這樣轉換的嗎 : 還有wave裡面的資料型態到底是signed還是unsigned啊 : 謝謝 :- : 發信站: 批踢踢實業坊(ptt.cc) :묠From: 59.120.158.204
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做與操作啊。。這什麼意思呢? 還請釋疑 謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.115.143.194 ※ 編輯: DrStein 來自: 58.115.143.194 (11/28 01:05)
tropical72:http://ppt.cc/AL56 你第一個問題裡面就有跡可尋了. 11/28 01:16
tropical72:拉到Note上面的圖,裡面的samples都是用hex表示,hex:無 11/28 01:17
tropical72:號數。所以你至少要先把samples buffer 都改 unsigned. 11/28 01:17
tropical72:至於你說要cost down. Y=AX+B,我看來不知除了除16之外 11/28 01:18
tropical72:還有什麼好方法可以解決.如果連續數值差異都在2^16-1之 11/28 01:19
tropical72:內的話,倒是有種方法可以試試.但對音效檔而已,這幾乎是 11/28 01:20
tropical72:不可能存在的事。 11/28 01:20
tropical72:另,除16我以為是等比例縮小,並非如您所說非等比例縮放. 11/28 01:23
DrStein:樓上 所以 只要 input>>16 就好了? 11/28 01:37
tropical72:專業的出現了,抱歉誘導了你 XD 11/28 01:46