DSP正弦波——查表法原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
正弦波的产生方法
目前,正弦波的产生方法主要有两种:(1)查表法(2)利用数字振荡器产生正弦波
1)查表法
考虑一个模拟正弦波的表达式,并以固定的时间间隔对其进行采样,即
,...)2,1,0,()2sin(][)
2sin()(==+=+=n F F
f fn n x Ft t x s θπθπ
其中,θ为初始相位;F 为模拟频率,即需要产生的频率;F s 为采样频率;s s F T 1
=即为
采样间隔。 因此,要想产生一个正弦波,需要在每一个采样间隔计算x[n]的值,并通过数模转换器(DAC ,Digital-to-Analog Convector )输出。通过将x[n]的值以不同的幅度和不同的采样间隔输出,就可以得到任意幅度、任意频率的正弦波或余弦波。
根据上式,x[n]通过计算正弦函数而得。基于此,可以构造一个查找表,表中所列为余弦函数的值。考虑到不可能把正弦函数或余弦函数的所有值都放在查找表内,不妨将表的大小初设为517项。又考虑到正弦函数和余弦函数之间只有一个90°的相移,可以将表的大小缩减为257项。表中的第一个值对应于︒0,最后一个值对应于180°,或者说π。这样,表中相邻两点之间的间隔为180/256=0.7031250°,即表格中的第1项是cos0°的值,第2项是cos0.7031250°的值,第3项是cos1.406250°的值,以此类推,最后一项是cos180°的值。利用该表所能构成的波形的相位步进通常是0.7031250°的整数倍。
在采样过程中,上式中的n 值在每一个采样间隔递增,从而得到模拟正弦波的采样版本。但是,如何通过查找余弦表的方法来产生一个任意频率F 的正弦波呢?由于在前面构造的余弦函数表中,已经包括了以0.7031250°为间隔的余弦函数值,现在的问题就变成了,当n 递增时,怎样估计出相位fn π2的值。
记录波形的初始相位和当前相位,以得到连续相位的正弦波。如果记录了上一个输出点的相位值,利用正弦波的频率信息,就可以计算出当前输出点的相位值,该相位值是和幅度值相对应的。在此基础上,就可以根据相位值去查找余弦表中相应的位置,得到当前输出点的幅度值。
假设需要产生频率为F 的正弦波,它的起始相位是Init_Phase ,和F 对应的相位步进为Phase_Step 。相位步进的计算式为 Phase_Step=⨯s F F
2π=f π2
例如,如果需要产生的正弦波的频率为10KHz ,采样频率为44.1KHz ,对应的相位步进为 Phase_Step=︒==⨯6.81)(4535.021.4410
radians ππ
其中,radians 为弧度。于是,在每一个采样间隔输出信号的幅度为)4535.0sin(n π(n=0,1,2,….)
利用这个式子计算的相位步进和上一个输出点的相位信息,就可以计算出当前输出点
的相位值。当前输出点的相位值等于上一个输出点的相位值加上相位步进。例如,如果输出信号的初始相位为0°,那么,下一个输出点的相位就为81.6°,再下一个输出点的相位为163.2°,以此类推。得到这些相位值后,就可以从查找表中的对应位置去读取当前输出点的幅度。
为了便于以DSP 处理器中常用的Q15格式来表示,将相位值按π进行归一化计算
相位值减去π/2,即4000H ,然后才能利用得到的相位值去查找表中读取对应的幅度值。
令COSOFF 指向查找表的表头,那么cos0、)2/cos(π 和πcos 在表中对应的地址分别为COSOFF 、(COSOFF+128)和(COSOFF+256)。如果输出信号的初始相位为-119.53°,那么,该初始相位在查找表中对应的地址为-119.53/0.703125= -170,即初始点的幅度值对应的地址为(COSOFF+170)。这里没有使用-170,是因为余弦函数具有偶对称性,即)53.119cos()53.119cos(︒=︒-。正是基于这一原因,在查表法中通常都是构造余弦表,而不是正弦表。
将该初始相位的地址按照查找表的大小进行归一化处理,得到其Q15格式的表示为:H AB 00256/170=-。其中,归一化的初始相位地址的范围为[-1,+1],-1对应-180°,+1对应+180°。
仍然使用刚才的例子,需要产生一个10KHz 的正弦波,采样频率为44.1KHz ,其按π归一化后的相位步进的Q15格式表示为
CH A F F
Step Phase s 033276821.4410327682_=⨯⨯=⨯⨯=
在输出了初始相位对应的幅度值后,当前输出点的相位为Current_Phase ,即fn π2,n=1, 其计算过程如下:
Current_Phase=Init_Phase+Phase_Step
=AB00H+3A0CH
=E50CH
Init_Phase= Current_Phase ;For continuous phase
由于是产生正弦波,还需要减去π/2,即4000H 。
Sine_Phase=E50CH-4000H
=A50CH
注意得到的结果A50CH 为负,再次利用余弦函数的偶对称性质,使用该值的绝对值5AF4进行查表即可。
利用上面的结果查表,实际就是计算距离余弦表头的偏移量。余弦表头地址加上该偏移量,就得到当前输出点幅度值的地址。使用上面的绝对相位值计算偏移量为:
5AF4H/80H=B5H=181(十进制)。因此,余弦表中存储的第181个数据就是当前输出的幅度值,即]
cos[(π
181
⨯= -0.6055。
/
)
256
由于只有简单的加、减操作,查表法的速度非常快,这是它最重要的优点。另外,由于需要存储查找表,查找表需要消耗一定的存储时间,特别是当表格比较大时,这种开销是惊人的,往往令系统难以承受。这时,就需要使用其他方法来产生正弦波了,比如数字振荡器法。
还可以根据泰勒级数展开近似求得sin或者co s函数
sinx=x-x^3/3!+x^5/5!-x^7/7!+x^9/9!
cos=1-x^2/2!+x^4/4!-x^6/6!+x^8/8!
在利用2倍角来产生正弦,程序在下面的文档进行更新