这几天注意到DDS输出杂散手算比较麻烦,而且ADIsinDDS又只能算到3阶。本着懒惰是第一驱动力的原则,也为了加深对DDS输出杂散的印象,就用matlab写了一个简单的程序,用于仿真估算在特定采样率下,特定输出频率下的DDS杂散计算,目的是为了在设计时可以简单地对采样频率、输出频率进行规划。
程序目前相对简单,只计算了1~5次镜像和3、5、7、9次谐波,感觉已经够用了,如果不够用后期我会继续更新。
注意,该程序旨在方便估算输出杂散频率,确定不了输出杂散功率
由于matlab2016不允许在代码里直接调用子函数,所以有两个函数打包成.m文件了。完成程序下载链接:DDS输出杂散计算程序matlab.zip
clear all;
close all
%====================================================%
% DAC/DDS输出杂散计算
% Likeng 2021.11.09A
% 该程序用于计算特定输出频率、采样率下DDS输出杂散的估算
% 目前默认算到9次谐波导致的杂散,且分析频率为3.5倍的采样率
% 如需修改,可以修改变量f_stop。
% 注意,该程序旨在方便估算输出杂散频率,确定不了输出杂散功率
%
% 程序需要输入以下参数
% fc:DDS时钟频率(采样频率)
% f_rd1:DDS输出频率(即基波)
% Count:分析点数
%====================================================%
fc=100;%MHz DAC采样时钟频率
f_rd1=30.72;%MHz DAC输出频率
Count=1001;%分析点数
%=====================================================%
f_start=0;%起始频率
f_stop=fc*3.5;%终止频率
%基波、各次谐波计算
f_rd3=3*f_rd1;
f_rd5=5*f_rd1;
f_rd7=7*f_rd1;
f_rd9=9*f_rd1;
A_rd1=Amp(f_rd1,fc);
A_rd3=Amp(f_rd3,fc);
A_rd5=Amp(f_rd5,fc);
A_rd7=Amp(f_rd7,fc);
A_rd9=Amp(f_rd9,fc);
%各次谐波实际出现频率计算
f_rd3_real=Search_frd(f_rd3,fc);
f_rd5_real=Search_frd(f_rd5,fc);
f_rd7_real=Search_frd(f_rd7,fc);
f_rd9_real=Search_frd(f_rd9,fc);
%各次镜像计算
f_img1=fc-f_rd1;
f_img2=fc+f_rd1;
f_img3=2*fc-f_rd1;
f_img4=2*fc+f_rd1;
f_img5=3*fc-f_rd1;
A_img1=Amp(f_img1,fc);
A_img2=Amp(f_img2,fc);
A_img3=Amp(f_img3,fc);
A_img4=Amp(f_img4,fc);
A_img5=Amp(f_img5,fc);
%包络计算
f=linspace(f_start,f_stop,Count);
A1=sin(pi*f/fc);
A2=pi*f/fc;
A=abs(A1./A2);
figure;
%画包络
plot(f,A,'--',...
[fc/2,fc/2],[0,Amp(fc/2,fc);],'--',...
[fc*3/2,fc*3/2],[0,Amp(3*fc/2,fc)],'--',...
[fc*5/2,fc*5/2],[0,Amp(5*fc/2,fc)],'--',...
[fc*7/2,fc*7/2],[0,Amp(7*fc/2,fc)],'--',...
'Color',[0 0.447 0.741]);%包络
hold on;
%画基波、各次谐波
plot([f_rd1,f_rd1],[0,A_rd1],'-^','Color',[0.635 0.078 0.184]);
plot([f_rd3,f_rd3],[0,A_rd3],'--',...
[f_rd5,f_rd5],[0,A_rd5],'--',...
[f_rd7,f_rd7],[0,A_rd7],'--',...
[f_rd9,f_rd9],[0,A_rd9],'--',...
'Color',[0.466 0.674 0.188]);
%画各次镜像
plot([f_img1,f_img1],[0,A_img1],'-^',...
[f_img2,f_img2],[0,A_img2],'-^',...
[f_img3,f_img3],[0,A_img3],'-^',...
[f_img4,f_img4],[0,A_img4],'-^',...
[f_img5,f_img5],[0,A_img5],'-^',...
'Color',[0.635 0.078 0.184]);
%画各次谐波实际位置
plot([f_rd3_real,f_rd3_real],[0,A_rd3],'-^',...
[f_rd5_real,f_rd5_real],[0,A_rd5],'-^',...
[f_rd7_real,f_rd7_real],[0,A_rd7],'-^',...
[f_rd9_real,f_rd9_real],[0,A_rd9],'-^',...
'Color',[0.929 0.694 0.125]);
grid on;
xlabel('频率(MHz)');
ylabel('相对幅度');
title('DAC输出杂散');
figure;
%画包络
plot(f,A,'--',...
[fc/2,fc/2],[0,Amp(fc/2,fc);],'--',...
[fc*3/2,fc*3/2],[0,Amp(3*fc/2,fc)],'--',...
[fc*5/2,fc*5/2],[0,Amp(5*fc/2,fc)],'--',...
[fc*7/2,fc*7/2],[0,Amp(7*fc/2,fc)],'--',...
'Color',[0 0 0]);%包络
hold on;
%画基波
plot([f_rd1,f_rd1],[0,A_rd1],'-^');
hold on;
%画各次谐波实际位置
plot([f_rd3_real,f_rd3_real],[0,A_rd3],'-^',...
[f_rd5_real,f_rd5_real],[0,A_rd5],'-^',...
[f_rd7_real,f_rd7_real],[0,A_rd7],'-^',...
[f_rd9_real,f_rd9_real],[0,A_rd9],'-^'...
);
axis([0 fc/2 0 1]);%调整图像查看频率
grid on;
xlabel('频率(MHz)');
ylabel('相对幅度');
title('DAC输出杂散(第一奈奎斯特区)');
set(gca,'Fontname','Monospaced');%防止中文乱码
本人不才,该代码仅仅与ADIsimDDS对比过几个参数,并且跟资料中的实例相验证,并没有用DDS真实地去一个个试过,代码仅供参考,如有不对之处请指出!