zoukankan      html  css  js  c++  java
  • 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
    ',signal);
    fprintf(fidi,'%d
    ',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核的正确性。

  • 相关阅读:
    杨老师课堂_VBA学习教程之根据部门列创建工作表
    杨老师课堂_Java核心技术下之控制台模拟微博用户注册案例
    杨老师课堂_Java核心技术下之控制台模拟记事本案例
    杨校老师课堂之JavaScript右下角广告弹框教程
    JavaScript的数组知识案例之随机点名器
    SET QUOTED_IDENTIFIER ON
    SET ANSI_NULLS ON
    OLEDB和ODBC的区别
    教你认识主板上的主要芯片
    递归和迭代有什么区别
  • 原文地址:https://www.cnblogs.com/wanglinwensi/p/12877424.html
Copyright © 2011-2022 走看看