Matlab中fft函式的使用與原理

2021-08-20 06:41:58 字數 2941 閱讀 1397

時域抽取基-2fft演算法(decimation -in- time,dit-fft)

頻域抽取基-2fft演算法(decimation-in-freqency,dif-fft)

序列長度n可表示為合數的fft 演算法(混合基)

(matlab說明文件:

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。

官方文件:

fftshift的功能是將零頻分量移到頻譜中心。怎麼理解這句話呢?fft計算得到的頻域訊號的頻率區間是0~fs(fs是取樣頻率)的,且關於fs/2對稱。稱0~fs為數字頻率,對應模擬角頻

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');

得到如下的結果:

MATLAB中FFT函式的意義

文章 fft是離散傅利葉變換的快速演算法,可以將乙個訊號變換到頻域。有些訊號在時域上是很難看出什麼特徵的,但是如果變換到頻域之後,就很容易看出特徵了。這就是很多訊號分析採用 fft變換的原因。另外,fft可以將乙個訊號的頻譜提取出來,這在頻譜分析方面也是經常用的。模擬訊號經過adc取樣之後變成數碼訊...

MATLAB中FFT使用方法

說明 以下資源 於 數字訊號處理的matlab實現 萬永革主編 一.呼叫方法 x fft x x fft x,n x ifft x x ifft x,n 用matlab進行譜分析時注意 1 函式fft返回值的資料結構具有對稱性。例 n 8 n 0 n 1 xn 4 3 2 6 7 8 9 0 xk ...

MATLAB中fft使用方法

說明 以下資源 於 數字訊號處理的matlab實現 萬永革主編 一.呼叫方法 x fft x x fft x,n x ifft x x ifft x,n 用matlab進行譜分析時注意 1 函式fft返回值的資料結構具有對稱性。例 n 8 n 0 n 1 xn 4 3 2 6 7 8 9 0 xk ...