基于matlab的直接频率合成技术的设计与仿真
基于matlab 的直接频率合成技术的设计
与仿真
一. 设计指标
1. 2.
DDS 频率输出范围为1~1000Hz; DDS 频率输出的精度为1Hz 。
二. 设计原理
DDS (Direct Digital Synthesis)是一种从相位概念出发直接合成所需的波形的一种频率合成技术。它的理论基础是Shannon 抽样定理,实质上是一个抽样过程的逆过程。在DDS 中, DDS 不是对一个模拟信号进行抽样,而是一个假定抽样过程已经发生且抽样的值已经量化完成,如何通过某种映射把已经量化的数值送到D/A及后级的LPF 重建原始信号的问题。
DDS 的基本结构图如图2-1所示,其主要由相位累加器、正弦ROM 查找表、D/A转换器以及一个低通滤波器构成。DDS 工作时,频率控制字K (也叫相位步长)在每一个时钟周期内与相位累加器累加一次,得到的相位值(0~2π)在每一个时钟周期内以二进制码的形式去寻址正弦查询表ROM ,将相位信息转变成相应的数字化正弦幅度值,ROM 输出的数字化波形序列再经数模转换器(DAC )实现量化数字信号到模拟信号的转变,最后DAC 输出的阶梯序列波通过低通滤波器(LPF )平滑滤波后得到一个纯净的正弦信号。
CLK
图 1 DDS的基本结构
不妨设正弦信号发生器的输出为:
S out =A sin(ωt) =Asin(2πf out t )
(2.1)
其中,A 是信号振幅,f out 为输出频率。其相位:
θ=2πf out t
(2.2)
则在一个时钟周期T clk 内,相位的变化量为:
∆θ=2πf out T clk =
2πf out
f clk
(2.3)
其中
f clk 是时钟频率。
然后进行数字量化,设正弦ROM 查找表有N 比特,则将2π等分为2N 份,平均每份的相位增量为
∆φ=
2π
rad N
2
(2.4)
由此,每个时钟周期的相位增量可以被量化为
⎡∆θ⎤⎡∆θN ⎤⎡N f out ⎤K =⎢⎥=⎢2⎥=⎢2⎥
f clk ⎥⎥⎢⎢∆φ⎥⎢2π
(2.5)
其中⎡⎢⎤⎥表示取整,而K 即为频率控制字,也就是相位步长,在DDS 中表现为每个周期正弦ROM 查找表增加的地址数,那么信号发生器的输出又可描述为
⎡2π⎤
S out =A sin(θn -1+∆θ) =A sin ⎢N (Kn -1+K ) ⎥
⎣2⎦
(2.6)
由此,通过以上的推导可以明显看出,只要对相位的量化值进行简单的累加运算,就可以得到正弦信号的当前相位值;而用于累加的相位增量量化值(即频率控制字K )又决定了信号的输出频率,并且呈简单的线性关系,从而就可以通过改变输入K 的值得到不同频率的输出信号。
三. 设计参数的计算
1.
DDS 的频率输出范围:
由DDS 工作原理推导的公式中很容易得出输出频率的计算:
f out =
K
f clk N 2
(1.1)
由上式可以看出,K 越大,相位步进越快,输出信号波形的频率就越高。对于N 位数据位宽来说,共有2N 个ROM 地址,在一个正弦波共有2N 个样点,每个信号周期取2N /K个样点。如果K =2,则一个信号周期只取一个样点,显然它不能表示一个正弦波。一般为了能较好的得到正弦波输出,K 的最大值取
N
K max =2N -2
(1.2)
这样,一个波形中至少有4个样点(2n∕2n−2=4),再经过D/A变换,相当于四级阶梯波。在后继低通滤波器作用下,可以得到较好的正弦波输出。
因此,可以得到DDS 的最高输出频率
f max =
K max
f clk =f clk /4 2N
(1.3)
当K min =1时,得到DDS 的最低输出频率
f min =
f clk K min
f = clk
2N 2N
(1.4)
2. DDS 的频率分辨率
DDS 的频率分辨率即为频率输入值步进一个最小间隔的频率输出变化量,其实,在这里
就等于DDS 的最低输出频率。
3. 具体参数设定
本次设计的频率输入范围为1~1000Hz ,频率分辨率是1Hz ,仅考虑理想的仿真,由
式(3.3)、式(3.4)可以做如下设定
时钟频率:4096 Hz ROM 数据位宽:12 bit
四. MATLAB 程序设计
根据前文分析与参量的设定,用MATLAB 编写程序代码如下: function [ s_out,t] = DDS( f_out, f_clk, bits, endtime)
% f_out : 输出频率 % f_clk : 时钟频率 % bits : ROM 位宽
% endtime : 时域图截止时间 clear all; clc;
%建立正弦波形ROM 查找表 delta_p = 2*pi/2^bits;
temp = 0 : delta_p : (2^bits-1)*delta_p; ROM = sin(temp);
%计算频率控制字
k = ceil(f_out/f_clk*2^bits);
t = 0 : 1/f_clk : endtime; N = length(t);
s_out = zeros(1,N); Addr = zeros(1,N); n = 1; index = 1;
%查找正弦ROM 查找表 while n
Addr(n) = index; index = index +k;
m = mod(index,2^bits); if (m == 0)
index = 2 ^bits; else
index = m; end n = n+1; end
%生成输出正弦波 s_out = ROM(Addr);
F_s_out = abs(fft(s_out));
%绘图 figure(1)
subplot(2,1,1) plot(t,s_out);
title('DDS产生的正弦信号时域波形图'); xlabel('t(s)'); ylabel('s_out'); grid on;
subplot(2,1,2)
stem ( [-0.5*f_clk:f_clk/(N-1):0.5*f_clk] ,fftshift(F_s_out)/N); axis ([f_out-20 f_out+20 0 1 ]);
title('DDS产生的正弦信号频域波形图'); xlabel('f(Hz)');
ylabel('Amplitude'); grid on;
legend(['输出频率:',num2str(f_out),'Hz']);
五. 仿真结果及分析:
1.
输出频率范围仿真测试
a) 最小输出频率1Hz
输入:>>DDS(1,4096,12,1),得到输出频率为1Hz 的正弦信号的时频域图如图2所示:
DDS 产生的正弦信号时域波形图
s o u t
t(s)
DDS 产生的正弦信号频域波形图
A m p l i t u d e
f(Hz)
图 2 输出频率为1Hz 的时频图
a) 最大输出频率1000Hz
输入:>>DDS(1,4096,12,1),得到输出频率为1000Hz 的正弦信号的时频域图如图3所示:
DDS 产生的正弦信号时域波形图
s o u t
t(s)
DDS 产生的正弦信号频域波形图
A m p l i t u d e
f(Hz)
图 3 输出频率为1Hz 的时频图
从图2和图3的频域图中,可以清楚看到本次设计的DDS 输出了1Hz 与1000Hz 的正
弦波,达到了预期的指标
2. 频率分辨率仿真测试
分别输入:
>>DDS(20,4096,12,1) >>DDS(21,4096,12,1)
分别得到输出频率为20Hz 和21Hz 的正弦信号的时频域图如图4、图5所示:
DDS 产生的正弦信号时域波形图
s o u t
t(s)
DDS 产生的正弦信号频域波形图
A m p l i
t u d e
f(Hz)
图 4输出频率为20Hz 的时频图
DDS 产生的正弦信号时域波形图
s o u
t
t(s)
DDS 产生的正弦信号频域波形图
A m p l i t u d e
f(Hz)
图 5输出频率为21Hz 的时频图
图4和图5分别显示了DDS 产生的频率20Hz 和21Hz 的正弦波形的频谱图,从图中可
以看到本次DDS 设计达到了1Hz 的频率分辨率,即每次调整输出正弦波的频率最小可以做
1Hz 的变动。
六. 设计总结
本次设计通过MATLAB 数字仿真成功实现了DDS 的调试和设计,增加了对DDS 原理的理解。通过DDS 技术合成的波形具有较好的稳定性,精度很高以及易于控制盒调节,可以广泛的用于现代数字通讯系统中。通过本次设计,增加了我学习和思考的能力,提高了动手和编程技能,也让我对MATLAB 的掌握更加熟练了。