DDS原理以及MATLAB实现

DDS:Direct Digital Synthesis,是指信号发生器。

DDS信号发生器采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平,并且可以在很宽的频率范围内进行精细的频率调节。采用这种方法设计的信号源可工作于调制状态,可对输出电平进行调节,也可输出各种波形。

DDS原理:

我这里介绍的是相位截断DDS。

DDS原理以及MATLAB实现_第1张图片

我们从图中可以看出其原理主要由4部分构成,相位增量,相位累加器,相位量化器,查找表构成。

相位增量,每一个系统时钟,相位增加多少,就是图中的Δθ.

DDS原理以及MATLAB实现_第2张图片

相位累加器:相位增量按照系统时钟,每一个时钟增加一次,这样依次累积起起来,从图中看出就是每一个CLK,就增加一个Δθ,然后每一个时钟就累加到一起。就构成了相位累加器。我们知道相位的范围是0~2π,就相当于是一个圆,而我们计算机处理都是用的数字信号,所以要进行量化,比如我们用N位数去存0~2π,意思就是将0~2π平分为2^N份,则其中的一份就是相位增量

sin,cos查找表:就是一个周期内的正弦波我们取多少位去存储数据,比如我们取10位,就是一个周期取2^10,1024个点去存储器幅值,

相位量化器:就是我们的我们用相位累加器得到的相位怎么去寻址我们的sin,cos的波形的查找表,常常我们的相位累加器的位数会大于我们的正余弦的查找表的位数,因为如果两个的位数相等,存储容量和资源的要求就比较高了。所以这里就需要量化,一般我们是用相位累加器的最高位来寻址,这样就是多个系统时钟寻一个址,这样能保证相位累加器溢出时,从正弦ROM表中取出正好一个正弦周期的样点。

下面我们介绍一些基本的原理公式:

DDS原理以及MATLAB实现_第3张图片

注意:上述的是数学原理,记住w = 2π*f,就可以自己推公式了。记住我们是在数字域,所以都要将数据量化,上述的2π,就会量化我我们的2^N,N代表的你用多少位去存储0~2π,就是相位增量那里的量化值,Δθ表示的是量化后的相位的K倍。

下面实现用MATLAB 代码实现DDS:

MATLAB实现1MHz的正弦波,

首先,我们知道我们在matlab中信号能表示的都是数字信号,就是模拟信号采样,得到数字信号我们就要先进行采样,采样必须满足奈奎斯特采样定理,fs>= 2f ,就是采样频率必须是被采样信号的频率的2倍及以上,然后得到数字波形,下面是我们生成一个1M正弦波的代码,首先生成代码之前前,必须知道怎么计算频率控制字:

DDS原理以及MATLAB实现_第4张图片

 这里与前面讲的原理一致,只需要相互对应就可以了,下面是其代码:

clc;
clear all;
f_out  = 1e6; %输出频率
fs =  16e6 ;%采样率 
n = 0:1/1024:1023/1024  %1024个点,10位
sin_rom = sin(2*pi*n);
figure(1);
plot(sin_rom), x_lable('点数'),title('一个周期的正弦波');%给出一个周期的正弦波
%用10位去存储一个周期的征正弦波
w=f_out*2^16/fs; %1Mhz 载波的频率控制字
len = length(sin_rom)*fs/f_out; %数据长度
w_r = 0;  %
rom_addr = 0;
sin_1m = zeros(1,len);
for i = 1:len
    w_r = w_r + w;
    if(w_r > 2^16)
        w_r =  w_r - 2^16;
    end
    rom_addr = round(w_r /2^6);%10位来存储其rom的地址,相当于一个正弦波的周期被分成了2^10次方份
    if rom_addr == 0
        rom_addr = 1;
    end
	sin_1m(i) =  sin_rom(rom_addr);
end
figure(2);
plot(sin_1m(1:300)), x_lable('点数'),title('一个周期的正弦波');

结果图:

DDS原理以及MATLAB实现_第5张图片

DDS原理以及MATLAB实现_第6张图片 

DDS原理以及MATLAB实现_第7张图片 

说明:此博客这是记录自己学习信号处理的过程,如果有错误,希望指出,并且这里参考了尤老师的一些资料

你可能感兴趣的:(数字信号处理,FPGA,matlab,数字信号处理)