最近的一个项目,和正弦波息息相关。因此,我总结了一下网上关于产生正弦波的几种方法。若有幸被大家看到,欢迎大家补充。
(1)递推法
假设数字角频率w,这我们要取的正弦波的点一次为sin(w*0),sin(w*1),sin(w*2)...sin(w*(n-1)),sin(wn)...
sin(wn) =sin(w(n-1)+w)
=sin(w(n-1))*cos(w)+cos(w(n-1))*sin(w)
=sin(w(n-1))*cos(w)+[sin(nw)-sin(wn-2w)]/2
sin(wn)=2*cos(w)*sin(w(n-1))-sin(w(n-2));
给出任意相邻两个sin(wn)的值,既可以计算下一个正弦波的幅度值。通过改变不同的初始值(相位),我们可以得到正弦或余弦波。
此方法中,cos(w)为常数,可以通过(固定系数乘法)加法实现。所需资源非常少,稳定性高,误差小,但注意w的精度。易于用软件实现。
(2)系统函数法
在滤波器章节中,有几种特殊的滤波器,其中一种就是正弦波发生器。已知正弦波的的系统函数为:
H(z)=sin(w)*z-1/(1-2*cos(w)*z-1+z-2);余弦波系统函数类似;
由此可以画出正弦波发生器(滤波器)的结构图。易于FPGA和CPU实现。其中Z表延迟单元,sin(w)和cos(w)都为常数。
结构简单,只用加法器或固定系数的乘法器实现,稍稍改动可同时产生正余弦波。
(3)cordic方法
强大的cordic,可以轻松计算包括开方,取模,正余弦等多种运算的神级算法。推荐使用,精度最高。逻辑较上面两种多。cordic配置:旋转模式,x为幅度,y为0,,z为相位。
(4)查表法
将正弦波的幅度预先存入rom中,通过相位累加器产生rom读地址。实现中要消耗一定量的存储器资源。优点是精度高,实现简单,可以实现很多种类型的周期信号。