前言

本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP的好,

还是老实调IP吧,了解内部机理即可,无需重复发明轮子。

参考

https://wenku.baidu.com/view/6f5862997c1cfad6185fa725.html

https://blog.csdn.net/shengzhadon/article/details/46737517

流程

FFT能做什么在此就不赘述了,只了解数据的运算流程。

1.FFT的基本公式:

第一眼看这个公式,肯定是脑袋瞬间宕机。

2.旋转因子:记住旋转因子具有可约性,对称性,周期性。

表示方法有两种,通过欧拉公式转换,本质上是一致的。

Wn=exp(-j*2*k*pi/N) ,N表示FFT点数,k表示第几个旋转因子。

Wn = cos(2*pi*k/N) - i*sin(2*pi*k/N)

第二次脑袋瞬间宕机。

3.蝶形图:

好在数学家为了普通人类能理解公式,绘制了帅气的蝴蝶漫画图,8点FFT的如下:

不直观,添加几条辅助线再看:可以看到分为三级蝶形运算。

比如第一级的蝶形运算结果:x0’=x[0]+x[4]*w0,x1’=x[0]-x[4]*w0。其他节点以此类推。

注意-1的位置和旋转因子的位置。注意数据和旋转因子都是复数,这就是说蝶形图中的乘法和加减都是复数运算。

而所谓代码实现,不管什么代码,本质上就是对各级的公式进行实现,从而得到结果。

觉得讲得不清楚,那么看下图更直观:当然图中少标识了-1。

4.数据输入倒序:

从上图左侧可以看到,序列按照了一定的规则进行了倒序,如果按照顺序进行数据输入,肯定是不正确的。十进制可能看不出来,但使其转换为二进制表示就可以知道:

5.Matlab验证算法:

到这一步,就可以把蝶形结构用matlab语言描述出来了。蝶形因子进行了2^16次放大,数据经过了两级放大,结果需除去放大因子。

x序列为fs=500hz采样下的125hz且有直流分量的8点采样信号。

clc;
clear all;
close all;
%放大了2^16次的系数
w0 = ;
w1 = - *i;
w2 = -*i;
w3 = - - *i;
% w0 = ;
% w1 = 0.7071 - 0.7071*1i;
% w2 = -1i;
% w3 = -0.7071 - 0.7071*1i;
x = [,,,-,,,,-];
%%第一级蝶形运算,没有放大
x1()=x()+x();
x1()=x()-x();
x1()=x()+x();
x1()=x()-x();
x1()=x()+x();
x1()=x()-x();
x1()=x()+x();
x1()=x()-x();
%%第二级蝶形运算放大了65536,因为系数放大了2^,其他部分应当相应的放大
x2()=x1()*+x1()*;
x2()=x1()*+x1()*(w2);
x2()=x1()*-x1()*;
x2()=x1()*-x1()*(w2);
x2()=x1()*+x1()*;
x2()=x1()*+x1()*(w2);
x2()=x1()*-x1()*;
x2()=x1()*-x1()*(w2);
%%第三级蝶形运算放大了65536,因为系数放大了2^,其他部分相应的进行放大
y()=x2()*+x2()*;
y()=x2()*+x2()*(w1);
y()=x2()*+x2()*(w2);
y()=x2()*+x2()*(w3);
y()=x2()*-x2()*;
y()=x2()*-x2()*(w1);
y()=x2()*-x2()*(w2);
y()=x2()*-x2()*(w3);
% plot(abs(y/(^))-abs(fft(x)))
figure;
plot(x);
title('x value');
figure;
plot(abs(y/(^)));
title('旋转因子放大取整计算结果');
figure;
plot(abs(fft(x)));
title('matlab自带fft函数计算结果');

6.查看一下劳动成果:可以看到matlab自带的FFT和手动蝶形算出的FFT结果是一致的。

7.转成verilog描述,无非就是对各级的蝶形公式进行相关的实现。

注意:(1)乘法和加减法为复数运算。

(2)各级位宽需要注意,避免溢出。

看到蝶形图及相关公式,可以看到还是有点算法复杂度的。

虽然可以手敲实现,但FPGA厂商已经提供了足够好用的FFT IP core,资源量和计算延迟都很nice,

所以还是老实用IP吧。哈哈

8.FFT的一些性质:

(1)采样速率和点数的关系:

频谱分辨率△f=fs/N。点数和采样速率共同决定了FFT的频谱分辨率。

某一个点的频率关系:f=k*fs/N。注意FFT计算结果的第一点为直流分量。

(2)栅栏效应及补零处理:

频谱分辨率决定了透过栅栏窗子看真实频谱的真实度。补零可使得离散谱外观更加平滑,同时增长序列长度。

(3)FFT变换后的频域模幅度对应关系:

FFT计算出的第0个点为直流分量,其模值为直流分量的N倍。其余位置求得的模值需要除以N/2,才为真实的模值。

第0点:模值/N

其他频率点:模值/(N/2)

(4)频域幅度及相位计算:

某点(im,re)的幅度信息为:sqrt(im^2+re^2),即实部平方加虚部平方开根号。

相位为:atan(im/re),反三角算即可,即为本频谱时域的初相。

以上。

基2时抽8点FFT的matlab实现流程及FFT的内部机理的更多相关文章

  1. Matlab计算的FFT与通过Origin计算的FFT

    实验的过程中,经常需要对所采集的数据进行频谱分析,软件的选择对计算速度影响挺大的.我在实验过程中,通常使用Origin7.5来进行快速傅里叶变换,因为方便快捷,计算之后,绘出来的图也容易编辑.但是当数 ...

  2. 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]

    全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...

  3. Matlab周期图法使用FFT实现

    参考文章:http://www.cnblogs.com/adgk07/p/9314892.html 首先根据他这个代码和我之前手上已经拥有的那个代码,编写了一个适合自己的代码. 首先模仿他的代码,测试 ...

  4. FFT教你做乘法(FFT傅里叶变换)

    题目来源:https://biancheng.love/contest/41/problem/C/index FFT教你做乘法 题目描述 给定两个8进制正整数A和B(A和B均小于10000位),请利用 ...

  5. 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

    一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...

  6. 对AM信号FFT的matlab仿真

    普通调幅波AM的频谱,大信号包络检波频谱分析 u(t)=Ucm(1+macos t)cos ct ma称为调幅系数 它的频谱由载波,上下边频组成 , 包络检波中二极管截去负半周再用电容低通滤波,可 ...

  7. 【Matlab】快速傅里叶变换/ FFT/ fftshift/ fftshift(fft(fftshift(s)))

    [自我理解] fft:可以指定点数的快速傅里叶变换 fftshift:将零频点移到频谱的中间 用法: Y=fftshift(X) Y=fftshift(X,dim) 描述:fftshift移动零频点到 ...

  8. 将caffe训练时loss的变化曲线用matlab绘制出来

    1. 首先是提取 训练日志文件; 2. 然后是matlab代码: clear all; close all; clc; log_file = '/home/wangxiao/Downloads/43_ ...

  9. 几种快速傅里叶变换(FFT)的C++实现

    链接:http://blog.csdn.net/zwlforever/archive/2008/03/14/2183049.aspx一篇不错的FFT 文章,收藏一下. DFT的的正变换和反变换分别为( ...

随机推荐

  1. Mysql常见索引介绍

    索引是一种特殊的文件,包含了对数据表中所有记录的引用指针.InnoDB引擎的数据库,其上的索引是表空间的一个组成部分. (1).索引的优缺点 优点:加快搜索速度,减少查询时间 缺点:索引是以文件的形式 ...

  2. 123457123456#0#-----com.twoapp.TruckCarRun01--前拼后广--大卡车游戏jiemei

    com.twoapp.TruckCarRun01--前拼后广--大卡车游戏jiemei

  3. Go 自定义包引入报错

    配置文件 GO111MODULE=on 设置为on时,go命令行会使用modules,而一点也不会去GOPATH目录下查找.但自定义包在 $GOPATH/github.com/winyh/strrev ...

  4. spring security4.1.3配置以及踩过的坑

    https://blog.csdn.net/honghailiang888/article/details/53520557 spring security完全可以作为一个专门的专题来说,有一个专题写 ...

  5. fetch jsonp请求接口

    function loadTbbRec() { var fetchJsonp = require('fetch-jsonp'); fetchJsonp(ext.info.tbbRecUrl, { he ...

  6. iOS-登录加密也许用到,反转字符串

    - (NSString *)stringByReversed{//    NSMutableString *s = [NSMutableString string];//    for (NSUInt ...

  7. SMOS数据产品介绍与下载方法

    1. SMOS数据介绍 The Soil Moisture and Ocean Salinity (SMOS) 卫星是欧空局发射的一颗以探测地球土壤水含量以及海表盐度为目标的卫星,卫星所搭载的唯一载荷 ...

  8. 【VS开发】【数据库开发】libevent windows下基于VS2010的编译

    libevent是一个常用的网络库,下面就看看在windows下面编译测试的过程吧. 一 环境 系统:win8.1编译器:VS2013官方下载地址:http://libevent.org/版本:2.0 ...

  9. 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验四 《Android程序设计》 实验报告

    实验四 Android程序设计 实验要求 参考Android开发简易教程 完成云班课中的检查点,也可以先完成实验报告,直接提交.注意不能只有截图,要有知识点,原理,遇到的问题和解决过程等说明.实验报告 ...

  10. canvas与svg的区别

    1.历史: canvas是html5提供的新元素. 而svg存在的历史要比canvas久远,已经有十几年了.svg并不是html5专有的标签,最初svg是用xml技术(超文本扩展语言,可以自定义标签或 ...