DDS信号源MATLAB,Xilinx-Verilog-学习笔记(19):正弦波信号发生器与DDS

本文介绍了如何使用MATLAB和Verilog实现数字直接合成(DDS)正弦波信号发生器。首先,通过MATLAB生成并量化正弦波,接着在Verilog中设计DDS模块,包括相位累加器、频率控制字和RAM。通过仿真验证,实现了频率可调的正弦波信号。此外,还讨论了混频器的概念和混频后的频谱分析。
摘要由CSDN通过智能技术生成

Xilinx-Verilog-学习笔记(19):正弦波信号发生器与DDS

一、正弦波信号发生器

1、浮点数的定点化

这里以2.918为例,实现浮点数向定点数的转换:

(1)在进行浮点转定点之前,要先确定整数部分位宽和小数部分位宽。3位整数位宽,12位的小数位宽,最高位的符号位1位。

(2)15位宽的数能够表示的数值范围为-32768到32767。整数部分3位宽的数最大能表示到8,因此最大精度为8/32767=0.000244140625。

(3)2.918进行定点化的过程为2.918/(8/32768)=11952.128~=11952这个值就是定点后的2.918的值。而最后的0.128就是定点化会带来量化误差。

2、用matlab生成正弦波并进行量化处理

量化处理

量化在数字信号处理领域,是指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程。

正弦波量化思想

本实验通过256个位宽为8的数据对正弦信号进行采样,以对一个周期的正弦信号进行量化处理。每个数据位宽为8,相当于把正弦信号的幅度从-1到1进行256份等间隔划分;采样点数为256个,相当于对一个正弦周期等间隔地采样了256个点。

量化后的数据由256个介于-1到1之间的数构成,之后将浮点型的数值进行定点化的转换,使其为0~256之间的整数。(具体处理方法见代码)

MatLab代码:

clc;

clear all;

N=2^8;

s_p=0:255;%正弦波一个周期的采样点数

sin_data=sin(2*pi*s_p/N);%256个介于-1到1之间的数

%打印我们的波形

% plot(sin_data,'r*');

% hold on;

% plot(sin_data);

%定点化

fix_p_sin_data=fix(sin_data*127);%256个介于-128到127之间的数

for i=1:N

if fix_p_sin_data(i)<0

fix_p_sin_data(i)=N+fix_p_sin_data(i);%将负数搬到128到256之间(用255加即可)

else

fix_p_sin_data(i)=fix_p_sin_data(i);%整数不用管

end

end

%以下是生成mif文件,用于RAM的初始化

fid=fopen('sp_ram_256x8.mif','w+');

fprintf(fid,'WIDTH=8;\n');

fprintf(fid,'DEPTH=256;\n');

fprintf(fid,'ADDRESS_RADIX=UNS;\n');

fprintf(fid,'DATA_RADIX=UNS;\n');

fprintf(fid,'CONTENT BEGIN \n');

for i=1:N

fprintf(fid,'%d:%d; \n',i-1,fix_p_sin_data(i));

end

fprintf(fid,'END; \n');

fclose(fid);

通过sin_data=sin(2 * pi * s_p/N); 即可实现对一个正弦周期的量化。

49ecf0131e43a75b600b0e0854e925bd.png

3、design文件

moduleex_dds(

inputwiresclk,

inputwirerst_n,

outputwir

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值