AC3 Decoder 的 定點化~~

討論MP3、WAV、MIDI、WMA甚至其他數位音訊的播放、製作、轉換等。

版主: DearHoney

回覆文章
am
初學者
文章: 1
註冊時間: 2005-03-17 16:37

AC3 Decoder 的 定點化~~

文章 am »

請問一下有人知道要怎麼作定點化的動作嗎?
因為公司的機器沒有浮點運算器,所以要將浮點改定點~~
還是有什麼參考的資料呢?

目前是有找到一個 A52Dec
http://liba52.sourceforge.net/downloads.html
他是利用一個define定義,來決定程式是要compile成浮點或定點
if defined(LIBA52_FIXED)就是定點
沒define就是浮點
浮點可以成功解碼出來\r
但是他的定點沒辦法解碼(解碼過程可以run完,但是解出來的資料是錯的)

現在有二個方向走,
一個是修正原本程式的定點計算(但是要知道錯在哪?!)
一個是自己去作定點化
所以想上來問一下定點化的方法。

或是有人可以告訴我,原本程式定點計算是錯在哪?
以下節錄一段程式碼是我覺得可能會有問題的 >_<"

#ifndef LIBA52_FIXED

typedef sample_t quantizer_t;
#define SAMPLE(x) (x)
#define LEVEL(x) (x)
#define MUL(a,b) ((a) * (b))
#define MUL_L(a,b) ((a) * (b))
#define MUL_C(a,b) ((a) * (b))
#define DIV(a,b) ((a) / (b))
#define BIAS(x) ((x) + bias)

#else /* LIBA52_FIXED */

typedef int32_t quantizer_t;
#define SAMPLE(x) (sample_t)((x) * (1 << 30))
#define LEVEL(x) (level_t)((x) * (1 << 26))
#define MUL(a,b) \
({ int32_t _ta=(a), _tb=(b), _tc; \
_tc=(_ta & 0xffff)*(_tb >> 16)+(_ta >> 16)*(_tb & 0xffff); (int32_t)(((_tc >> 14))+ (((_ta >> 16)*(_tb >> 16)) << 2 )); })

#define MUL_L(a,b) \
({ int32_t _ta=(a), _tb=(b), _tc; \
_tc=(_ta & 0xffff)*(_tb >> 16)+(_ta >> 16)*(_tb & 0xffff); (int32_t)((_tc >> 10) + (((_ta >> 16)*(_tb >> 16)) << 6)); })

#define MUL_C(a,b) MUL_L (a, LEVEL (b))
#define DIV(a,b) ((((int64_t)LEVEL (a)) << 26) / (b))
#define BIAS(x) (x)

#endif

在定點及浮點模式下,乘法除法計算不同。
浮點是直接相乘。
定點卻是回傳 (4*(a*b) )<<32
是這部分有錯嗎?
回覆文章