傅里叶变换函数FFT的使用方法
原文鏈接:https://blog.csdn.net/defu123sss/article/details/80457699
點(diǎn)擊查看更多通信知識(shí)點(diǎn)擊此處
快速傅里葉變換(Fast Fourier transform,FFT)
利用離散傅里葉變換(DTF)算法進(jìn)行運(yùn)算時(shí),復(fù)數(shù)乘法運(yùn)行次,復(fù)數(shù)加法運(yùn)行次,計(jì)算量其實(shí)可以通過(guò)fft減小。1965年,首先由Cooley-Tukey提出了基-2FFT算法,對(duì)DFT的發(fā)展起到了極大推進(jìn)作用。隨后又出現(xiàn)了混合基算法。fft 是一種計(jì)算DTF的快速算法,利用因子的周期性、共軛對(duì)稱性、可約性。
?
1、fft算法主要有以下3種
時(shí)域抽取基-2FFT算法(Decimation -In- Time,DIT-FFT)
頻域抽取基-2FFT算法(Decimation-In-Freqency,DIF-FFT)
序列長(zhǎng)度N可表示為合數(shù)的FFT 算法(混合基)
?
2、fft函數(shù)
(matlab說(shuō)明文檔:https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=fft&s_tid=doc_srchtitle)
?
2.1 Y = fft(X) ——用快速傅里葉變換 (FFT) 算法計(jì)算 X 的離散傅里葉變換 (DFT)。
如果 X 是向量,則 fft(X) 返回該向量的傅里葉變換。
如果 X 是矩陣,則 fft(X) 將 X 的各列視為向量,并返回每列的傅里葉變換。
如果 X 是一個(gè)多維數(shù)組,則 fft(X) 將沿大小不等于 1 的第一個(gè)數(shù)組維度的值視為向量,并返回每個(gè)向量的傅里葉變換。
?
2.2 Y = fft(X,n) ——返回 n 點(diǎn) DFT。如果未指定任何值,則 Y 的大小與 X 相同。
如果 X 是向量且 X 的長(zhǎng)度小于 n,則為 X 補(bǔ)上尾零以達(dá)到長(zhǎng)度 n。
如果 X 是向量且 X 的長(zhǎng)度大于 n,則對(duì) X 進(jìn)行截?cái)嘁赃_(dá)到長(zhǎng)度 n。
如果 X 是矩陣,則每列的處理與在向量情況下相同。
如果 X 為多維數(shù)組,則大小不等于 1 的第一個(gè)數(shù)組維度的處理與在向量情況下相同。
?
2.3 Y = fft(X,n,dim) ——返回沿維度 dim 的傅里葉變換。
如果 X 是矩陣,則 fft(X,n,2) 返回每行的 n 點(diǎn)傅里葉變換。
?
具體的示例都在官方文檔中,這里說(shuō)說(shuō)fft函數(shù)的特點(diǎn):
1.? 函數(shù)fft返回值的數(shù)據(jù)結(jié)構(gòu)具有對(duì)稱性
根據(jù)采樣定理,fft能分辨的最高頻率為采樣頻率的一半(即Nyquist頻率),函數(shù)fft返回值是以Nyqusit頻率為軸對(duì)稱的,Y的前一半與后一半是復(fù)數(shù)共軛關(guān)系,信息其實(shí)是重復(fù)的。所以,如果進(jìn)行N點(diǎn)的fft,實(shí)際上有用的點(diǎn)數(shù)為n+1點(diǎn)(N為奇數(shù)或者偶數(shù)的情況下有用的點(diǎn)數(shù)均相同)。
Fn = (n-1)* Fs /N
Fn是第n點(diǎn)所表示的真實(shí)頻率值。當(dāng)然,n只取前一半的點(diǎn)就足夠了。這樣,可以達(dá)到的頻率分辨率即為Fs/N。
2.? 幅值
作FFT分析時(shí),幅值大小與輸入點(diǎn)數(shù)有關(guān),要得到真實(shí)的幅值大小,需要將變換后的結(jié)果除以N。且由于零頻在雙邊譜中本沒(méi)有被一分為二,所以對(duì)于零頻外的點(diǎn)還有乘以2,得到的才是真實(shí)的頻率幅值。
3.? 基頻
?若分析數(shù)據(jù)時(shí)長(zhǎng)為T(mén),則分析結(jié)果的基頻就是f0=1/T,分析結(jié)果的頻率序列為[0:N-1]*f0
4.? 執(zhí)行N點(diǎn)FFT
在調(diào)用格式 2.2 中,函數(shù)執(zhí)行N點(diǎn)FFT。若y為向量且長(zhǎng)度小于N,則函數(shù)將y補(bǔ)零至長(zhǎng)度N,若向量y的長(zhǎng)度大于N,則函數(shù)截?cái)鄖使之長(zhǎng)度為N。由于fft算法的本質(zhì),對(duì)于N的選取一般為大于序列長(zhǎng)度點(diǎn)數(shù)的最小2的冪次方,這樣能改善 fft 的計(jì)算性能。
而如果未制定進(jìn)行fft的點(diǎn)數(shù)N,默認(rèn)產(chǎn)生的結(jié)果為N點(diǎn),默認(rèn)進(jìn)行的fft便是基于混合基來(lái)進(jìn)行計(jì)算的,性能當(dāng)然不會(huì)優(yōu)于基2。
3、fftshift函數(shù)
官方文檔:
https://ww2.mathworks.cn/help/matlab/ref/fftshift.html
fftshift的功能是將零頻分量移到頻譜中心。怎么理解這句話呢?fft計(jì)算得到的頻域信號(hào)的頻率區(qū)間是0~Fs(Fs是采樣頻率)的,且關(guān)于Fs/2對(duì)稱。稱0~FS為數(shù)字頻率,對(duì)應(yīng)模擬角頻。但是我們只關(guān)心區(qū)間,fftshift函數(shù)的功能就是將fft處理之后的部分搬移至,從而使零頻分量居于頻譜的中心位置。
?
Y = fftshift(X) 通過(guò)將零頻分量移動(dòng)到數(shù)組中心,重新排列傅里葉變換 X。
如果 X 是向量,則 fftshift 會(huì)將 X 的左右兩半部分進(jìn)行交換。
如果 X 是矩陣,則 fftshift 會(huì)將 X 的第一象限與第三象限交換,將第二象限與第四象限交換。
如果 X 是多維數(shù)組,則 fftshift 會(huì)沿每個(gè)維度交換 X 的半空間。
?
Y = fftshift(X,dim) 沿 X 的維度 dim 執(zhí)行運(yùn)算。例如,如果 X 是矩陣,其行表示多個(gè)一維變換,則 fftshift(X,2) 會(huì)將 X 的每一行的左右兩半部分進(jìn)行交換。
注意:fftshift 沒(méi)有fft的功能,是在 fft 之后進(jìn)行的(有需要的話)。
運(yùn)行代碼:
得到如下的結(jié)果:
?
總結(jié)
以上是生活随笔為你收集整理的傅里叶变换函数FFT的使用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苹果小圆点怎么弄出来_原来苹果手机轻点2
- 下一篇: C语言实现前部插入创建链表以及尾部插入链