本報告記錄在 TI DM642 (C64x+ 架構) 上實現定點 FFT 的算法設計、溢出處理策略、運行性能(周期數/時間)及精度對比測試結果。參考浮點實現作為基準驗證正確性。
採用動態溢出檢查:每級蝶形運算前遍歷所有數據,若檢測到潛在溢出,對整個數組統一右移縮放。此法避免了定點 FFT 常見的「小信號過度衰減、大信號溢出」問題,保證相對精度,但幅度會整體縮放(僅求相對值)。
單次蝶形運算:X1 + X2 * WN (複數)。最壞情況下,旋轉因子將 X2 模值全部投影到實部或虛部,且 X1、X2 同相疊加。設輸入模值上限為 MAX_IN,輸出上限 MAX_OUT (16-bit: 0x7FFF)。
推導得最大允許輸入模值:MAX_IN < MAX_OUT / (sqrt(2)+1) ≈ MAX_OUT / 2.414。
因 2.414 ∈ (2, 4),同級最多溢出 2 bit。動態調整策略:
經模擬驗證:單極不溢出條件 (16-bit 下約 13573) 可保證全流程無溢出,代價是損失 ~2 bit 精度,累積誤差可控。
| 指標 | 浮點 FFT | 定點 FFT | 差異 |
|---|---|---|---|
| 運行周期數 | 99,510 | 56,143 | -43.6% |
| 運行時間 (40ns/周期) | 3.98 ms | 2.25 ms | -1.73 ms |
| 精度 (對比浮點基準) | 基準 | 平均絕對誤差 0.000226 相對誤差 0.03986% | 極高 |
ov=1 觸發 3 次,總縮放 2³=8 倍。定點結果 ×8 後與浮點結果吻合,驗證縮放邏輯正確。for (p = 0; p < 8; p++) {
if (y[p].real > 27146 || y[p].imag > 27146 ||
y[p].real < -27146 || y[p].imag < -27146) { // 超過 2x 閾值
ovd = 1; break;
}
else if (y[p].real > 13573 || y[p].imag > 13573 ||
y[p].real < -13573 || y[p].imag < -13573) { // 超過 1x 閾值
ov = 1;
}
}
if (ovd) { for (p=0;p<8;p++) { y[p].real >>= 2; y[p].imag >>= 2; } }
else if (ov) { for (p=0;p<8;p++) { y[p].real >>= 1; y[p].imag >>= 1; } }
cheng.real = ((y[num2].real * costable[idx]) >> 15) +
((y[num2].imag * sintable[idx]) >> 15);
cheng.imag = ((y[num2].imag * costable[idx]) >> 15) -
((y[num2].real * sintable[idx]) >> 15);
y[num2].real = y[num1].real - cheng.real;
y[num2].imag = y[num1].imag - cheng.imag;
y[num1].real += cheng.real;
y[num1].imag += cheng.imag;