開發定點 (Fixed-point) 演算法時,需在功能正確性、數值精度建模、驗證 (仿真) 速度三者間權衡。傳統做法使用 C 內建 float/double 快速原型,再手工轉換為定點,過程繁瑣易錯,且受限於 64 位元整數或 53 位元尾數精度上限 (如 33 位元 × 33 位元乘法會溢位 64 位元)。
Algorithm C Datatypes 是基於類別的 C++ 庫,提供任意長度的整數 (ac_int) 與定點 (ac_fixed) 類型,具備:
float fir_float(float input) {
static float coeffs[N] = {...};
static float delay_line[N] = {0};
float acc = 0;
for (int i = N-1; i > 0; --i) delay_line[i] = delay_line[i-1];
delay_line[0] = input;
for (int i = 0; i < N; ++i) acc += coeffs[i] * delay_line[i];
return acc;
}
int16_t fir_fixed(int16_t input) {
const int16_t coeffs[N] = {...}; // Q1.15 格式
static int16_t delay_line[N] = {0};
int32_t acc = 0; // 擴展位寬防溢位
for (int i = N-1; i > 0; --i) delay_line[i] = delay_line[i-1];
delay_line[0] = input;
for (int i = 0; i < N; ++i) acc += (int32_t)coeffs[i] * delay_line[i];
return (int16_t)(acc >> 15); // 截斷量化
}
#include
typedef ac_fixed<16, 1, true> coeff_t; // 16 位元,1 個整數位 (含符號), 有符號
typedef ac_fixed<32, 2, true> acc_t; // 累加器擴展位寬
coeff_t fir_ac_fixed(coeff_t input) {
static const coeff_t coeffs[N] = {...};
static coeff_t delay_line[N] = {0};
acc_t acc = 0;
for (int i = N-1; i > 0; --i) delay_line[i] = delay_line[i-1];
delay_line[0] = input;
for (int i = 0; i < N; ++i) acc += coeffs[i] * delay_line[i];
return coeff_t(acc); // 隱含量化/飽和語義
}
位寬參數化意味著只需修改 typedef 即可探索設計空間 (如嘗試 18 位元係數、24 位元累加器),無需重寫演算法邏輯。
任意位寬類型將「精度建模」從「手工苦力」升級為「參數化探索」,讓演算法工程師專注於架構創新,是現代 DSP/硬體加速開發流程的關鍵基礎設施。