Fed*_*ico 8 algorithm math complexity-theory trigonometry
我必须计算以下内容:
float2 y = CONSTANT;
for (int i = 0; i < totalN; i++)
h[i] = cos(y*i);
Run Code Online (Sandbox Code Playgroud)
totalN是一个很大的数字,所以我想以更有效的方式做到这一点.有没有办法改善这个?我怀疑有,因为,毕竟,我们知道cos(n)的结果是什么,对于n = 1..N,所以也许有一些定理允许我以更快的方式计算它.我真的很感激任何提示.
提前致谢,
费德里科
使用最美丽的数学公式之一,欧拉的公式
exp(i*x) = cos(x) + i*sin(x)
,
代替x := n * phi
:
cos(n*phi) = Re( exp(i*n*phi) )
sin(n*phi) = Im( exp(i*n*phi) )
exp(i*n*phi) = exp(i*phi) ^ n
权力^n
是n
重复乘法.因此,您可以通过重复复数乘法计算cos(n*phi)
并同时开始.sin(n*phi)
exp(i*phi)
(1+i*0)
代码示例:
蟒蛇:
from math import *
DEG2RAD = pi/180.0 # conversion factor degrees --> radians
phi = 10*DEG2RAD # constant e.g. 10 degrees
c = cos(phi)+1j*sin(phi) # = exp(1j*phi)
h=1+0j
for i in range(1,10):
h = h*c
print "%d %8.3f"%(i,h.real)
Run Code Online (Sandbox Code Playgroud)
或者C:
#include <stdio.h>
#include <math.h>
// numer of values to calculate:
#define N 10
// conversion factor degrees --> radians:
#define DEG2RAD (3.14159265/180.0)
// e.g. constant is 10 degrees:
#define PHI (10*DEG2RAD)
typedef struct
{
double re,im;
} complex_t;
int main(int argc, char **argv)
{
complex_t c;
complex_t h[N];
int index;
c.re=cos(PHI);
c.im=sin(PHI);
h[0].re=1.0;
h[0].im=0.0;
for(index=1; index<N; index++)
{
// complex multiplication h[index] = h[index-1] * c;
h[index].re=h[index-1].re*c.re - h[index-1].im*c.im;
h[index].im=h[index-1].re*c.im + h[index-1].im*c.re;
printf("%d: %8.3f\n",index,h[index].re);
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定你愿意做出什么样的准确性与性能妥协,但是在这些链接上有各种各样的正弦曲线近似技术的广泛讨论:
有趣的Sinusoids - http://www.audiomulch.com/~rossb/code/sinusoids/
快速准确的正弦/余弦 - http://www.devmaster.net/forums/showthread.php?t=5784
编辑(我认为这是在"与Sinusoids的乐趣"页面上打破的"Don Cross"链接):
优化Trig计算 - http://groovit.disjunkt.com/analog/time-domain/fasttrig.html