時域抽取基-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 ...