請問一下有人知道要怎麼作定點化的動作嗎?
因為公司的機器沒有浮點運算器,所以要將浮點改定點~~
還是有什麼參考的資料呢?
目前是有找到一個 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
是這部分有錯嗎?
AC3 Decoder 的 定點化~~
版主: DearHoney