日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

傅里叶变换函数FFT的使用方法

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 傅里叶变换函数FFT的使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:https://blog.csdn.net/defu123sss/article/details/80457699

點擊查看更多通信知識點擊此處

快速傅里葉變換(Fast Fourier transform,FFT)

利用離散傅里葉變換(DTF)算法進行運算時,復數乘法運行次,復數加法運行次,計算量其實可以通過fft減小。1965年,首先由Cooley-Tukey提出了基-2FFT算法,對DFT的發展起到了極大推進作用。隨后又出現了混合基算法。fft 是一種計算DTF的快速算法,利用因子的周期性、共軛對稱性、可約性。

?

1、fft算法主要有以下3種

時域抽取基-2FFT算法(Decimation -In- Time,DIT-FFT)

頻域抽取基-2FFT算法(Decimation-In-Freqency,DIF-FFT)

序列長度N可表示為合數的FFT 算法(混合基)

?

2、fft函數

(matlab說明文檔:https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=fft&s_tid=doc_srchtitle)

  • Y = fft(X)
  • Y = fft(X,n)
  • Y = fft(X,n,dim)
  • ?

    2.1 Y = fft(X) ——用快速傅里葉變換 (FFT) 算法計算 X 的離散傅里葉變換 (DFT)。

    如果 X 是向量,則 fft(X) 返回該向量的傅里葉變換。

    如果 X 是矩陣,則 fft(X) 將 X 的各列視為向量,并返回每列的傅里葉變換。

    如果 X 是一個多維數組,則 fft(X) 將沿大小不等于 1 的第一個數組維度的值視為向量,并返回每個向量的傅里葉變換。

    ?

    2.2 Y = fft(X,n) ——返回 n 點 DFT。如果未指定任何值,則 Y 的大小與 X 相同。

    如果 X 是向量且 X 的長度小于 n,則為 X 補上尾零以達到長度 n。

    如果 X 是向量且 X 的長度大于 n,則對 X 進行截斷以達到長度 n。

    如果 X 是矩陣,則每列的處理與在向量情況下相同。

    如果 X 為多維數組,則大小不等于 1 的第一個數組維度的處理與在向量情況下相同。

    ?

    2.3 Y = fft(X,n,dim) ——返回沿維度 dim 的傅里葉變換。

    如果 X 是矩陣,則 fft(X,n,2) 返回每行的 n 點傅里葉變換。

    ?

    具體的示例都在官方文檔中,這里說說fft函數的特點:

    1.? 函數fft返回值的數據結構具有對稱性

    根據采樣定理,fft能分辨的最高頻率為采樣頻率的一半(即Nyquist頻率),函數fft返回值是以Nyqusit頻率為軸對稱的,Y的前一半與后一半是復數共軛關系,信息其實是重復的。所以,如果進行N點的fft,實際上有用的點數為n+1點(N為奇數或者偶數的情況下有用的點數均相同)。

    Fn = (n-1)* Fs /N

    Fn是第n點所表示的真實頻率值。當然,n只取前一半的點就足夠了。這樣,可以達到的頻率分辨率即為Fs/N。

    2.? 幅值

    作FFT分析時,幅值大小與輸入點數有關,要得到真實的幅值大小,需要將變換后的結果除以N。且由于零頻在雙邊譜中本沒有被一分為二,所以對于零頻外的點還有乘以2,得到的才是真實的頻率幅值。

  • Y = fft(X); % X為信號
  • P2 = abs(Y/L); % 計算雙側頻譜 P2
  • P1 = L*P2(1:L/2+1); % 將P2的前半段信號賦給P1,P1即是我們關心的部分
  • P1(2:end-1) = 2*P1(2:end-1); % 將除零頻外的信號乘以2
  • 3.? 基頻

    ?若分析數據時長為T,則分析結果的基頻就是f0=1/T,分析結果的頻率序列為[0:N-1]*f0

    4.? 執行N點FFT

    在調用格式 2.2 中,函數執行N點FFT。若y為向量且長度小于N,則函數將y補零至長度N,若向量y的長度大于N,則函數截斷y使之長度為N。由于fft算法的本質,對于N的選取一般為大于序列長度點數的最小2的冪次方,這樣能改善 fft 的計算性能。

  • N = 2^nextpow2(L); % 將高斯脈沖轉換為頻域
  • Y = fft(X,N);
  • 而如果未制定進行fft的點數N,默認產生的結果為N點,默認進行的fft便是基于混合基來進行計算的,性能當然不會優于基2。

    3、fftshift函數

    官方文檔:

    https://ww2.mathworks.cn/help/matlab/ref/fftshift.html

    fftshift的功能是將零頻分量移到頻譜中心。怎么理解這句話呢?fft計算得到的頻域信號的頻率區間是0~Fs(Fs是采樣頻率)的,且關于Fs/2對稱。稱0~FS為數字頻率,對應模擬角頻。但是我們只關心區間,fftshift函數的功能就是將fft處理之后的部分搬移至,從而使零頻分量居于頻譜的中心位置。

    ?

    Y = fftshift(X) 通過將零頻分量移動到數組中心,重新排列傅里葉變換 X。

    如果 X 是向量,則 fftshift 會將 X 的左右兩半部分進行交換。

    如果 X 是矩陣,則 fftshift 會將 X 的第一象限與第三象限交換,將第二象限與第四象限交換。

    如果 X 是多維數組,則 fftshift 會沿每個維度交換 X 的半空間。

    ?

    Y = fftshift(X,dim) 沿 X 的維度 dim 執行運算。例如,如果 X 是矩陣,其行表示多個一維變換,則 fftshift(X,2) 會將 X 的每一行的左右兩半部分進行交換。

    注意:fftshift 沒有fft的功能,是在 fft 之后進行的(有需要的話)。

    運行代碼:

  • % fftshift
  • fs = 100; % sampling frequency
  • t = 0:(1/fs):(10-1/fs); % time vector
  • S = cos(2*pi*15*t);
  • n = length(S);
  • X = fft(S);
  • f = (0:n-1)*(fs/n); %frequency range
  • power = abs(X).^2/n; %power
  • subplot(121);
  • plot(f,power)
  • xlabel('f');
  • Y = fftshift(X);
  • fshift = (-n/2:n/2-1)*(fs/n); % zero-centered frequency range
  • powershift = abs(Y).^2/n; % zero-centered power
  • subplot(122);
  • plot(fshift,powershift)
  • xlabel('f');
  • 得到如下的結果:

    ?

    總結

    以上是生活随笔為你收集整理的傅里叶变换函数FFT的使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。