簡體   English   中英

如何將浮點C代碼轉換為固定點?

[英]How do I convert a floating point C code to fixed point?

我有一個使用雙打的C代碼。 我希望能夠在DSP( TMS320 )上運行代碼。 但DSP不支持雙精度數,只支持定點數。 將代碼轉換為定點的最佳方法是什么? 是否有一個很好的C庫用於定點數(實現為整數)?

以下代碼定義了一個類型Fixed,使用整數作為其內部表示。 使用+-運算符簡單地執行加法和減法。 使用定義的MULT宏執行乘法。

#include <stdio.h>
typedef int Fixed;

#define FRACT_BITS 16
#define FRACT_BITS_D2 8
#define FIXED_ONE (1 << FRACT_BITS)
#define INT2FIXED(x) ((x) << FRACT_BITS)
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS))) 
#define FIXED2INT(x) ((x) >> FRACT_BITS)
#define FIXED2DOUBLE(x) (((double)(x)) / (1 << FRACT_BITS))
#define MULT(x, y) ( ((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2) )

我使用上面的代碼來表示我的圖像處理算法中的分數。 它比使用雙打的版本更快,結果幾乎完全相同。

TI提供了一個名為“IQmath”的定點庫:

http://focus.ti.com/lit/sw/sprc990/sprc990.pdf

轉換涉及分析當前代碼 - 對於每個變量,您需要知道它可以容納的范圍,以及它需要的精度。 然后您可以決定將其存儲在哪個類型中.IQMath提供q30中的類型,范圍為+/- 2,精度為0.0000000001到q1,范圍為〜+/- 1百萬,精度為0.5。

對於可能溢出變量范圍的操作,您需要添加溢出檢查,並決定如何處理它 - 將其固定為最大值,以不同的比例存儲,引發錯誤等。

如果沒有真正深入了解流程的數據流,實際上無法轉換為固定點。

大多數DSP工具鏈包括用於軟件中浮點仿真的庫。 這將是緩慢的,但您應該首先使用浮點支持構建代碼,然后配置文件以查看是否只需要轉換為定點以獲得足夠性能的幾個位置。 當你移植到定點時,你還需要運行浮點數來提供比較,以確保你沒有在過程中丟失任何東西。

如果C代碼很少/稀疏地使用雙精度數,那么您可以使用浮點仿真庫,而不會導致C代碼運行速度慢10到100倍。 如果不希望性能受到影響並且存在大量浮點運算,並且您知道每個算術和存儲操作對於每個實際輸入所需的比例和精度,那么您可以手動將每個算術運算轉換為使用縮放的整數數據類型和操作。 但是,分析精度要求通常對DSP類型代碼來說並不重要。 關於這一主題有許多DSP和數值方法教科書章節。

有幾個庫可以為你做這個。 但是,更有可能的是,您的設備的PSP應該包含某種數學庫。 它應該記錄在案。 您可能不得不重新編寫一些代碼,因為在使用PSP提供的API時,在執行基於原始的浮點運算時使用的控件構造可能沒有意義。

例如 - 您可以轉換它

double arraysum = 0.0;
for (int i = 0; i < arraylen; i++) 
{
    arraysum += array[i];
}

對此

psp_decimal_t arraysum;
if (0 != psp_sum_elements(&array, arraylen, &arraysum))
{
    printf("error!");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM