基于FPGA利用FFT,CORDIC分析数据频谱

it2022-05-05  156

前言

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))
转载请注明原文地址: https://win8.8miu.com/read-3596.html

最新回复(0)