前言
FFT在数字信号处理用得非常普遍,对此我专门做了一个数字信号入门级的题目。而且也是很重要的一个题目,涉及的知识点非常多,有信号生成,FFT分析,CORDIC计算也包括Matlab软件,ISE软件,Modelsim,Debussy的使用等。对于想要做数字信号处理相关的同学,可以以此为基础,展开深入学习,定能取得事办功倍的效果。
专题说明
首先利用Matlab软件,生成两组信号,然后将两组信号以coe文件的形式存在FPGA的ROM中,按一定的时钟频率读出再送入FFT IPCORE,经过FFT分析以后,得到信号的实部和虚部,再将实部数据和虚部数据送入CORDIC IPCORE,经过计算便可以得到两个信号的幅度和相位。将两个相位相减即可得到相位差。
准备工作
Matlab软件ISE 14.6软件Modelsim仿真软件Debussy波形查看软件
理论分析
Matlab代码分析
%%%%%%%%%%%%%生成两路被测信号%%%%%%%%%%
N=1024;%采样点数
w=pi/4;%采样角频率
n=0:1:N-1;
s=wgn(1,1024,-20)%高斯白噪声
y0=0.5*cos(w.*n);
y1=0.4*cos(w.*n+pi/2);
z0=y0+s;%生成第一路信号
z1=y1+s;%生成第二路信号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%在实际项目中,我们都是用的AD去采集外部信号,为了尽可能模拟真实环境,我们做一下AD量化
v0=round(z0*1000/0.366);%量化成AD
v1=round(z1*1000/0.366);%量化成AD
%%由于Cos波形有正有负,FPGA只能利用补码的形式来处理负数,所以还需要进行补码的转换
k=1;
i=1;
M=12;
ad_data0=zeros(1,1024)
ad_data1=zeros(1,1024)
for k=1:N
if(v0(k)>=0)
ad_data0(k)=v(k);
else
ad_data0(k)=2^M+v(k);
end
end
for i=1:N
if(v1(i)>=0)
ad_data1(i)=v1(i);
else
ad_data1(i)=2^M+v1(i);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
将ad_data0,ad_data1以mif的格式存储起来,因为我们用的是ISE,
在给ROM添加文件的时候,只能是COE文件,所以,我们还要将
生成的mif文件手动改成COE文件,并保存
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fild=fopen('data0.mif','wt');
fprintf(fild,'%s\n','WIDTH=8;');
fprintf(fild,'%s\n\n','DEPTH=1024;');
fprintf(fild,'%s\n','ADDRESS_RADIX=UNS;');
fprintf(fild,'%s\n\n','DATA_RADIX=HEX;');
fprintf(fild,'%s\t','CONTENT');
fprintf(fild,'%s\n','BEGIN');
for i=1:1024
fprintf(fild,'\t%g\t',i);
fprintf(fild,'%s\t',':');
fprintf(fild,'%d',ad_data0(i));
fprintf(fild,'%s\n',' ');
end
fprintf(fild,'%s\n','END');
fclose(fild);
fild=fopen('data1.mif','wt');
fprintf(fild,'%s\n','WIDTH=8;');
fprintf(fild,'%s\n\n','DEPTH=1024;');
fprintf(fild,'%s\n','ADDRESS_RADIX=UNS;');
fprintf(fild,'%s\n\n','DATA_RADIX=HEX;');
fprintf(fild,'%s\t','CONTENT');
fprintf(fild,'%s\n','BEGIN');
for i=1:1024
fprintf(fild,'\t%g\t',i);
fprintf(fild,'%s\t',':');
fprintf(fild,'%d',ad_data1(i));
fprintf(fild,'%s\n',' ');
end
fprintf(fild,'%s\n','END');
fclose(fild);
%%%%%%%%%%%计算相位差%%%%%%%%%%%%%
abs_max0=max(abs(f0))