基2时抽8点FFT的matlab实现流程及FFT的内部机理
时间:2023-08-17 11:07:00
前言
本来想用verilog描述FFT算法,虽然是8点FFT算法,但是写出来的资源用量及时延迟并不比调用好FFT IP的好,
还是老实调IP了解内部机制,无需重复发明轮子。
参考
流程
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%^,其他部分应相应放大
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%^,其他部分相应放大
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),反三角计算,即本频谱时域的初相。
以上。
Matlab计算的FFT与通过Origin计算的FFT
在实验过程中,采集的数据经常需要频谱分析,软件的选择对计算速度有很大的影响.我通常在实验过程中使用它Origin7.5.傅里叶快速变换,方便快捷。计算后,绘制的图片也很容易编辑.但是当数 ...
多项式函数插值:全球多项式插值(1)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]
全球多项式插值是指在整个插值区域形成多项式函数作为插值函数.关于多项插值的基本知识,见计算基本理论. 在单项式基插值和牛顿插值形成的表达式中,表达式应在某一点使用Horner嵌 ...
Matlab使用周期图法FFT实现
参考文章:http://www.cnblogs.com/adgk07/p/9314892.html 首先,根据他的代码和我以前拥有的代码,我写了一个适合我的代码. 首先,模仿他的代码并测试它 ...
FFT教你做乘法(FFT傅里叶变换)
题目来源:https://biancheng.love/contest/41/problem/C/index FFT教你做乘法 题目描述 给定两个8B(A请使用B不到1万) ...
对AM信号FFT的matlab仿真
普通调幅波AM大信号包络检波频谱分析 u(t)=Ucm(1 macos ?t)cos ?ct ma称为调幅系数 其频谱由载波和上下边频组成 , 包络检波中的二极管切断负半周,然后使用电容器低通滤波器 ...
将caffe训练时loss用于变化曲线matlab绘制出来
1. 首先是提取 训练日志文件; 2. 然后是matlab代码: clear all; close all; clc; log_file = '/home/wangxiao/Downloads/43_ ...
几种快速傅里叶变换(FFT)的C++实现
链接:http://blog.csdn.net/zwlforever/archive/2008/03/14/2183049.aspx一篇不错的FFT 收集文章.DFT正变换和反变换分别为( ...
Xilinx FFT IP v9.0 使用(一)
reference:https://blog.csdn.net/shichaog/article/details/51189711 https://blog.csdn.net/qq_36375505/ ...
随推荐
webpack练手项目之easySlide(一):初探webpack (转)
最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力. webpack是一个前端的打包管理工具,大家可以前往:http:/ ...
IE 下JS和CSS 阻塞后面内容总结
总结: 1. CSS 都是可以并行下载的. 2. IE6 和 IE7 JS 不能并行下载,CSS 和 JS 阻塞后面内容下载. 3. IE8 JS 还是会阻塞图片下载 开始改变加载模式, ...
Bootstrap的学习以及简单运用
柠檬学院How a non-windowed component can receive messages from Windows -- AllocateHWnd
http://www.delphidabbler.com/articles?article=1 Why do it? Sometimes we need a non-windowed componen ...
Linux性能监控分析命令
vmstat sar iostat top free uptime netstat ps strace lsof
iOS GCD 与 NSOperationQueue
NSOperationQueue ios NSOperation vs. GCD StackOverflow: NSOperation vs. Grand Central Dispatch Blog: ...
关于Servlet会话跟踪的那些事儿
关于servlet会话跟踪,一搜都能搜出很多.我也不免落入俗套,也总结了一把.希望我所总结的知识尽量是知识海洋里的一汪清泉.能帮助到我自己和哪怕一个人,那也是值得的. 故事由来: 我们知道,http协 ...
find grep
grep grep -rn "hello,world!" * #递归查找当前目录下所有包含hello,world的文件 grep -C number pattern files : ...
java的JCombobox实现中国省市区三级联动
源代码下载:点击下载源代码 用xml存储中国各大城市的数据. xml数据太多了就不贴上了,贴个图片: 要解释xml,添加了一个jdom.jar,上面的源代码下载里面有. 解释xml的类: packag ...
Mac 系统下创建可双击执行文件,cd到执行文件当前目录
在mac下之前我一直用.sh文件,但是要去终端里才能执行,后来得知可以写.command文件,双击及可执行,很方便,特此记录 #!/bin/bash basepath=$(cd `dirname $0 ...