如何在c中更快地生成正弦函数

时间:2014-10-10 12:53:08

标签: c

无论如何我可以在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);
}

2 个答案:

答案 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, 
    ...