使用表格法实现DDS
本文介绍使用表格法实现DDS。
DDS(Direct Digital Synthesis)是一种把一系列数字信号通过D/A转换器转换成模拟信号的数字合成技术。它有查表法和计算法两种基本合成方法。查表法具有实现简单,速度快的优点,在DSP和MCU实现DDS中经常用到。本文介绍的也是此法。
1.基本原理
查表法通过读取存储在ROM中的经过计算的数据样本,通过设置不同的间隔和起始位置就可以输出不同的频率和相位的波形,查表法实现DDS原理框图如下图。
其中,相位累加器用于将ROM中当前地址加上频率字输入(即间隔,不同的间隔对应不同的输出频率),相位字输入指明ROM中地址的起始值,起始值决定了输出相位,将2个地址值相加,就得到当前要输出波形数据的地址值。通过波形数据表ROM就可以得到当前波形数据,并给到D/A转换器,D/A转换器转换后经低通滤波器后将数据转换成模拟值。
2.相关计算
了解了基本原理,我们需要解决3个问题:
1)波形数据表ROM数据如何生成
2)如何根据当前数据表设置需要的频率(fm)
3)如何设置当前波形起始相位
这里以生成正弦波为例进行计算:
1)波形数据表ROM数据生成。
数据表可以按下式生成:
,n=0,1,...,N-1
具体原理比较简单,就不介绍了。N为一个波形数据周期点数,N值越大,生成的波形越精细。
2)输出频率(fm)可按如下进行设置
设波形数据表由N个点构成,扫描频率为fs,步进值为(决定了输出频率),则当前频率输出扫描完波形数据表点数为:N/,扫描频率(fs)对设置频率(fm)的采样点数为:fs/fm。这2个值是相等的,就有,
fs/fm=N/
可得fm计算公式,
fm=fs*/N
其中,fs,N为已知条件,改变步进值即可改变输出频率,且越大,输出频率也越大
=N*fm/fs
根据采样定理,
fm/fs
则有,
此为步进值最大值,其最小值为1
3)起始相位可按如下进行设置
起始相位由波形数据表的位置决定,其取值范围为0到N-1。
m=*N/360
单位为度
3.实现
1)设计需求
a)扫描频率为fs
b)输出波形频率为fm
c)输出波形起始相位为m
d)波形数据表长度为N
2)波形数据表生成
由2中公式可得离散数据表,matlab程序如下:
N=256;
n=0:1:N-1;
x=65536*sin(2*pi*n/N);
这里转换成了Q16格式(放大了65536倍),可根据实际情况进行缩放和加偏置。将生成的数据以数组的方式进行存储。用C语言描述为:
const uint16_t SinTbl[] = {};
3)计算步进值和点数L
=N*fm/fs
代入公式即可计算出当前输出频率对应的步进值。
输出波形一个周期点数为:
L=fs/fm
4)输出
由于采样频率为fs,因此,输出数据需要在频率为fs的定时器中进行,定时器中断服务程序也比较简单,主要就是以固定间隔输出表格中的数据。
设表格索引为index,l初始值为0,则,
index=(l*+m) mod N
l=l+1
l = l mod L
用C语言描述为:
index = (l * delta + m) % N;
l++;
l = l % L;
得到表格索引后,查表,经过转换,输出到DAC即可。
总结,本文介绍了使用表格法实现DDS。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!