无论如何我可以在c中更快地计算正弦函数。当我生成一个包含16,384个样本的正弦波形时,它需要我3.96秒而我希望它不到1秒。
下面给出的是我用于正弦波的逻辑,它需要将近4秒的时间来计算。我也尝试了优化代码,但它没有任何帮助。
有人请帮帮我
int i;
float f,temp = (2 * M_PI) /16384
for(i=0;i<16384;i++)
{
f = sin(temp * i);
}
答案 0 :(得分:4)
您无需多次计算f
,永远。如果性能如此重要,请将值数组硬编码到源中。
答案 1 :(得分:0)
嵌入式实现中的浮点可能非常慢,但我不相信索引数组的速度会慢一些。这将在项目中为#include
创建一个C源文件。我认为OP想要一个无符号整数表,如果不是想要修改它。如果要节省代码空间,只需编写第一个象限,并对其他象限的查找索引和值进行简单的运行时调整。
#define _USE_MATH_DEFINES 1
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define TRIGPOINTS 16384
#define AMPLITUDE 8192.0
//#define M_PI 3.14159265358979323846
int main(int argc, char **argv)
{
FILE *fout;
char *filename = "sinetable.c";
int i;
double d;
if( (fout = fopen( filename, "w" )) == NULL ) {
printf( "The file '%s' was not opened\n", filename );
exit (1);
}
fprintf (fout, "#define TRIGPOINTS %u\n", TRIGPOINTS);
fprintf (fout, "#define AMPLITUDE %f\n", AMPLITUDE);
fprintf (fout, "\unsigned sintab [%u] = { ", TRIGPOINTS);
for (i=0; i<TRIGPOINTS; i++)
{
if (i)
fprintf (fout, ", ");
if ((i % 10) == 0)
fprintf (fout, "\n ");
d = AMPLITUDE + AMPLITUDE * sin(2.0 * M_PI * (double)i / TRIGPOINTS);
fprintf (fout, "%u", (unsigned)d);
}
fprintf (fout, " };\n");
fclose (fout);
return (0);
}
生成的C源代码如下:
#define TRIGPOINTS 16384
#define AMPLITUDE 8192.000000
unsigned sintab [16384] = {
8192, 8195, 8198, 8201, 8204, 8207, 8210, 8213, 8217, 8220,
8223, 8226, 8229, 8232, 8235, 8239, 8242, 8245, 8248, 8251,
...