quartus FFT核使用(2)
quartus FFT核使用(2)
对一个信号做fft
%%采样频率为256Hz,采样点数为4096个点; %信号含有2V的直流分量, 频率为50Hz、相位为-30度、幅度为3V的交流信号, 频率为75Hz、相位为90度、幅度为1.5V的交流信号。 %用数学表达式就是如下: S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %对信号采样数据为4096点的处理 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clc;close all; clear all;close; fs=256;N=4096; %采样频率和数据点数 n=0:N-1; t=n/fs; %时间序列 signal = 2 + 3*cos(2*pi*50*t-pi*30/180) + 1.5*cos(2*pi*75*t+pi*90/180); %信号 figure; plot(signal); y=fft(signal,N); %对信号进行快速Fourier变换 mag=abs(y); %求得Fourier变换后的振幅 f=n*fs/N; %频率序列 figure; subplot(2,1,1), plot(f,mag); %绘出随频率变化的振幅 xlabel('频率/Hz'); %%频率为:Fn=(n-1)*Fs/N ylabel('振幅'); title('N=4096'); subplot(2,1,2); plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅 xlabel('频率/Hz'); ylabel('振幅');title('N=4096'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%将信号写入txt文件 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% image_data = signal*0; for x = 1:N signal(x)= round(signal(x)); image_data(x) = round(image_data(x)); end fidr = fopen('sin_process_real_input.txt','wt');%将信号进行打印输?? fidi = fopen('sin_process_image_input.txt','wt');%将信号进行打印输?? fprintf(fidr,'%d\n',signal); fprintf(fidi,'%d\n',image_data); fclose(fidr); fclose(fidi);
写入文件,将上一节仿真文件的.txt文件修改
3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、 第76个点上出现峰值,其它各点应该接近0
在FPGA中仿真
对信号进行对比,将modelsim生成的文件在matlab中运行
clc;close all; clear all;close; N = 1024; sin_fidro = fopen('ip_fft_real_output_ver.txt','r'); sin_fidio = fopen('ip_fft_imag_output_ver.txt','r'); sin_fideo = fopen('ip_fft_exponent_output_ver.txt','r'); sin_yreal_out = fscanf(sin_fidro,'%d'); sin_yimag_out = fscanf(sin_fidio,'%d'); sin_yexp_out = fscanf(sin_fideo,'%d'); fclose(sin_fidro); fclose(sin_fidio); fclose(sin_fideo); figure; plot(sin_yreal_out); title('sin_yreal_out'); figure; plot(sin_yimag_out); title('sin_yimag_out'); figure; plot(sin_yexp_out); title('sin_yexp_out'); for i=1:N*4-1 sin_real_out(i) = sin_yreal_out(i)/(2^(sin_yexp_out(i)));%%实部和缩放因子的处理 sin_imag_out(i) = sin_yimag_out(i)/(2^(sin_yexp_out(i)));%%虚部和缩放因子的处理 sin_mod_out(i) = sqrt(sin_real_out(i)^2 + sin_imag_out(i)^2);%计算幅值 end figure; plot(abs(sin_mod_out)); title('sin mod out'); figure; plot(sin_real_out); title('sin real out'); figure; plot(sin_imag_out); title('sin imag out');
3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第201个点、 第301个点上出现峰值,其它各点应该接近0。
根据某点n所表示的频率为:Fn=(n-1)*Fs/N,Fs为256Hz,N为1024,
第1个点:就是0Hz,即是直流信号;
第201个点:(201-1)*256/1024=50Hz;
第301个点:(301-1)*256/1024=75Hz。由此,验证FFT IP核的正确性。