你說的癥結,意思是指自行設計的解碼器解出來的誤差可能會更小,為什麼要只使用公版解碼器?是這個意思嗎?tyf 寫:我前面弄錯了
舉另一個例子好了..
原始資料:1564
電影廠商編碼器 f(x)=(√x)/5 編碼後的值為 8
公板解碼器 g(y)=(y*5)^2 反算得 1600
如果有一家 DVD Player 公司不爽用公板的 g(y),自行研發...
自家解碼器 h(y)=[(y*1.1111)^2]*20 反算得 1580
癥結就在這裡,為何解碼器只有一種 g(y)?
我先說明一下你上面舉的例子。
你舉的例子和前面的例子意義是一樣的,只是數字比較複雜。
一般有 dead-zone 的量化器,在正負量化間距之間的數字都會被量化為 0,譬如說量化間距 10, -10<~<+10 之間的數字量化後都為 0。
所以你舉的例子,量化後的數字應該為 7。
假設你的意思是要將除出來的數字作四捨五入變成整數,所以結果會得到 8,我把兩種解碼器的算式重寫一遍
q 是量化後的數字
"公版解碼器" = q^2 * 5^2 = q^2 * 25(完全整數運算)
"自家解碼器" = (q^2 * 1.1111^2) * 20 = q^2 * 1.23454321 *20 = q^2 * 24.6908642(浮點數運算(雖然可以改為整數運數),計算結果四捨五入為整數)
那麼,如果原始資料中有一個數字是 1800,照你的量化器量化後得到的數字為 8,以公版解碼得到 1600,誤差 200,以自家解碼得到 1580,誤差 220。自家解碼器解出來的誤差比公版解碼器還大。
再舉極端一點的例子,如果原始資料中有一筆資料是 1600,以公版解碼器解碼得到的數字是 1600,完全沒有誤差,以自家解碼器解碼會誤差 20。
也就是說,當資料超過 1590 以上,到 1812 以下,以自家解碼器解碼的誤差都將會比公版解碼器來得大。只有當數字落在 1590~1388 之間時,自家解碼器解出來的誤差才會小於公版解碼器,而這個解碼結果較好的範圍比公版解碼器結果較好的範圍來得小。(因為公版解碼器解出來的結果位於量化間距的中間)
所以平均來講,公版解碼器會得到較好的解碼結果。
一般來說量化間距是多少,解碼時自然乘以量化間距,不會隨便亂乘一個數字,這樣也才符合量化的概念,否則我們就不是在壓縮資料,而是在亂破壞資料了。
當然壓縮檔會包含使用的量化間距的資訊,告知解碼器,該乘上那個數字來解碼,這些在制訂標準的時候就會先考慮好。
回過頭來說,那什麼情況下解碼器可能會解出不同的結果?
像 kouyoumin 大大大大(用力),上面說的,當算式中有用到 根號.sin.cos 之類的計算,這些計算會產生小數,這些小數要精確到第幾位,不同解碼器會有不同的作法,這個時候就會產生差異了。
譬如說在影音資料壓縮方面,對解碼時間的要求很嚴苛,影音資料的解碼多半要求要能夠做到即時解碼,不希望看到或聽到影音延遲中斷的現象。如果我今天要把解碼器做到硬體上面,我就會考慮這個 DSP 能不能做浮點數運算?浮點數運算精確度是多少?如果沒有浮點運算,能不能用整數運算模擬浮點運算?模擬計算的速度會不會很慢?... 等等等等,會有一堆考量。如果我是要寫軟體 decoder,我會考慮 CPU 的解碼速度夠不夠快,譬如說原本算式中會用到大量的乘、除運算,我能不能改寫成簡單的加、減計算來取代,我能不能用整數計算取代浮點運算,這樣便可以使用 MMX 來加速計算.....
因為會有這些考量,作出來的 decoder 就有所不同,有的是計算精度的差異,有的是重新改寫了計算式,減少了複雜運算的次數,有的是使用新的改良式計算法..... 等等,不過不管如何,解出來的結果必須和 Reference 的 decoder 相差在規定的範圍內,這樣才算是 compliance 的 decoder。
這些在制訂標準的時候都會一併制訂進去。
DTS 使用的 ADPCM 壓縮法,就很接近上面那種簡單的量化法(切成好幾個 Subband,每個 Subband 紀錄 DPCM,根據心理聲學的判斷,決定每個 Subband 要分配多少 bit(要給多大的量化間距)),其中沒有用到這些複雜的轉換計算,所以每個 decoder 解出來的結果都一樣。
再者,DTS 的規格封閉,外人沒有辦法自行設計一個 DTS decoder,所有 decoder 都是向 DTS 公司買的解碼引擎,用同一個 source,所以各個 decoder 就更不可能有差異。
這個不是事實。如果您興趣,可以買一本資料壓縮的書回去研讀,相信你可以從中找到正確的答案。tyf 寫:一般來說,只有不失真壓縮才能拍胸脯保證大家解回去都一樣.
既然已經失真了,只要各家演算法稍有不同,就很難保證有相同解.