什麼是最有效的方式來產生任意長度的有符號浮點數組,其中包含C中正弦波的振幅(表示爲1到-1)?如何在C中生成固定波形的表格?
回答
卡爾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,
};
非常感謝您的回答,這非常有幫助! – 2009-12-20 17:25:08
如果你不想要運行時開銷,自己寫一個小程序,打印出所有你的價值觀爲C數組聲明/初始化,然後#include
該文件到您的程序。
如果你想要的東西非常快用一個表(如已經建議)。
另一種方法是模擬一個小正弦波振盪器,並用它來生成你的數據陣列。
下面是一個例子,如何做到這一點:
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更準確。
我非常感謝您的回答,並對您的解釋非常透徹。謝謝! – 2009-12-20 17:26:20
- 1. 在verilog中生成自定義波形
- 2. 如何在django中生成固定的單元格行?
- 3. 在PHP中生成波形音
- 4. 生成音頻波形
- 5. 帶限波形生成
- 6. 如何生成固定格式的字符串在SSMS
- 7. 在Python中生成音頻波形圖形
- 8. 如何從波形中生成聲音數據
- 9. 如何在Sitebricks中生成HTML表格?
- 10. 在C#中繪製波形#
- 11. 新手問題:在php中形成生成器的表格
- 12. 通過C#生成表格(html表格) - 如何生成'th'標籤?
- 13. 如何禁用在屏幕固定中生成的Toast消息?
- 14. C# - 生成固定裝置的列表,使用隨機
- 15. 如何生成凹多邊形的回波路徑
- 16. 如何生成由零分隔的正弦波形流?
- 17. C++中的固體噪聲生成
- 18. 如何使表格的列寬固定?
- 19. C#中的波形分析#
- 20. 使用生成的波形數據在.NET中播放聲音
- 21. Winforms中的固定表C#
- 22. 如何配置DAQ助手以生成由波形定義的電壓脈衝?
- 23. 在IE6中使用表格固定在div中的HTML表格
- 24. 表生成在給定的格式
- 25. 在C/C++中快速顯示波形
- 26. 如何設置C#生成的Excel電子表格的表名?
- 27. 在Django中生成表格
- 28. 在Excel中生成表格
- 29. 將列表形式連接到生成表格的表格
- 30. 如何找到在C#中生成條形碼的API
'高效'在哪些方面?時間?空間?計算複雜性? – wallyk 2009-12-19 04:18:31