通过查找表方法,人们可能希望有效地使用内存并仅存储正弦波的第一象限。
Then second quadrant = sin[180 - angle] ; // for angles 90..180 degrees
third quadrant = -sin[angle-180]; // for 180..270
fourth quadrant = -sin[-angle+360] // for 270..360
我会推荐线性插值,但也有基于矢量旋转的正弦生成方法(同时产生正弦和余弦)
x_0 = 1, y_0 = 0;
x_n+1 = x_n * cos(alpha) - y_n * sin(alpha)
y_n+1 = x_n * sin(alpha) + y_n * cos(alpha),
其中 alpha=频率的相位差== 2pi*fHz/Ts,fHz 是要产生的频率(以赫兹为单位),Ts 是采样时间(或 1/Ts = 采样频率,例如 44100 Hz)。
这导致了谐振反馈滤波器方法,其传递函数 f(z) 在单位圆 (z=e^jomegaT) 处具有两个共轭极点。
y[n] = y[n-1] - 2*cos(alpha) * y[n-2], with
y[0] = 0,
y[1] = sin(alpha)
有趣的部分是可以随时更改 alpha (cos(alpha))。这种 IIR 滤波器方法的缺点是根据定义它是不稳定的。浮点,尤其是定点的不准确性累积并导致指数衰减或数量级的指数增长。然而,这可以通过允许轻微的相位失真来解决。
而不是在CORDIC旋转中具有已知的每次迭代放大因子:
K = sqrt(1+sin(alpha)^2);
x' = x - y*sin(alpha);
y' = y + x*sin(alpha);
one can do
x' = x - y * sin(alpha);
y'' = y + x' * sin(alpha);
它不会为 (x', y'') 产生完美的圆,但即使使用定点算法也会产生稳定的椭圆。(请注意,这假设 alpha 值相对较小,也意味着频率相对较低。)