博文來源:https://ww2.mathworks.cn/help/matlab/ref/fft.html?searchHighlight=fft&s_tid=doc_srchtitle
視訊來源很好的解釋了:
1 .傅裡葉變換過程,經過傅裡葉變化得到了,頻率w,振幅a0,相位角φ;
2. 傅裡葉變換 主要應用領域: 聲音, 圖像處理;
博文則很好的解釋了:
1. 傅裡葉變換在matlab軟體中怎樣應用
2.. 傅裡葉變換的作用效果的展示,從時域到頻域的變化,時域難以解決的問題到頻域中卻很清晰。
說明
Y = fft(X) 用快速傅裡葉變換 (FFT) 算法計算 X 的離散傅裡葉變換 (DFT)。
如果 X 是向量,則 fft(X) 傳回該向量的傅裡葉變換。
如果 X 是矩陣,則 fft(X) 将 X 的各列視為向量,并傳回每列的傅裡葉變換。
如果 X 是一個多元數組,則 fft(X) 将沿大小不等于 1 的第一個數組次元的值視為向量,并傳回每個向量的傅裡葉變換。
Y = fft(X,n) 傳回 n 點 DFT。如果未指定任何值,則 Y 的大小與 X 相同。
如果 X 是向量且 X 的長度小于 n,則為 X 補上尾零以達到長度 n。
如果 X 是向量且 X 的長度大于 n,則對 X 進行截斷以達到長度 n。
如果 X 是矩陣,則每列的處理與在向量情況下相同。
如果 X 為多元數組,則大小不等于 1 的第一個數組次元的處理與在向量情況下相同。
Y = fft(X,n,dim) 傳回沿次元 dim 的傅裡葉變換。例如,如果 X 是矩陣,則 fft(X,n,2) 傳回每行的 n 點傅裡葉變換。
示例
噪聲信号
使用傅裡葉變換求噪聲中隐藏的信号的頻率分量。
指定信号的參數,采樣頻率為 1 kHz,信号持續時間為 1.5 秒。
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 1500; % Length of signal
t = (0:L-1)*T; % Time vector
構造一個信号,其中包含幅值為 0.7 的 50 Hz 正弦量和幅值為 1 的 120 Hz 正弦量。
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
用均值為零、方差為 4 的白噪聲擾亂該信号。
X = S + 2*randn(size(t));
在時域中繪制噪聲信号。通過檢視信号 X(t) 很難确定頻率分量。
plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')

計算信号的傅裡葉變換。
Y = fft(X);
計算雙側頻譜 P2。然後基于 P2 和偶數信号長度 L 計算單側頻譜 P1。
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
定義頻域 f 并繪制單側幅值頻譜 P1。與預期相符,由于增加了噪聲,幅值并不精确等于 0.7 和 1。一般情況下,較長的信号會産生更好的頻率近似值。
f = Fs*(0:(L/2))/L;
plot(f,P1)
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
現在,采用原始的、未破壞信号的傅裡葉變換并檢索精确幅值 0.7 和 1.0。
Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);
plot(f,P1)
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')
高斯脈沖
将高斯脈沖從時域轉換為頻域。
定義信号參數和高斯脈沖 X。
Fs = 100; % Sampling frequency
t = -0.5:1/Fs:0.5; % Time vector
L = length(t); % Signal length
X = 1/(4*sqrt(2*pi*0.01))*(exp(-t.^2/(2*0.01)));
在時域中繪制脈沖。
plot(t,X)
title('Gaussian Pulse in Time Domain')
xlabel('Time (t)')
ylabel('X(t)')
要使用 fft 将信号轉換為頻域,首先從原始信号長度确定是下一個 2 次幂的新輸入長度。這将用尾随零填充信号 X 以改善 fft 的性能。
n = 2^nextpow2(L);
将高斯脈沖轉換為頻域。
Y = fft(X,n);
定義頻域并繪制唯一頻率。
f = Fs*(0:(n/2))/n;
P = abs(Y/n);
plot(f,P(1:n/2+1))
title('Gaussian Pulse in Frequency Domain')
xlabel('Frequency (f)')
ylabel('|P(f)|')
餘弦波
比較時域和頻域中的餘弦波。
指定信号的參數,采樣頻率為 1kHz,信号持續時間為 1 秒。
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
建立一個矩陣,其中每一行代表一個頻率經過縮放的餘弦波。結果 X 為 3×1000 矩陣。第一行的波頻為 50,第二行的波頻為 150,第三行的波頻為 300。
x1 = cos(2*pi*50*t); % First row wave
x2 = cos(2*pi*150*t); % Second row wave
x3 = cos(2*pi*300*t); % Third row wave
X = [x1; x2; x3];
在單個圖窗中按順序繪制 X 的每行的前 100 個項,并比較其頻率。
for i = 1:3
subplot(3,1,i)
plot(t(1:100),X(i,1:100))
title(['Row ',num2str(i),' in the Time Domain'])
end
出于算法性能的考慮,fft 允許您用尾随零填充輸入。在這種情況下,用零填充 X 的每一行,以使每行的長度為比目前長度大的下一個最小的 2 的次幂值。使用 nextpow2 函數定義新長度。
n = 2^nextpow2(L);
指定 dim 參數沿 X 的行(即對每個信号)使用 fft。
dim = 2;
計算信号的傅裡葉變換。
Y = fft(X,n,dim);
計算每個信号的雙側頻譜和單側頻譜。
P2 = abs(Y/L);
P1 = P2(:,1:n/2+1);
P1(:,2:end-1) = 2*P1(:,2:end-1);
在頻域内,為單個圖窗中的每一行繪制單側幅值頻譜。
for i=1:3
subplot(3,1,i)
plot(0:(Fs/n):(Fs/2-Fs/n),P1(i,1:n/2))
title(['Row ',num2str(i),' in the Frequency Domain'])
end
輸入參數
X - 輸入數組 向量 | 矩陣 | 多元數組
輸入數組,指定為向量、矩陣或多元數組。
如果 X 為 0×0 空矩陣,則 fft(X) 傳回一個 0×0 空矩陣。
資料類型:double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical 複數支援:是
n - 變換長度 [] (預設) | 非負整數标量
變換長度,指定為 [] 或非負整數标量。為變換長度指定正整數标量可以提高 fft 的性能。通常,長度指定為 2 的幂或可分解為小質數的乘積的值。如果 n 小于信号的長度,則 fft 忽略第 n 個條目之後的剩餘信号值,并傳回截斷的結果。如果 n 為 0,則 fft 傳回空矩陣。
示例:n = 2^nextpow2(size(X,1))
資料類型:double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
dim - 沿其運算的次元 正整數标量
沿其運算的次元,指定為正整數标量。如果未指定值,則預設值是大小不等于 1 的第一個數組次元。
fft(X,[],1) 沿 X 的各列進行運算,并傳回每列的傅裡葉變換。
fft(X,[],2) 沿 X 的各行進行運算,并傳回每行的傅裡葉變換。
如果 dim 大于 ndims(X),則 fft(X,[],dim) 傳回 X。當指定 n 時,fft(X,n,dim) 将對 X 進行填充或截斷,以使次元 dim 的長度為 n。
資料類型:double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
輸出參數
Y - 頻域表示 向量 | 矩陣 | 多元數組
頻域表示,以向量、矩陣或多元數組形式傳回。
如果 X 的類型為 single,則 fft 本身以單精度進行計算,Y 的類型也是 single。否則,Y 以 double 類型傳回。
Y 的大小如下:
對于 Y = fft(X) 或 Y = fft(X,[],dim),Y 的大小等于 X 的大小。
對于 Y = fft(X,n,dim),size(Y,dim) 的值等于 n,而所有其他次元的大小保持與在 X 中相同。
如果 X 為實數,則 Y 是共轭對稱的,且 Y 中特征點的數量為 ceil((n+1)/2)。
資料類型:double | single
詳細資訊
向量的離散傅裡葉變換
Y = fft(X) 和 X = ifft(Y) 分别實作傅裡葉變換和逆傅裡葉變換。對于長度 n 的 X 和 Y,這些變換定義如下:
Y(k)=nj=1X(j)W(j−1)(k−1)nX(j)=1nnk=1Y(k)Wn−(j−1)(k−1),
其中
Wn=e(−2πi)/n
為 n 次機關根之一。
提示
fft 的執行時間取決于變換的長度。僅具有小質因數的變換長度的 fft 執行時間明顯快于本身是質數或具有較大質因數的變換長度的 fft 執行時間。
對于大多數 n 值,實數輸入的 DFT 需要的計算時間大緻是複數輸入的 DFT 計算時間的一半。但是,當 n 有較大的質因數時,速度很少有差别或沒有差别。
使用工具函數 fftw 可能會提高 fft 的速度。此函數控制用于計算特殊大小和次元的 FFT 算法優化。
算法
FFT 函數(fft、fft2、fftn、ifft、ifft2、ifftn)基于一個稱為 FFTW [1] [2] 的庫。
參考
[2] Frigo, M., and S. G. Johnson. “FFTW: An Adaptive Software Architecture for the FFT.” Proceedings of the International Conference on Acoustics, Speech, and Signal Processing. Vol. 3, 1998, pp. 1381-1384.
擴充功能
C/C++ 代碼生成 使用 MATLAB® Coder™ 生成 C 代碼和 C++ 代碼。
用法說明和限制:
對于 MEX 輸出,MATLAB® Coder™ 使用 MATLAB 用于 FFT 算法的庫。對于獨立的 C/C++ 代碼,預設情況下,代碼生成器生成用于 FFT 算法的代碼,而不是生成 FFT 庫調用。要生成對安裝的特定 FFTW 庫的調用,請提供
對于 MATLAB Function 子產品的仿真,仿真軟體使用 MATLAB 用于 FFT 算法的庫。對于 C/C++ 代碼生成,預設情況下,代碼生成器生成用于 FFT 算法的代碼,而不是生成 FFT 庫調用。要生成對安裝的特定 FFTW 庫的調用,請提供
GPU 數組 通過使用 Parallel Computing Toolbox™ 在圖形處理單元 (GPU) 上運作來加快代碼執行。
用法說明和限制:
即使所有虛部都為零,輸出 Y 也始終為複數。
有關詳細資訊,請參閱Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
分布式數組 使用 Parallel Computing Toolbox™ 在群集的組合記憶體中對大型數組進行分區。
用法說明和限制:
對于分布式數組,fft 不使用并行 FFT 算法,而是在單個工作程序上收集向量以執行質數長度 FFT。對于質數長度較大的向量 FFT,可能導緻記憶體不足錯誤。
在 R2006a 之前推出