基2FFT算法matlab程序编写,基2时抽8点FFT的matlab实现流程及FFT的内部机理
前言
本來想用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,因為系數放大了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),反三角算即可,即為本頻譜時域的初相。
以上。
Matlab計算的FFT與通過Origin計算的FFT
實驗的過程中,經常需要對所采集的數據進行頻譜分析,軟件的選擇對計算速度影響挺大的.我在實驗過程中,通常使用Origin7.5來進行快速傅里葉變換,因為方便快捷,計算之后,繪出來的圖也容易編輯.但是當數 ...
多項式函數插值:全域多項式插值(一)單項式基插值、拉格朗日插值、牛頓插值 [MATLAB]
全域多項式插值指的是在整個插值區域內形成一個多項式函數作為插值函數.關于多項式插值的基本知識,見“計算基本理論”. 在單項式基插值和牛頓插值形成的表達式中,求該表達式在某一點處的值使用的Horner嵌 ...
Matlab周期圖法使用FFT實現
參考文章:http://www.cnblogs.com/adgk07/p/9314892.html 首先根據他這個代碼和我之前手上已經擁有的那個代碼,編寫了一個適合自己的代碼. 首先模仿他的代碼,測試 ...
FFT教你做乘法(FFT傅里葉變換)
題目來源:https://biancheng.love/contest/41/problem/C/index FFT教你做乘法 題目描述 給定兩個8進制正整數A和B(A和B均小于10000位),請利用 ...
對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 ...
總結
以上是生活随笔為你收集整理的基2FFT算法matlab程序编写,基2时抽8点FFT的matlab实现流程及FFT的内部机理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python获取淘宝服务器的毫秒级时间
- 下一篇: [vue] 分析下vue项目本地开发完成