使用表格法实现DDS

2023-12-26 11:50:58

本文介绍使用表格法实现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数据生成。

数据表可以按下式生成:

x(n)=sin(\tfrac{2*pi*n}{N}),n=0,1,...,N-1

具体原理比较简单,就不介绍了。N为一个波形数据周期点数,N值越大,生成的波形越精细。

2)输出频率(fm)可按如下进行设置

设波形数据表由N个点构成,扫描频率为fs,步进值为\Delta(决定了输出频率),则当前频率输出扫描完波形数据表点数为:N/\Delta,扫描频率(fs)对设置频率(fm)的采样点数为:fs/fm。这2个值是相等的,就有,

fs/fm=N/\Delta

可得fm计算公式,

fm=fs*\Delta/N

其中,fs,N为已知条件,改变步进值\Delta即可改变输出频率,且\Delta越大,输出频率也越大

\Delta=N*fm/fs

根据采样定理,

fm/fs\leq\frac{1}{2}

则有,

\Delta\leq\frac{N}{2}

此为步进值\Delta最大值,其最小值为1

3)起始相位可按如下进行设置

起始相位由波形数据表的位置决定,其取值范围为0到N-1。

m=\Theta*N/360

\Theta单位为度

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)计算步进值\Delta和点数L

\Delta=N*fm/fs

代入公式即可计算出当前输出频率对应的步进值\Delta

\Delta \in \left [ 1,\frac{N}{2}\right ]

输出波形一个周期点数为:

L=fs/fm

4)输出

由于采样频率为fs,因此,输出数据需要在频率为fs的定时器中进行,定时器中断服务程序也比较简单,主要就是以固定间隔输出表格中的数据。

设表格索引为index,l初始值为0,则,

index=(l*\Delta+m) mod N

l=l+1

l = l mod L

用C语言描述为:

index = (l * delta + m) % N;
l++;
l = l % L;

得到表格索引后,查表,经过转换,输出到DAC即可。

总结,本文介绍了使用表格法实现DDS。

文章来源:https://blog.csdn.net/propor/article/details/135203200
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。