一个天真的正弦波发生器获取一组n个值并在每个值上调用sin函数:
for i = 0; i < 2*pi ; i = i+step {
output = append(output, sin(i) )
}
然而,这使得对潜在昂贵的sin函数的大量调用,并且未能利用所有样本是顺序的,先前已经计算并且将四舍五入为整数(PCM)的事实。那么,有哪些替代方案?
我正在想象Bresenham's circle algorithm或预先计算高分辨率样本的东西,然后通过每个第n个条目缩小尺寸,但是如果有一个“工业强度”解决方案来解决这个问题,我很乐意听到它。
答案 0 :(得分:4)
当你加到(1,0)时,你可以计算出给你(cos theta,sin theta)的向量z,其中theta = 2 * pi / step。然后将此向量添加到(1,0)并将下一个sin值作为和的y坐标。然后用角度θ旋转z(通过旋转矩阵乘以角度θ)并将其加到前一个向量(cos theta,sin theta),得到下一个sin值作为合成和向量的y坐标。等等。这需要计算cos theta和sin theta一次,然后每次更新由2x2矩阵与2-d向量的矩阵乘法给出,然后是简单的加法,这比使用幂级数计算sin()更快扩展