目录
1.基础介绍
DDS是一种新的频率合成技术——直接数字频率合成(DDS),它以有别于其它频率合成方法的优越性能和特点成为现代频率合成技术中的姣姣者。DDS是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写。与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。DDS是现今一种重要的设计手段,高速集成电路的发展进一步改善了DDS的性能,它与传统技术相结合,组成的各种混合方案将频率源的性能提高到一个新的水平,因而未来的DDS不仅应用于传统上需要使用信号源的领域,而且必将开拓许多新的应用领域。
DDS在相对带宽、频率转换时间、相位连续性、正交输出、高分辨力以及集成化等一系列性能指标方面远远超过了传统频率合成技术所能达到的水平,为系统提供了优于模拟信号源的性能。其已广泛应用于通讯、导航、雷达、遥控遥测、电子对抗以及现代化的仪器仪表工业等领域。
DDS是以采样频率做源生成多个频率相位可调可控的正余弦信号或其他信号。其基本单元有相位控制单元,频率控制单元,输出控制单元,波形存储PROM单元:
上图中,外部输入频率控制参数和相位控制参数,将控制参数转变为读取波形存储文件的读取起始位置参数和间隔参数,将转换后的参数给输出控制单元去控制读取存储波形的PROM,PROM的输出即对应频率和起始相位的输出波形。
相位控制:为起始相位控制上图中,外部输入频率控制参数和相位控制参数,将控制参数转变为读取波形存储文件的读取起始位置参数和间隔参数,将转换后的参数给输出控制单元去控制读取存储波形的PROM,PROM的输出即对应频率和起始相位的输出波形。
频率控制:设输出频率为f,采样频率Fs,一个离散正弦信号表示为:
两个相邻采样点之间的相位差即相位步进:[奈奎斯特定理得∆θ<π]
因此频率为:
即可通过控制相位步进的方式达到控制生成特定的频率。
2.DDS设计
1、设计DDS的输入控制参数和输出波形数值都为整数。
2、设计输出值m的值域范围:
例:若目标输出一个1MHz<=f<=2MHz的正弦信号,采样率为20MSPS,值域范围为[-M,M-1],幅度精度d=1即整数输出【要求2*M>=(FS/FL)/2】。
论证:采样率为20MSPS,最小1MHz的信号一个周期将被采样20次,即产生20个采样点,若要使得该20个采样点不产生量化损失,则2*M>=(20M/1M)/2。
【最小频率波形波峰值和波谷值至少要有20/2个量化值,就不会产生量化损失】
3、设计频率控制精度:
例:同第2点中的例子,频率控制参数为w,设计频率控制精度为FxHz,即频率控制的1个单位代表FxHz,则频率控制最大范围W=Fs/Fx。
论证:由上式可知Fx=Fs/W,由第一章可知,最小相位步进为:
4、设计PROM波形存储:
由第2知,值域范围为[-M,M-1],PROM存储的波形实质为相位p=θ/∆θmin和m的对应关系,对于正余弦波都可存储一个波形的数据最大θ=π,即最大存储数为π/∆θmin,通常p的范围和m的范围不对等,因此无需建立p和m的全映射的波形存储表,PROM深度可按最小范围建立,对另一个范围进行缩放。
PROM的输出dout为:
5、设计输出控制逻辑:
由上可知,读取PROM的读地址为raddr有:
PROM输出为dout,输出数据波形wout:
j = not j[取反]
wout = dout j == 0;
wout = -dout j == 1;
3.DDS实现仿真
1、输出值m的值域范围[-32,32],采样率20MSPS。
2、频率控制精度为Fx=20Hz,对应的:
即w=1,相位步进对应为6.283*10^-6。
3、波形存储表:
p的最大存储数:π/∆θmin=500000,又因为M=32,所以PROM存储半个正弦周期波形值为[0-->32-->0]存储64个点即可,余弦同理[32-->0-->-32]。
缩放比例为:500000/64=7812.5
p | dout | p | dout | p | dout | p | dout |
0 | 0 | 16 | 23 | 32 | 32 | 48 | 23 |
1 | 2 | 17 | 24 | 33 | 32 | 49 | 21 |
2 | 3 | 18 | 25 | 34 | 32 | 50 | 20 |
3 | 5 | 19 | 26 | 35 | 32 | 51 | 19 |
4 | 6 | 20 | 27 | 36 | 31 | 52 | 18 |
5 | 8 | 21 | 27 | 37 | 31 | 53 | 16 |
6 | 9 | 22 | 28 | 38 | 31 | 54 | 15 |
7 | 11 | 23 | 29 | 39 | 30 | 55 | 14 |
8 | 12 | 24 | 30 | 40 | 30 | 56 | 12 |
9 | 14 | 25 | 30 | 41 | 29 | 57 | 11 |
10 | 15 | 26 | 31 | 42 | 28 | 58 | 9 |
11 | 16 | 27 | 31 | 43 | 27 | 59 | 8 |
12 | 18 | 28 | 31 | 44 | 27 | 60 | 6 |
13 | 19 | 29 | 32 | 45 | 26 | 61 | 5 |
14 | 20 | 30 | 32 | 46 | 25 | 62 | 3 |
15 | 21 | 31 | 32 | 47 | 24 | 63 | 2 |
44、输出频率为f=1.234MHz的信号,w=f/Fx,除以缩放比例后w为7.9。
5、按照PROM读取逻辑即输出控制逻辑,完成PROM的读取和波形的产生。
4.完整matlab工程代码
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
close all;
clc;
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
Fx=20;%频率控制精度20Hz
Fs=20E6;%采样率20MSPS
M=32;%输出值的最大绝对值,值域-32--+31
dert_that_min = 2*pi*Fx/Fs;%相位步进
p_max = pi/dert_that_min;%500000
prom_len = round(p_max/7812.5);%p_max/x=2*M,缩放比列7812.5=p_max/64
p1 = zeros(1,prom_len);
dout = zeros(1,prom_len);%生成波形PROM
for i = 1:prom_len
p1(i) = i;
dout(i) = round(M*sin((i-1)*7812.5*dert_that_min));
end
%--------------------------------------------------------------------------------------------------------
subplot(4,1,1);
plot(dout,'b');grid;%观察波形文件的波形
title('波形文件的波形');
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
fout = 1.234E6;%设置生成的目标频率
w = (fout/Fx)/7812.5;%计算对应频率的相位步进
N = 8192; %生成波形点数
wout = zeros(1,N);
p=1;
j=0;
for i = 1:N
if(mod(j,2)==0)%波形反向
wout(i) = dout(round(p));
else
wout(i) = -dout(round(p));
end
p = p+w;%生成波形文件读地址
if(round(p)>=prom_len+1)
p = p-prom_len;
j = j+1;
end
end
%--------------------------------------------------------------------------------------------------------
subplot(4,1,2);
plot(wout(1:200),'b');grid;%观察DDS输出的波形
title('DDS输出的波形');
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
f_label = zeros(1,N);%将采样点换算频域横坐标轴--频率
for i = 1:N
f_label(i) = i*Fs/N;
end
subplot(4,1,3);
plot(f_label,abs(fft(wout)),'b');grid;%观察DDS输出信号的频谱
title('DDS输出信号的频谱');
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
%--------------------------------------------------------------------------------------------------------
test_i = 1:1:N;%生成离散正弦对比信号
time=test_i/Fs;
test=sin(2*pi*fout*time);
%--------------------------------------------------------------------------------------------------------
subplot(4,1,4);
plot(f_label,abs(fft(test)),'b');grid;%观察对比信号的频谱
title('对比信号的频谱');