quartus FFT核使用(2)

时间:2020-05-12
本文章向大家介绍quartus FFT核使用(2),主要包括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核的正确性。

原文地址:https://www.cnblogs.com/wanglinwensi/p/12877424.html