我试图优化这个旋转计算函数:
void twiddle(int N)
{
int i;
for (i=0;i<N;i++)
{
twiddle_table[i].re = (float) cos((float)i * 2.0 * PI /(float)N);
twiddle_table[i].im = (float) - sin((float)i * 2.0 * PI /(float)N);
}
}哪里的N = 4096大小的旋转桌和可以更大!
然后,我做了以下工作:
void twiddle(int N)
{
int i;
float Tconst;
Tconst = 2.0 * PI /(float)N;
for (i=0;i<N;i++)
{
twiddle_table[i].re = (float) cos((float)i * Tconst);
twiddle_table[i].im = (float) - sin((float)i * Tconst);
}
}但是,对于for循环,我获得了34万个循环的性能,我认为这是不好的。
有什么提示可以提高此功能的性能吗?
发布于 2016-11-24 18:19:10
减少vnp代码中错误积累的一个标准技巧是注意到基的真实部分将接近1;我们可以使用多角度公式更精确地计算基-1(与vnp的后置一样)。
base_1 = -2*t*t + I * sin(a) 哪里
a = 2.0*PI/N
t = sin(a/2.0)(我是-1的平方根)。然后用
tab[i] = tab[i-1] + tab[i-1]*base_1. 虽然计算量较多,但舍入误差较小。
除非硬件将其排除在外,否则您应该考虑将计算基设为双倍,并将复杂的指数累加成双倍;您可以使用一个变量W,例如
W += W*base_1然后将W存储在选项卡我中--从而将其转换为浮动。同样,更多的计算,但较少的错误积累。
发布于 2016-11-25 14:19:33
这一行:
Tconst = 2.0 * PI /(float)N; 将在双倍中执行,因为2.0要在浮点数中执行,将2.0更改为2.0f
提取表达式:
(float)i*Tconst若要赋值浮点变量,请在for()循环的顶部,并在实际计算中使用该变量
请显示以下定义: twiddle_table[]
参数'N‘绝不能是>=’table[]中的条目数。否则,当数据保存在数组结束后时,将发生未定义的行为,这可能导致seg错误事件。
由于数据和结果是浮动的,所以不应该使用函数: cos()。建议: cosf()
函数: sin()不应该使用。建议: sinf()
注意:那么就没有必要将对cosf()或sinf()的调用结果转换为“`float”。
https://codereview.stackexchange.com/questions/147830
复制相似问题