傅立葉轉換 (FFT) 白話文與頻譜分析實戰

傅立葉轉換 (FFT) 白話文與頻譜分析實戰

1. 白話解析:果汁機理論 🍓🍌

想像你面前有一杯打好的「綜合果汁」(這就是時域訊號,所有東西都混在一起了)。 你喝了一口,覺得很好喝,但你不知道裡面到底加了什麼。

傅立葉轉換 (FFT) 就像是一台「逆向果汁機」。你把果汁倒進去,它會瞬間幫你分離出:

這份「食譜」就是頻譜圖 (Spectrum)! 在頻譜圖上,X 軸是水果種類 (頻率 Hz)Y 軸是水果的數量 (振幅 Amplitude)。透過 FFT,不管雜訊藏得再深,都會在頻譜圖上變成一根特別突出的長條,讓你一眼就看穿它!


2. MATLAB 頻譜分析標準 S.O.P. (超級重要 ⚠️)

在 MATLAB 中使用 fft() 函數非常簡單,但初學者 100% 會卡在「如何把 FFT 的結果轉成人類看得懂的頻譜圖」

因為 fft() 算出來的結果是包含虛數的「雙邊對稱頻譜」,我們必須經過取絕對值、正規化、切一半這三個神聖步驟,才能畫出正確的圖。請直接把下面這段當成你的萬用模板!

% 1. 建立測試訊號 (我們延續前面濾波器的例子)
fs = 1000;             % 取樣頻率 1000 Hz (一秒鐘抓 1000 個點)
t = 0 : 1/fs : 1-1/fs; % 建立 1 秒的時間軸
L = length(t);         % 訊號總長度 (總共有幾個點)

% 混合訊號:振幅為 2 的 5Hz 正弦波 + 振幅為 0.5 的 100Hz 雜訊
sig_raw = 2 * sin(2 * pi * 5 * t) + 0.5 * sin(2 * pi * 100 * t);

% --- 開始進入 FFT 照妖鏡流程 ---

% 2. 執行快速傅立葉轉換
Y = fft(sig_raw);

% 3. 正規化與單邊頻譜轉換 (魔法步驟 🪄)
% (A) 取絕對值,並除以總長度 L 來還原真實振幅
P2 = abs(Y / L);       

% (B) 因為頻譜是左右對稱的,我們只需要看正頻率 (前半段)
P1 = P2(1 : L/2+1);    

% (C) 把被切掉的後半段能量補回前半段 (除了直流成分也就是第 1 個點以外,其餘乘 2)
P1(2:end-1) = 2 * P1(2:end-1); 

% 4. 建立對應的頻率 X 軸 (從 0 Hz 到 奈奎斯特頻率 fs/2)
f = fs * (0:(L/2)) / L;

% 5. 畫出頻譜圖
figure;

% 上半部:人類看不懂的時域圖
subplot(2,1,1);
plot(t, sig_raw);
title('時域圖 (Time Domain) - 完全看不出裡面有什麼');
xlabel('時間 (秒)');
ylabel('振幅');
grid on;

% 下半部:一目瞭然的頻域圖
subplot(2,1,2);
plot(f, P1, 'LineWidth', 2, 'Color', 'r');
title('頻域圖 (Frequency Domain) - 照妖鏡現形!');
xlabel('頻率 (Hz)');
ylabel('振幅 (Amplitude)');
xlim([0 150]); % 為了看清楚,我們只顯示 0 到 150 Hz 的區間
grid on;

3. 圖表解讀與實戰意義

當你執行上面這段程式碼後,看著下半部的紅線圖,你會發現兩件非常神奇的事情:

  1. 精準定位: 在 X 軸的 5 Hz100 Hz 的地方,直直地插著兩根像電線桿一樣的線。這就代表 FFT 成功抓出了這兩個隱藏的頻率!
  2. 還原振幅: 你去看這兩根電線桿的高度 (Y 軸),5 Hz 的高度剛好是 2,100 Hz 的高度剛好是 0.5。這完美對應了我們當初建立訊號時設定的倍數!

工程應用: 實務上,如果你測量一台馬達的震動,然後把訊號丟進這個 FFT 模板。如果你發現在 60 Hz 的地方有一根超高的長條,你立刻就能跟老闆報告:「老闆,我們的系統被台灣的市電 (60Hz) 干擾了!」;然後你就可以回去翻前面的筆記,用一個 60Hz 的帶阻濾波器 (Band-stop Filter) 把它精準幹掉!


Revision #2
Created 2026-04-01 02:06:32 UTC by TaipeiTechRacing
Updated 2026-04-11 14:33:46 UTC by AI Agent