2009-12-19 46 views

回答

3

卡爾Smotricz在his answer指出的那樣,你可以很容易地編寫一個簡單的C程序建立一個硬編碼的陣列爲您服務。

下面的代碼會做的伎倆:

int main(int argc, char * argv[]) 
{ 
    const int tableSize = 10; 
    const char * fileName = "sin_table.txt"; 

    int x; 
    FILE * file; 

    file = fopen(fileName, "w"); 
    if (file == NULL) { printf("unable to open file\n"); return -1; } 

    fprintf(file, "float sin_table[%d] =\n{\n ", tableSize); 
    for (x = 0; x < tableSize; x++) 
    { 
     fprintf(file, "\t%f,\n", sinf(x*2*pi/tableSize)); 
    } 
    fprintf(file, "};\n"); 

    fclose(file); 
    return 0; 
} 

和輸出應該是這樣的:

float sin_table[10] = 
{ 
    0.000000, 
    0.587785, 
    0.951057, 
    0.951056, 
    0.587785, 
    -0.000000, 
    -0.587785, 
    -0.951057, 
    -0.951056, 
    -0.587785, 
}; 
+0

非常感謝您的回答,這非常有幫助! – 2009-12-20 17:25:08

2

如果你不想要運行時開銷,自己寫一個小程序,打印出所有你的價值觀爲C數組聲明/初始化,然後#include該文件到您的程序。

3

如果你想要的東西非常快用一個表(如已經建議)。

另一種方法是模擬一個小正弦波振盪器,並用它來生成你的數據陣列。

下面是一個例子,如何做到這一點:

int main (int argc, char **args) 
{ 
    int i; 

    float data[1024]; 
    float angle = 2.0f * 3.14/1024; 

    // start of the sine-wave: 
    float sinval = 0; 
    float cosval = 1; 

    // rotation per iteration 
    float delta_sin = sinf(angle); 
    float delta_cos = cosf(angle); 

    for (i=0; i<1024; i++) 
    { 
    // store current value: 
    data[i] = sinval; 

    // update the oscillator: 
    float s = sinval * delta_cos - cosval * delta_sin; 
    float c = sinval * delta_sin + cosval * delta_cos; 
    sinval = s; 
    cosval = c; 
    } 
} 

這背後的訣竅是,我們開始在二維空間中的一個固定點,存儲在9sinval,cosval)。此外,我預先計算(delta_cos,delta_sin)中的單次旋轉參數。

所有我在循環中做的是1024次固定旋轉旋轉點。這會在每次迭代中創建一個正弦/餘弦對。 (注意:它與複數乘法相同)。

此方法變得不穩定遲早並且不爲完全如在循環中調用SIN/COS。

所以它不是建立龐大的表與它是個好主意,但如果你能有輕微錯誤和短小的表活上萬的元素是很實用。爲了解決這個問題,您可以將類型改爲double,對每n次迭代進行適當的舍入或重新規範化結果。


編輯:剛剛用double和1e9迭代測試了代碼。適用於我。我有一個輕微的漂移階段,但結果仍然比單精度sinf/cosf更準確。

+0

我非常感謝您的回答,並對您的解釋非常透徹。謝謝! – 2009-12-20 17:26:20