基2FFT算法matlab程序编写,基2时抽8点FFT的matlab实现流程及FFT的内部机理
前言
本來想用verilog描述FFT算法,雖然是8點(diǎn)的FFT算法,但寫出來的資源用量及時(shí)延也不比調(diào)用FFT IP的好,
還是老實(shí)調(diào)IP吧,了解內(nèi)部機(jī)理即可,無需重復(fù)發(fā)明輪子。
參考
流程
FFT能做什么在此就不贅述了,只了解數(shù)據(jù)的運(yùn)算流程。
1.FFT的基本公式:
第一眼看這個(gè)公式,肯定是腦袋瞬間宕機(jī)。
2.旋轉(zhuǎn)因子:記住旋轉(zhuǎn)因子具有可約性,對(duì)稱性,周期性。
表示方法有兩種,通過歐拉公式轉(zhuǎn)換,本質(zhì)上是一致的。
Wn=exp(-j*2*k*pi/N) ,N表示FFT點(diǎn)數(shù),k表示第幾個(gè)旋轉(zhuǎn)因子。
Wn = cos(2*pi*k/N) - i*sin(2*pi*k/N)
第二次腦袋瞬間宕機(jī)。
3.蝶形圖:
好在數(shù)學(xué)家為了普通人類能理解公式,繪制了帥氣的蝴蝶漫畫圖,8點(diǎn)FFT的如下:
不直觀,添加幾條輔助線再看:可以看到分為三級(jí)蝶形運(yùn)算。
比如第一級(jí)的蝶形運(yùn)算結(jié)果:x0’=x[0]+x[4]*w0,x1’=x[0]-x[4]*w0。其他節(jié)點(diǎn)以此類推。
注意-1的位置和旋轉(zhuǎn)因子的位置。注意數(shù)據(jù)和旋轉(zhuǎn)因子都是復(fù)數(shù),這就是說蝶形圖中的乘法和加減都是復(fù)數(shù)運(yùn)算。
而所謂代碼實(shí)現(xiàn),不管什么代碼,本質(zhì)上就是對(duì)各級(jí)的公式進(jìn)行實(shí)現(xiàn),從而得到結(jié)果。
覺得講得不清楚,那么看下圖更直觀:當(dāng)然圖中少標(biāo)識(shí)了-1。
4.數(shù)據(jù)輸入倒序:
從上圖左側(cè)可以看到,序列按照了一定的規(guī)則進(jìn)行了倒序,如果按照順序進(jìn)行數(shù)據(jù)輸入,肯定是不正確的。十進(jìn)制可能看不出來,但使其轉(zhuǎn)換為二進(jìn)制表示就可以知道:
5.Matlab驗(yàn)證算法:
到這一步,就可以把蝶形結(jié)構(gòu)用matlab語言描述出來了。蝶形因子進(jìn)行了2^16次放大,數(shù)據(jù)經(jīng)過了兩級(jí)放大,結(jié)果需除去放大因子。
x序列為fs=500hz采樣下的125hz且有直流分量的8點(diǎn)采樣信號(hào)。
clc;
clear all;
close all;
%放大了2^16次的系數(shù)
w0 = ;
w1 = - *i;
w2 = -*i;
w3 = - - *i;
% w0 = ;
% w1 = 0.7071 - 0.7071*1i;
% w2 = -1i;
% w3 = -0.7071 - 0.7071*1i;
x = [,,,-,,,,-];
%%第一級(jí)蝶形運(yùn)算,沒有放大
x1()=x()+x();
x1()=x()-x();
x1()=x()+x();
x1()=x()-x();
x1()=x()+x();
x1()=x()-x();
x1()=x()+x();
x1()=x()-x();
%%第二級(jí)蝶形運(yùn)算放大了65536,因?yàn)橄禂?shù)放大了2^,其他部分應(yīng)當(dāng)相應(yīng)的放大
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);
%%第三級(jí)蝶形運(yùn)算放大了65536,因?yàn)橄禂?shù)放大了2^,其他部分相應(yīng)的進(jìn)行放大
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('旋轉(zhuǎn)因子放大取整計(jì)算結(jié)果');
figure;
plot(abs(fft(x)));
title('matlab自帶fft函數(shù)計(jì)算結(jié)果');
6.查看一下勞動(dòng)成果:可以看到matlab自帶的FFT和手動(dòng)蝶形算出的FFT結(jié)果是一致的。
7.轉(zhuǎn)成verilog描述,無非就是對(duì)各級(jí)的蝶形公式進(jìn)行相關(guān)的實(shí)現(xiàn)。
注意:(1)乘法和加減法為復(fù)數(shù)運(yùn)算。
(2)各級(jí)位寬需要注意,避免溢出。
看到蝶形圖及相關(guān)公式,可以看到還是有點(diǎn)算法復(fù)雜度的。
雖然可以手敲實(shí)現(xiàn),但FPGA廠商已經(jīng)提供了足夠好用的FFT IP core,資源量和計(jì)算延遲都很nice,
所以還是老實(shí)用IP吧。哈哈
8.FFT的一些性質(zhì):
(1)采樣速率和點(diǎn)數(shù)的關(guān)系:
頻譜分辨率△f=fs/N。點(diǎn)數(shù)和采樣速率共同決定了FFT的頻譜分辨率。
某一個(gè)點(diǎn)的頻率關(guān)系:f=k*fs/N。注意FFT計(jì)算結(jié)果的第一點(diǎn)為直流分量。
(2)柵欄效應(yīng)及補(bǔ)零處理:
頻譜分辨率決定了透過柵欄窗子看真實(shí)頻譜的真實(shí)度。補(bǔ)零可使得離散譜外觀更加平滑,同時(shí)增長(zhǎng)序列長(zhǎng)度。
(3)FFT變換后的頻域模幅度對(duì)應(yīng)關(guān)系:
FFT計(jì)算出的第0個(gè)點(diǎn)為直流分量,其模值為直流分量的N倍。其余位置求得的模值需要除以N/2,才為真實(shí)的模值。
第0點(diǎn):模值/N
其他頻率點(diǎn):模值/(N/2)
(4)頻域幅度及相位計(jì)算:
某點(diǎn)(im,re)的幅度信息為:sqrt(im^2+re^2),即實(shí)部平方加虛部平方開根號(hào)。
相位為:atan(im/re),反三角算即可,即為本頻譜時(shí)域的初相。
以上。
Matlab計(jì)算的FFT與通過Origin計(jì)算的FFT
實(shí)驗(yàn)的過程中,經(jīng)常需要對(duì)所采集的數(shù)據(jù)進(jìn)行頻譜分析,軟件的選擇對(duì)計(jì)算速度影響挺大的.我在實(shí)驗(yàn)過程中,通常使用Origin7.5來進(jìn)行快速傅里葉變換,因?yàn)榉奖憧旖?計(jì)算之后,繪出來的圖也容易編輯.但是當(dāng)數(shù) ...
多項(xiàng)式函數(shù)插值:全域多項(xiàng)式插值(一)單項(xiàng)式基插值、拉格朗日插值、牛頓插值 [MATLAB]
全域多項(xiàng)式插值指的是在整個(gè)插值區(qū)域內(nèi)形成一個(gè)多項(xiàng)式函數(shù)作為插值函數(shù).關(guān)于多項(xiàng)式插值的基本知識(shí),見“計(jì)算基本理論”. 在單項(xiàng)式基插值和牛頓插值形成的表達(dá)式中,求該表達(dá)式在某一點(diǎn)處的值使用的Horner嵌 ...
Matlab周期圖法使用FFT實(shí)現(xiàn)
參考文章:http://www.cnblogs.com/adgk07/p/9314892.html 首先根據(jù)他這個(gè)代碼和我之前手上已經(jīng)擁有的那個(gè)代碼,編寫了一個(gè)適合自己的代碼. 首先模仿他的代碼,測(cè)試 ...
FFT教你做乘法(FFT傅里葉變換)
題目來源:https://biancheng.love/contest/41/problem/C/index FFT教你做乘法 題目描述 給定兩個(gè)8進(jìn)制正整數(shù)A和B(A和B均小于10000位),請(qǐng)利用 ...
對(duì)AM信號(hào)FFT的matlab仿真
普通調(diào)幅波AM的頻譜,大信號(hào)包絡(luò)檢波頻譜分析 u(t)=Ucm(1+macos ?t)cos ?ct ma稱為調(diào)幅系數(shù) 它的頻譜由載波,上下邊頻組成 , 包絡(luò)檢波中二極管截去負(fù)半周再用電容低通濾波,可 ...
將caffe訓(xùn)練時(shí)loss的變化曲線用matlab繪制出來
1. 首先是提取 訓(xùn)練日志文件; 2. 然后是matlab代碼: clear all; close all; clc; log_file = '/home/wangxiao/Downloads/43_ ...
幾種快速傅里葉變換(FFT)的C++實(shí)現(xiàn)
鏈接:http://blog.csdn.net/zwlforever/archive/2008/03/14/2183049.aspx一篇不錯(cuò)的FFT 文章,收藏一下.?DFT的的正變換和反變換分別為( ...
Xilinx FFT IP v9.0 使用(一)
reference:https://blog.csdn.net/shichaog/article/details/51189711 https://blog.csdn.net/qq_36375505/ ...
隨機(jī)推薦
webpack練手項(xiàng)目之easySlide(一):初探webpack (轉(zhuǎn))
最近在學(xué)習(xí)webpack,正好拿了之前做的一個(gè)小組件,圖片輪播來做了下練手,讓我們一起來初步感受下webpack的神奇魅力. ????webpack是一個(gè)前端的打包管理工具,大家可以前往:http:/ ...
IE 下JS和CSS 阻塞后面內(nèi)容總結(jié)
總結(jié): 1.? CSS?都是可以并行下載的. 2.? IE6?和?IE7 ? JS?不能并行下載,CSS?和?JS?阻塞后面內(nèi)容下載. 3.? IE8 ? JS?還是會(huì)阻塞圖片下載 開始改變加載模式, ...
Bootstrap的學(xué)習(xí)以及簡(jiǎn)單運(yùn)用
檸檬學(xué)院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性能監(jiān)控分析命令
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: ...
關(guān)于Servlet會(huì)話跟蹤的那些事兒
關(guān)于servlet會(huì)話跟蹤,一搜都能搜出很多.我也不免落入俗套,也總結(jié)了一把.希望我所總結(jié)的知識(shí)盡量是知識(shí)海洋里的一汪清泉.能幫助到我自己和哪怕一個(gè)人,那也是值得的. 故事由來: 我們知道,http協(xié) ...
find grep
grep grep -rn "hello,world!" * #遞歸查找當(dāng)前目錄下所有包含hello,world的文件 grep -C number pattern files : ...
java的JCombobox實(shí)現(xiàn)中國(guó)省市區(qū)三級(jí)聯(lián)動(dòng)
源代碼下載:點(diǎn)擊下載源代碼 用xml存儲(chǔ)中國(guó)各大城市的數(shù)據(jù). xml數(shù)據(jù)太多了就不貼上了,貼個(gè)圖片: 要解釋xml,添加了一個(gè)jdom.jar,上面的源代碼下載里面有. 解釋xml的類: packag ...
Mac 系統(tǒng)下創(chuàng)建可雙擊執(zhí)行文件,cd到執(zhí)行文件當(dāng)前目錄
在mac下之前我一直用.sh文件,但是要去終端里才能執(zhí)行,后來得知可以寫.command文件,雙擊及可執(zhí)行,很方便,特此記錄 #!/bin/bash basepath=$(cd `dirname $0 ...
總結(jié)
以上是生活随笔為你收集整理的基2FFT算法matlab程序编写,基2时抽8点FFT的matlab实现流程及FFT的内部机理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python获取淘宝服务器的毫秒级时间
- 下一篇: matlab人脸追踪,求大神帮助我这个菜