精华内容
下载资源
问答
  • DFT的matlab源代码fft-ifft 将numpy导入为np 导入cv2 从matplotlib导入pyplot作为plt img = cv2.imread('pic.jpg',0) dft = cv2.dft(np.float32(img),标志= cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft....
  • 该文件主要实现了FFT-IFFT法实现LFM信号匹配滤波。 仿真要求: 信号时宽为10us、带宽为30MHz、波形为LFM信号(单边扫频,即频率范围[0,30MHz])、采样率为80MHz
  • IFFT_ifft_源码

    2021-09-29 02:04:50
    快速傅里叶反变换IFFT,封装的函数,测试有效
  • 低功耗MSP430单片机实现快速傅里叶变换代码原码和完整工程文件。
  • 如需集成C++,请自调试;去除老旧照片网纹,详细说明:https://fixelalgorithms.co/news/2018/07/fixel-fft-wizard-1-ps/
  • win 64下使用 fftw实现fft及ifft(demosource),demosource中fftw_plan_dft_r2c_1d为fft使用函数,fftw_plan_dft_c2r_1d为ifft使用函数。
  • ifft实现代码matlab 投手这 该存储库包含与佛罗里达大学课程中的最终项目有关的文件。 每个学生有2个星期的时间在MATLAB中为他们的项目建模,并在微控制器上实现该项目以在全班同学面前演示。 我的项目包含三个频域...
  • C++实现任意点数的FFT及IFFT(数字信号处理 FFT)。 包含复数类和FFT实现类,mainfft.cpp为实例程序。 数字信号处理 FFT
  • ifft实现代码matlab DNLM过滤器的遗传算法 该存储库包含用于遗传算法的代码,该论文在论文“欺骗性非局部均值过滤器的自动校准以改善基于荧光的显微镜中细胞的分割”中进行了描述。 该滤镜的目的是在增强边缘的同时...
  • 用matlab求ifft的代码ECE 9305修正谱减法项目报告。应用概率论 I 提交者:Manan sheel。 学生证:250938184 理论 我已经实现了 [1] 中给出的用于语音增强的频谱减法的修改,该方法基于使用参数“alpha”的频谱过减,...
  • PhotoShop FFT/iFFT 滤镜

    2018-10-23 10:13:40
    去除老旧照片网纹,详细说明:https://fixelalgorithms.co/news/2018/07/fixel-fft-wizard-1-ps/
  • 在这个压缩文件中包含了一个FFT类以及一个复数类,实现了快速傅里叶变换及其反变换(FFT和IFFT)以及复数的运算。综合考虑各细节使碟形算法达到最高的效率。头文件中还包括了FFT类的使用方法。 此算法的准确性经过...
  • c++ 实现FFT和IFFT

    2015-03-28 14:34:07
    用c++ 实现傅里叶变换FFT和傅里叶逆变换IFFT
  • 图像处理FFT IFFT

    2015-05-09 14:21:59
    图像处理傅里叶变化(FFT)和(IFFT
  • C#实现FFT和IFFT

    热门讨论 2015-01-04 10:29:00
    用C#实现的FFT和IFFT类,方便初学者进行学习,也可直接在代码里使用
  • FFT与IFFT算法的C程序实现
  • 反转傅里叶IFFT反转.vi

    2020-06-03 14:47:34
    反转傅里叶IFFT反转.vi
  • 该设计采用优化的单碟形4路并行结构,兼容802.11g协议,可配置完成64点、256点、1 024点的FFT-IFFT处理器,设计以Xilinx公司的Virtex-2系列的XC22V500芯片为硬件平台。通过大量实际信号与数据的联合调试,表明了设计...
  • 数字信号处理dit-fft和ifft的c语言实现
  • 带有内置函数的 FFT/IFFT 运算的 MATLAB 代码。 复合信号被视为输入信号。
  • FFT及IFFT的C语言实现

    2015-01-29 17:50:00
    对照西电版本的《数字信号处理》,实现了FFT和IFFT的运算,懂一点原理的都能看懂该函数,经过测试是可以用的。
  • FFT与IFFT频域信号处理研究
  • ifft(matlab中ifft是什么意思)

    千次阅读 2021-04-18 09:52:16
    设SLM是一个128*8的矩阵,那么Y=ifft(SLM,[],2)和Y=ifft(SLM,128)一样吗?对。Y=ifft(SLM,[],1)和Y=ifft(SLM,128)才是一样的。第一种用法:ifft(SLM,[],dim)中的dim表示维度,1表示列,2表示行。第二个参数为[]表示...

    设SLM是一个128*8的矩阵,那么Y=ifft(SLM,[],2)和Y=ifft(SLM,128)一样吗?对。

    Y=ifft(SLM,[],1)和Y=ifft(SLM,128)才是一样的。第一种用法:ifft(SLM,[],dim)中的dim表示维度,1表示列,2表示行。第二个参数为[]表示点数与原矩阵每列元素数。如果是 ifft(.

    DFT,即可测试性设计(Design for Testability, DFT)是一种集成电路设计技术,它. IFFT——Inverse Fast Fourier Transform 快速傅里叶逆变换。快速傅里叶变换 (fast .

    快速傅里叶逆变换 ifftn即为N维快速傅里叶逆变换学校matlab应该知道

    现在有频域响应(一组数据),绘图左,想转换为时域响应,我用ifft(刚自己。

    复数是因为采样的信号是截断的,不是时域无限长的,当然时域序列越长,逆傅立叶变换后的虚部值越小。你取逆傅立叶变换后结果的实部就可以了。时间域取模,就在概.

    如题.FFT的汇编程序有了,要求用FFT来实现IFFT,该怎么做啊??????。

    先将要做Ifft的数据取共轭,然后fft,结果再取共轭后处以N,结果就是ifft的结果。不过和直接ifft算法相比有精度上的误差。 查看原帖>> 采纳哦

    因为上行信号都是那么做的——所谓PUSCH的SC-FDMA…… ∑X[k]EXP[j2π(k+φ+K(k0+1/2)ΔfRA(t-TCP)],即是把X[k]向频域上映射,时域上从TCP处开始。

    simulink中的ifft模块是什么

    1. 是自定义的模块,非系统自带的,需要你自己编写。2. V/F模块属于电压频率比模块,作用是通过比值计算该频率下需要的电压。具体计算方法请参考“电力拖动”等相.

    DFT 离散傅里叶变换IDFT 离散傅里叶反变换FFT 快速傅里叶变换IFFT 快速傅里叶反变换

    IDFT就是Inverse Discrete Fourier Transform 离散傅里叶逆变换。FFT就是Fast Fourier Transform 快速傅里叶变换。两者的应用都是将时域中难以处理的信号转换成易于处.

    Matlab中FFT有1D和2D的,FFT得到的是信号的频谱即t-》f 如 clear%编写骆遥 fs=1000 t=0:1/fs:0.6; f1=100; f2=300; x=sin(2*pi*f1*t)+sin(2*pi*f2*t); subplot(711) plot(x); title('f.

    fftshift的反变换 fftshift把频谱图居中方便观察

    fft得到的像谱默认不是按照中心对称的(快速傅里叶变换的原因),一般需要用fftshift方法使得其按中心对称,这样的话当我们ifft 时,得到的数据就会和之前实际的不一样.

    function testFs = 256; % 采样频率T = 1/Fs; % 采样时间t = (0:Fs-1)*T; % 时间序列(时间轴)S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180);f= Fs*.

    我是对一个复数矩阵进行的调制,矩阵总共为1024行,2列,两边各有200行.

    你的调制是什么操作?如果是共轭转置矩阵相乘,很容易解释,(a+ib)(a-ib) = a2 - b2成了实数打字不易,如满意,望采纳。

    OFDM为什么要用到IFFT/FFT,首先得理解OFDM的基本原理。早期产生OFDM信号是使复用一组相互正交的载波源,使得调制到载波上的符号相互正交,这制是一种模拟.

    X=fft(x);magX=abs(X);angX=angle(X); Y=magX.*exp(1i*angX);y=ifft(Y);--------。

    最后加一句y = real(y);real为求复数实部的函数这样x和y就一样了,因为反变换后虚部系数都为零

    我生成过很多随机复数数列(1*2^n维)实验这两个函数,没有发现任何区别。

    我晕。。。这两个函数不是fft。。。fftshift就是对换数据的左右两边比如 x=[1 2 3 4] fftshift(x) ->[3 4 1 2] ifftshift是为了当数据不是偶数长度时加出来的一个函数 x=[1 2 3 4 5] .

    有个powergui模块可以用,不过要在scope中的parameters中将data history中的save data to workplace选中才行

    象富里哀级数,富里哀变换以及它们离散时间相应部分构成了信号处理的基础。为了便于这类问题的分析,MATLAB提供了函数fft,ifft,fft2,ifft2和fftshift。这类函数集执行一维.

    ofdm为什么要用到ifft/fft,首先得理解ofdm的基本原理。早期产生ofdm信号是使用一组相互正交的载波源,使得调制到载波上的符号相互正交,这是一种模拟域实现ofdm调.

    展开全文
  • C# fft_ifft

    2018-03-21 12:47:17
    根据网上资源实现的一维二维快速傅里叶变换fft ifft,,
  • 基于我上一篇关于fft的讲解,现在更加深入解析ifft和fft的组合应用和参数特性,让你将信号在时域频域之间轻松自由地快速正确变换,同时根据需要调整变换的结果。
  • 基于FPGA的IFFT处理器设计
  • 前面编过2D-FFT的程序,现在把2D-IFFT的程序整合到一起,便于后面做图像变换反变换使用。FFT与IFFT有如下关系:相应的2D-FFT与2D-IFFT的关系如下:所以可以利用一个FFT核心函数实现2D-FFT与2D-IFFT。代码如下:#...

    前面编过2D-FFT的程序,现在把2D-IFFT的程序整合到一起,便于后面做图像变换反变换使用。

    FFT与IFFT有如下关系:

    相应的2D-FFT与2D-IFFT的关系如下:

    所以可以利用一个FFT核心函数实现2D-FFT与2D-IFFT。代码如下:

    #include

    #include

    #include

    #define intsize sizeof(int)

    #define complexsize sizeof(complex)

    #define PI 3.1415926

    int *a,*b;

    int nLen,init_nLen,mLen,init_mLen,N,M;

    FILE *dataFile;

    typedef struct{

    float real;

    float image;

    }complex;

    complex *A,*A_In,*W;

    complex Add(complex, complex);

    complex Sub(complex, complex);

    complex Mul(complex, complex);

    int calculate_M(int);

    void reverse(int,int);

    void readData();

    void fft(int,int);

    void Ifft();

    void printResult_fft();

    void printResult_Ifft();

    int main()

    {

    int i,j;

    readData();

    A = (complex *)malloc(complexsize*nLen);

    reverse(nLen,N);

    for(i=0; i

    {

    for(j=0; j

    {

    A[j].real = A_In[i*nLen+b[j]].real;

    A[j].image = A_In[i*nLen+b[j]].image;

    }

    fft(nLen,N);

    for(j=0; j

    {

    A_In[i*nLen+j].real = A[j].real;

    A_In[i*nLen+j].image = A[j].image;

    }

    }

    free(a);

    free(b);

    free(A);

    A = (complex *)malloc(complexsize*mLen);

    reverse(mLen,M);

    for(i=0; i

    {

    for(j=0; j

    {

    A[j].real = A_In[b[j]*nLen+i].real;

    A[j].image = A_In[b[j]*nLen+i].image;

    }

    fft(mLen,M);

    for(j=0; j

    {

    A_In[j*nLen+i].real = A[j].real;

    A_In[j*nLen+i].image = A[j].image;

    }

    }

    free(A);

    printResult_fft();

    Ifft();

    printResult_Ifft();

    return 0;

    }

    void readData()

    {

    int i,j;

    dataFile = fopen("dataIn.txt","r");

    fscanf(dataFile,"%d %d",&init_mLen,&init_nLen);

    M = calculate_M(init_mLen);

    N = calculate_M(init_nLen);

    nLen = (int)pow(2,N);

    mLen = (int)pow(2,M);

    A_In = (complex *)malloc(complexsize*nLen*mLen);

    for(i=0; i

    {

    for(j=0; j

    {

    fscanf(dataFile,"%f",&A_In[i*nLen+j].real);

    A_In[i*nLen+j].image = 0.0;

    }

    }

    fclose(dataFile);

    for(i=0; i

    {

    for(j=init_nLen; j

    {

    A_In[i*nLen+j].real = 0.0;

    A_In[i*nLen+j].image = 0.0;

    }

    }

    for(i=init_mLen; i

    {

    for(j=0; j

    {

    A_In[i*nLen+j].real = 0.0;

    A_In[i*nLen+j].image = 0.0;

    }

    }

    printf("Reading initial datas:\n");

    for(i=0; i

    {

    for(j=0; j

    {

    if(A_In[i*nLen+j].image < 0)

    {

    printf("%f%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);

    }

    else

    {

    printf("%f+%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);

    }

    }

    printf("\n");

    }

    printf("\n");

    printf("Reading formal datas:\n");

    for(i=0; i

    {

    for(j=0; j

    {

    if(A_In[i*nLen+j].image < 0)

    {

    printf("%f%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);

    }

    else

    {

    printf("%f+%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);

    }

    }

    printf("\n");

    }

    }

    void fft(int fft_nLen, int fft_M)

    {

    int i;

    int lev,dist,p,t;

    complex B;

    W = (complex *)malloc(complexsize*fft_nLen/2);

    for(lev=1; lev<=fft_M; lev++)

    {

    dist = (int)pow(2,lev-1);

    for(t=0; t

    {

    p = t*(int)pow(2,fft_M-lev);

    W[p].real = (float)cos(2*PI*p/fft_nLen);

    W[p].image = (float)(-1*sin(2*PI*p/fft_nLen));

    for(i=t; i

    {

    B = Add(A[i],Mul(A[i+dist],W[p]));

    A[i+dist] = Sub(A[i],Mul(A[i+dist],W[p]));

    A[i].real = B.real;

    A[i].image = B.image;

    }

    }

    }

    free(W);

    }

    void printResult_fft()

    {

    int i,j;

    printf("Output FFT results:\n");

    for(i=0; i

    {

    for(j=0; j

    {

    if(A_In[i*nLen+j].image < 0)

    {

    printf("%f%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);

    }

    else

    {

    printf("%f+%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);

    }

    }

    printf("\n");

    }

    }

    void printResult_Ifft()

    {

    int i,j;

    printf("Output IFFT results:\n");

    for(i=0; i

    {

    for(j=0; j

    {

    if(A_In[i*nLen+j].image < 0)

    {

    printf("%f%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);

    }

    else

    {

    printf("%f+%fi\t",A_In[i*nLen+j].real,A_In[i*nLen+j].image);

    }

    }

    printf("\n");

    }

    free(A_In);

    }

    int calculate_M(int len)

    {

    int i;

    int k;

    i = 0;

    k = 1;

    while(k < len)

    {

    k = k*2;

    i++;

    }

    return i;

    }

    void reverse(int len, int M)

    {

    int i,j;

    a = (int *)malloc(intsize*M);

    b = (int *)malloc(intsize*len);

    for(i=0; i

    {

    a[i] = 0;

    }

    b[0] = 0;

    for(i=1; i

    {

    j = 0;

    while(a[j] != 0)

    {

    a[j] = 0;

    j++;

    }

    a[j] = 1;

    b[i] = 0;

    for(j=0; j

    {

    b[i] = b[i]+a[j]*(int)pow(2,M-1-j);

    }

    }

    }

    complex Add(complex c1, complex c2)

    {

    complex c;

    c.real = c1.real+c2.real;

    c.image = c1.image+c2.image;

    return c;

    }

    complex Sub(complex c1, complex c2)

    {

    complex c;

    c.real = c1.real-c2.real;

    c.image = c1.image-c2.image;

    return c;

    }

    complex Mul(complex c1, complex c2)

    {

    complex c;

    c.real = c1.real*c2.real-c1.image*c2.image;

    c.image = c1.real*c2.image+c2.real*c1.image;

    return c;

    }

    void Ifft()

    {

    int i,j;

    for(i=0; i

    {

    for(j=0; j

    {

    A_In[i*nLen+j].image = -A_In[i*nLen+j].image;

    }

    }

    A = (complex *)malloc(complexsize*nLen);

    reverse(nLen,N);

    for(i=0; i

    {

    for(j=0; j

    {

    A[j].real = A_In[i*nLen+b[j]].real;

    A[j].image = A_In[i*nLen+b[j]].image;

    }

    fft(nLen,N);

    for(j=0; j

    {

    A_In[i*nLen+j].real = A[j].real/nLen;

    A_In[i*nLen+j].image = A[j].image/nLen;

    }

    }

    free(A);

    free(a);

    free(b);

    A = (complex *)malloc(complexsize*mLen);

    reverse(mLen,M);

    for(i=0; i

    {

    for(j=0; j

    {

    A[j].real = A_In[b[j]*nLen+i].real;

    A[j].image = A_In[b[j]*nLen+i].image;

    }

    fft(mLen,M);

    for(j=0; j

    {

    A_In[j*nLen+i].real = A[j].real/mLen;

    A_In[j*nLen+i].image = A[j].image/mLen;

    }

    }

    free(A);

    free(a);

    free(b);

    }

    测试数据及结果如下:

    数据输入文件data_In.txt的内容如下:

    3 3

    1 2 5

    3 2 5

    5 6 4

    测试结果如下:

    Reading initial datas:

    1.000000+0.000000i   2.000000+0.000000i   5.000000+0.000000i

    3.000000+0.000000i   2.000000+0.000000i   5.000000+0.000000i

    5.000000+0.000000i   6.000000+0.000000i   4.000000+0.000000i

    Reading formal datas:

    1.000000+0.000000i   2.000000+0.000000i   5.000000+0.000000i   0.000000+0.000000i

    3.000000+0.000000i   2.000000+0.000000i   5.000000+0.000000i   0.000000+0.000000i

    5.000000+0.000000i   6.000000+0.000000i   4.000000+0.000000i   0.000000+0.000000i

    0.000000+0.000000i   0.000000+0.000000i   0.000000+0.000000i   0.000000+0.000000i

    Output FFT results:

    33.000000+0.000000i   -5.000000-10.000000i   13.000000+0.000000i   -5.000000+10.000000i

    -7.000000-10.000000i  -7.000000+6.000000i    1.000000-6.000000i    -3.000000-2.000000i

    13.000000+0.000000i   -1.000000-6.000000i    1.000000+0.000000i    -1.000000+6.000000i

    -7.000000+10.000000i  -3.000000+2.000000i    1.000000+6.000000i    -7.000000-6.000000i

    Output IFFT results:

    1.000000+0.000000i   2.000000+0.000000i   5.000000+0.000000i   0.000000-0.000000i

    3.000000+0.000000i   2.000000+0.000000i   5.000000+0.000000i   0.000000-0.000000i

    5.000000+0.000000i   6.000000+0.000000i   4.000000+0.000000i   -0.000000-0.000000i

    0.000000-0.000000i   0.000000+0.000000i   0.000000-0.000000i   -0.000000+0.000000i

    Press any key to continue

    展开全文
  • 压缩包中的fft.c包含了所有子程序和main,可以直接运行。另一个文件夹是基于TMS320C5509软仿的工程。
  • 基于vivado实现FFT/IFFT

    2021-11-23 10:35:00
    AXIS_STATUS .m_axis_status_tdata(ifft_m_status_tdata), .m_axis_status_tready(ifft_m_status_tready), .m_axis_status_tvalid(ifft_m_status_tvalid), //M_AXIS_DATA .m_axis_data_tdata(ifft_m_data_tdata),//...


    前言

    使用vivado2018.3实现FFT/IFFT,过程比较详细。


    一、基本过程

    例化一个DDS的IP核和两个FFT的IP核分别用作FFT和IFFT变换,将DDS生成的正交信号输入到FFT,再将FFT的信号输出到IFFT中。
    在这里插入图片描述

    二、vivado配置

    1.新建工程

    打开vivado,界面如下
    在这里插入图片描述

    点击Open Project,进入如下页面,点击Next
    在这里插入图片描述
    编辑工程名字和保存路径,点击Next
    在这里插入图片描述
    查找所需要的板子型号(我所用的是xc7z020-1clg400c),但是后面只进行了仿真,未进行上板实验。
    在这里插入图片描述
    工程信息汇总,点击Finish,即可完成工程的新建。
    在这里插入图片描述
    工程界面如下
    在这里插入图片描述

    2.调用DDS的IP核

    调用DDS的IP核,生成10MHz正弦信号

    单击IP Catalog,输入dds,找到IP核后,双击
    在这里插入图片描述
    进入dds的IP核配置界面,各项选择如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    配置完成,点击OK即可。

    2.调用FFT的IP核

    搜索fft,然后找到Digital Signal Processing->Transforms->FFTs目录下的Fast Fourier Transform,双击进入配置界面。
    在这里插入图片描述
    各项选择配置如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    配置完成,点击OK即可。

    三、编写Verilog程序

    1.顶层文件fft.v

    例化IP核,将三个模块连接起来。

    点击Add Sources,弹出右侧窗口,选择Add or create design sources,点击Next
    在这里插入图片描述
    点击Create File
    在这里插入图片描述
    输入文件名称fft,点击OK
    在这里插入图片描述
    点击Finish
    在这里插入图片描述
    点击OK
    在这里插入图片描述
    点击Yes,即可完成新建。
    在这里插入图片描述
    vivado会自动生成IP核的调用方式的模板,双击相应IP核的.veo文件,可以看到Verilog版本的例化模板,可根据该模板写top文件,也就是驱动这个IP核的文件。

    代码如下:

    `timescale 1ns / 1ps
    
    module fft(
        input aclk,
        input aresetn,
        output [7:0] fft_real,
        output [7:0] fft_imag,
        output [7:0] ifft_real,
        output [7:0] ifft_imag
        );
    
        //DDS core
        wire [15:0] dds_m_data_tdata;
        wire fft_s_data_tready;
        wire dds_m_data_tvalid;
        wire dds_m_data_tlast;
        dds_compiler_0 dds_MHz (
            .aclk(aclk),
            .aresetn(aresetn),
            .m_axis_data_tdata(dds_m_data_tdata),
            .m_axis_data_tready(fft_s_data_tready),
            .m_axis_data_tvalid(dds_m_data_tvalid)
        );
    
        //FFT core
        wire [7:0] fft_s_config_tdata;//[0:0]FWD_INV_0
        wire fft_s_config_tready;
        wire fft_s_config_tvalid;
    
        wire [7:0] fft_m_status_tdata;
        wire fft_m_status_tready;
        wire fft_m_status_tvalid;
    
        wire [15:0] fft_m_data_tdata;
        wire fft_m_data_tlast;
        wire ifft_s_data_tready;
        wire [23:0] fft_m_data_tuser;//[11:0]XK_INDEX
        wire fft_m_data_tvalid;
    
        wire fft_event_frame_started;
        wire fft_event_tlast_unexpected;
        wire fft_event_tlast_missing;
        wire fft_event_status_channel_halt;
        wire fft_event_data_in_channel_halt;
        wire fft_event_data_out_channel_halt;
    
        wire [11:0] xk_index;
        assign xk_index = fft_m_data_tuser[11:0];
        assign fft_s_config_tdata = 8'd1;//定义FFT模块配置信息(第0位为1表示用FFT,为0表示用IFFT)
        assign fft_s_config_tvalid = 1'd1;//FFT模块配置使能,从一开始就拉高,表示已经准备好要传入的配置数据了
        xfft_0 usr_fft(
            .aclk(aclk),//Rising-edge clock
            .aresetn(aresetn),//(低有效)Active-Low synchronous clear (optional, always take priority over aclken); A minimum aresetn active pulse of two cycles is required
            //S_AXIS_DATA
            .s_axis_data_tdata(dds_m_data_tdata),//IN Carries the unprocessed sample data: XN_RE and XN_IM
            .s_axis_data_tlast(dds_m_data_tlast),//IN Asserted by the external master on the last sample of the frame
            .s_axis_data_tready(fft_s_data_tready),//OUT Used by the core to signal that it is ready to accept data
            .s_axis_data_tvalid(dds_m_data_tvalid),//IN Used by the external master to signal that it is able to provide data
            //S_AXIS_CONFIG
            .s_axis_config_tdata(fft_s_config_tdata),//IN Carries the configuration information
            .s_axis_config_tready(fft_s_config_tready),//OUT Asserted by the core to signal that it is ready to accept data
            .s_axis_config_tvalid(fft_s_config_tvalid),//IN Asserted by the external master to signal that it is able to provide data
            //M_AXIS_STATUS
            .m_axis_status_tdata(fft_m_status_tdata),
            .m_axis_status_tready(fft_m_status_tready),
            .m_axis_status_tvalid(fft_m_status_tvalid),
            //M_AXIS_DATA
            .m_axis_data_tdata(fft_m_data_tdata),//OUT Carries the processed sample data XK_RE and XK_IM
            .m_axis_data_tlast(fft_m_data_tlast),//OUT Asserted by the core on the last sample of the frame
            .m_axis_data_tready(ifft_s_data_tready),//IN Asserted by the external slave to signal that it is ready to accept data. Only present in Non-Realtime mode
            .m_axis_data_tuser(fft_m_data_tuser),//OUT Carries additional per-sample information: XK_INDEX, OVFLO and BLK_EXP
            .m_axis_data_tvalid(fft_m_data_tvalid),//OUT Asserted by the core to signal that it is able to provide status data
            //EVENTS
            .event_frame_started(fft_event_frame_started),//Asserted when the core starts to process a new frame
            .event_tlast_unexpected(fft_event_tlast_unexpected),//Asserted when the core sees s_axis_data_tlast High on a data sample that is not the last one in a frame
            .event_tlast_missing(fft_event_tlast_missing),//Asserted when s_axis_data_tlast is Low on the last data sample of a frame
            .event_status_channel_halt(fft_event_status_channel_halt),//Asserted when the core tries to write data to the Status channel and it is unable to do so
            .event_data_in_channel_halt(fft_event_data_in_channel_halt),//Asserted when the core requests data from the Data Input channel and none is available
            .event_data_out_channel_halt(fft_event_data_out_channel_halt)//Asserted when the core tries to write data to the Data Output channel and it is unable to do so
        );
        
        //IFFT core
        wire [7:0] ifft_s_config_tdata;//[0:0]FWD_INV_0
        wire ifft_s_config_tready;
        wire ifft_s_config_tvalid;
    
        wire [7:0] ifft_m_status_tdata;
        wire ifft_m_status_tready;
        wire ifft_m_status_tvalid;
    
        wire [15:0] ifft_m_data_tdata;
        wire ifft_m_data_tlast;
        wire ifft_m_data_tready;
        wire [23:0] ifft_m_data_tuser;//[11:0]XK_INDEX
        wire ifft_m_data_tvalid;
    
        wire ifft_event_frame_started;
        wire ifft_event_tlast_unexpected;
        wire ifft_event_tlast_missing;
        wire ifft_event_status_channel_halt;
        wire ifft_event_data_in_channel_halt;
        wire ifft_event_data_out_channel_halt;
    
        wire [11:0] ixk_index;
        assign ixk_index = ifft_m_data_tuser[11:0];
        assign ifft_s_config_tdata = 8'd0;//定义FFT模块配置信息(第0位为1表示用FFT)
        assign ifft_s_config_tvalid = 1'd1;//FFT模块配置使能,从一开始就拉高,表示已经准备好要传入的配置数据了
        assign ifft_m_data_tready = 1'd1;//从一开始就拉高,表示已经准备好接收IFFT模块输出的数据
        xfft_0 usr_ifft(
            .aclk(aclk),//Rising-edge clock
            .aresetn(aresetn),//(低有效)Active-Low synchronous clear (optional, always take priority over aclken); A minimum aresetn active pulse of two cycles is required
            //S_AXIS_DATA
            .s_axis_data_tdata(fft_m_data_tdata),//IN Carries the unprocessed sample data: XN_RE and XN_IM
            .s_axis_data_tlast(fft_m_data_tlast),//IN Asserted by the external master on the last sample of the frame
            .s_axis_data_tready(ifft_s_data_tready),//OUT Used by the core to signal that it is ready to accept data
            .s_axis_data_tvalid(fft_m_data_tvalid),//IN Used by the external master to signal that it is able to provide data
            //S_AXIS_CONFIG
            .s_axis_config_tdata(ifft_s_config_tdata),//IN Carries the configuration information
            .s_axis_config_tready(ifft_s_config_tready),//OUT Asserted by the core to signal that it is ready to accept data
            .s_axis_config_tvalid(ifft_s_config_tvalid),//IN Asserted by the external master to signal that it is able to provide data
            //M_AXIS_STATUS
            .m_axis_status_tdata(ifft_m_status_tdata),
            .m_axis_status_tready(ifft_m_status_tready),
            .m_axis_status_tvalid(ifft_m_status_tvalid),
            //M_AXIS_DATA
            .m_axis_data_tdata(ifft_m_data_tdata),//OUT Carries the processed sample data XK_RE and XK_IM
            .m_axis_data_tlast(ifft_m_data_tlast),//OUT Asserted by the core on the last sample of the frame
            .m_axis_data_tready(ifft_m_data_tready),//IN Asserted by the external slave to signal that it is ready to accept data. Only present in Non-Realtime mode
            .m_axis_data_tuser(ifft_m_data_tuser),//OUT Carries additional per-sample information: XK_INDEX, OVFLO and BLK_EXP
            .m_axis_data_tvalid(ifft_m_data_tvalid),//OUT Asserted by the core to signal that it is able to provide status data
            //EVENTS
            .event_frame_started(ifft_event_frame_started),//Asserted when the core starts to process a new frame
            .event_tlast_unexpected(ifft_event_tlast_unexpected),//Asserted when the core sees s_axis_data_tlast High on a data sample that is not the last one in a frame
            .event_tlast_missing(ifft_event_tlast_missing),//Asserted when s_axis_data_tlast is Low on the last data sample of a frame
            .event_status_channel_halt(ifft_event_status_channel_halt),//Asserted when the core tries to write data to the Status channel and it is unable to do so
            .event_data_in_channel_halt(ifft_event_data_in_channel_halt),//Asserted when the core requests data from the Data Input channel and none is available
            .event_data_out_channel_halt(ifft_event_data_out_channel_halt)//Asserted when the core tries to write data to the Data Output channel and it is unable to do so
        );
    
        //将FFT/IFFT处理完的信号传出(虚部/实部分别传出)
        assign fft_real = fft_m_data_tdata[7:0];
        assign fft_imag = fft_m_data_tdata[15:8];
        assign ifft_real = ifft_m_data_tdata[7:0];
        assign ifft_imag = ifft_m_data_tdata[15:8];
    
    endmodule
    

    2.仿真文件fft_tb.v

    与上面步骤类似,不过在下面该步骤时,选择Add or create simulation sources
    在这里插入图片描述
    代码如下:

    `timescale 1ns / 1ps
    
    module fft_tb(
    
        );
        reg aclk,aresetn;
        wire [7:0] fft_real,fft_imag;
        wire [7:0] ifft_real,ifft_imag;
    
        fft fft_test(      
            .aclk(aclk),
            .aresetn(aresetn),
            .fft_real(fft_real),
            .fft_imag(fft_imag),
            .ifft_real(ifft_real),
            .ifft_imag(ifft_imag)
        );
    
        initial
        begin
            aclk = 0;
            aresetn = 0;//低有效
            #30 aresetn = 1;
        end
    
        always #5 aclk=~aclk;//时钟频率100MHz
    endmodule
    

    四、运行仿真

    1. 运行仿真设置

    在运行仿真之前需要设置仿真时间,在下图SIMULATION处右击,进入Simulation Settings
    在这里插入图片描述
    设置仿真时间为300us,点击OK即可完成设置
    在这里插入图片描述
    接下来就是进行仿真,点击Run Simulation,然后点击Run Behavioral Simulation,即可开始仿真,等待一段时间。
    在这里插入图片描述

    2. 仿真波形设置

    仿真之后只会显示仿真文件中的信号,结果分析需要查看内部模块的信号。在下图中,单击fft_test即可看到内部信号,将未显示的信号选中右击,选择Add to Wave Window,这些信号即可添加进仿真波形图中。
    在这里插入图片描述
    添加完成后,再次进行仿真。

    找到dds_m_data_tdata,fft_m_data_tdata,ifft_m_data_tdata信号,分别进行如下设置。
    选中信号,右击,找到Waveform Style,选择Analog。
    在这里插入图片描述
    选中信号,右击,找到Radix,选择Signed decimal。
    在这里插入图片描述

    3. 结果分析

    DDS产生波形,周期为100ns,即频率为10MHz。复位信号至少拉低两个时钟周期。
    在这里插入图片描述
    下图可以看到FFT输出的模拟波形尖峰处对应的index为409;那么对应的频率应该是409*100e6/4096 = 9.985e6,约为10MHz;其中100e6是采样频率为100MHz,4096是FFT点数。
    在这里插入图片描述
    可以看到下图IFFT输出的波形,可以看出图中波形周期为100ns,即频率为10MHz。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • FFT和IFFT的MATLAB实现代码

    热门讨论 2013-06-01 15:23:11
    快速傅里叶变换(FFT)和IFFT的MATLAB实现代码,编成了MATLAB函数形式,可以直接进行调用。便于大家学习研究。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,309
精华内容 3,723
关键字:

ifft

友情链接: HanDict.rar