'Matlab實現FFT,畫出正確的頻譜圖'

"
"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

Matlab實現FFT,畫出正確的頻譜圖

圖4 四種經典的傅里葉變換

圖4(a)是最為熟悉的傅里葉變換,針對非週期、連續的信號,其變換後的頻譜為連續的、非週期的。公式為

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

Matlab實現FFT,畫出正確的頻譜圖

圖4 四種經典的傅里葉變換

圖4(a)是最為熟悉的傅里葉變換,針對非週期、連續的信號,其變換後的頻譜為連續的、非週期的。公式為

Matlab實現FFT,畫出正確的頻譜圖

圖4(b)是傅里葉級數,針對週期、離散的信號,變換後的信號是離散的、非週期的頻譜。

圖4(c)是離散時間傅里葉變換,針對離散、非週期的信號,變換後的信號是週期的、連續的頻譜。

圖4(d)是離散傅里葉級數,針對離散的、週期的信號,變換後的頻譜是離散的、週期的

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

Matlab實現FFT,畫出正確的頻譜圖

圖4 四種經典的傅里葉變換

圖4(a)是最為熟悉的傅里葉變換,針對非週期、連續的信號,其變換後的頻譜為連續的、非週期的。公式為

Matlab實現FFT,畫出正確的頻譜圖

圖4(b)是傅里葉級數,針對週期、離散的信號,變換後的信號是離散的、非週期的頻譜。

圖4(c)是離散時間傅里葉變換,針對離散、非週期的信號,變換後的信號是週期的、連續的頻譜。

圖4(d)是離散傅里葉級數,針對離散的、週期的信號,變換後的頻譜是離散的、週期的

Matlab實現FFT,畫出正確的頻譜圖

圖5 四種傅里葉變換總結

四種傅里葉變換的可以如圖5總結。

我們發現:

  • 時域的連續,總是對應著頻域的非週期;
  • 時域的離散,總是對應著頻域的週期;

反之亦然。

其中FT、FS、DTFT至少有一個域不是離散的信號,所以不適合計算機去處理。

DFS滿足時域和頻域都是離散的要求,但其時域為無限長的週期序列。

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

Matlab實現FFT,畫出正確的頻譜圖

圖4 四種經典的傅里葉變換

圖4(a)是最為熟悉的傅里葉變換,針對非週期、連續的信號,其變換後的頻譜為連續的、非週期的。公式為

Matlab實現FFT,畫出正確的頻譜圖

圖4(b)是傅里葉級數,針對週期、離散的信號,變換後的信號是離散的、非週期的頻譜。

圖4(c)是離散時間傅里葉變換,針對離散、非週期的信號,變換後的信號是週期的、連續的頻譜。

圖4(d)是離散傅里葉級數,針對離散的、週期的信號,變換後的頻譜是離散的、週期的

Matlab實現FFT,畫出正確的頻譜圖

圖5 四種傅里葉變換總結

四種傅里葉變換的可以如圖5總結。

我們發現:

  • 時域的連續,總是對應著頻域的非週期;
  • 時域的離散,總是對應著頻域的週期;

反之亦然。

其中FT、FS、DTFT至少有一個域不是離散的信號,所以不適合計算機去處理。

DFS滿足時域和頻域都是離散的要求,但其時域為無限長的週期序列。

Matlab實現FFT,畫出正確的頻譜圖

圖6 DFS到DFT

所以我們只要取其中N個點,定義為主值序列,然後用來求取傅里葉變換。

這樣的傅里葉變換就是DFT,離散傅里葉變換,其公式為:

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

Matlab實現FFT,畫出正確的頻譜圖

圖4 四種經典的傅里葉變換

圖4(a)是最為熟悉的傅里葉變換,針對非週期、連續的信號,其變換後的頻譜為連續的、非週期的。公式為

Matlab實現FFT,畫出正確的頻譜圖

圖4(b)是傅里葉級數,針對週期、離散的信號,變換後的信號是離散的、非週期的頻譜。

圖4(c)是離散時間傅里葉變換,針對離散、非週期的信號,變換後的信號是週期的、連續的頻譜。

圖4(d)是離散傅里葉級數,針對離散的、週期的信號,變換後的頻譜是離散的、週期的

Matlab實現FFT,畫出正確的頻譜圖

圖5 四種傅里葉變換總結

四種傅里葉變換的可以如圖5總結。

我們發現:

  • 時域的連續,總是對應著頻域的非週期;
  • 時域的離散,總是對應著頻域的週期;

反之亦然。

其中FT、FS、DTFT至少有一個域不是離散的信號,所以不適合計算機去處理。

DFS滿足時域和頻域都是離散的要求,但其時域為無限長的週期序列。

Matlab實現FFT,畫出正確的頻譜圖

圖6 DFS到DFT

所以我們只要取其中N個點,定義為主值序列,然後用來求取傅里葉變換。

這樣的傅里葉變換就是DFT,離散傅里葉變換,其公式為:

Matlab實現FFT,畫出正確的頻譜圖

DFT的運算量大,不利於大數據量的計算。

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

Matlab實現FFT,畫出正確的頻譜圖

圖4 四種經典的傅里葉變換

圖4(a)是最為熟悉的傅里葉變換,針對非週期、連續的信號,其變換後的頻譜為連續的、非週期的。公式為

Matlab實現FFT,畫出正確的頻譜圖

圖4(b)是傅里葉級數,針對週期、離散的信號,變換後的信號是離散的、非週期的頻譜。

圖4(c)是離散時間傅里葉變換,針對離散、非週期的信號,變換後的信號是週期的、連續的頻譜。

圖4(d)是離散傅里葉級數,針對離散的、週期的信號,變換後的頻譜是離散的、週期的

Matlab實現FFT,畫出正確的頻譜圖

圖5 四種傅里葉變換總結

四種傅里葉變換的可以如圖5總結。

我們發現:

  • 時域的連續,總是對應著頻域的非週期;
  • 時域的離散,總是對應著頻域的週期;

反之亦然。

其中FT、FS、DTFT至少有一個域不是離散的信號,所以不適合計算機去處理。

DFS滿足時域和頻域都是離散的要求,但其時域為無限長的週期序列。

Matlab實現FFT,畫出正確的頻譜圖

圖6 DFS到DFT

所以我們只要取其中N個點,定義為主值序列,然後用來求取傅里葉變換。

這樣的傅里葉變換就是DFT,離散傅里葉變換,其公式為:

Matlab實現FFT,畫出正確的頻譜圖

DFT的運算量大,不利於大數據量的計算。

Matlab實現FFT,畫出正確的頻譜圖

圖7 DFT到FFT

此時,就出現了快速傅里葉變換,即FFT。

FFT是DFT的快速算法,可以節省大量的計算時間,其本質仍然是DFT。

DFT的時域與頻域的聯繫

仔細觀察圖4的DFS系列,主值序列有N個點。

在時域中,如果離散信號是以T1為週期向兩邊延拓,那麼頻域的譜間隔為f1=1/T1;

同樣的,如果在頻域是以fs為週期向兩邊延拓,那麼時域的信號間隔為Ts=1/fs;

所以,我們可以得出fs/f1=N;

換個角度看。

X[k]算出來的是一個序列值,那麼這個序列值與頻率有何關係呢?

我們知道DFT的頻譜間隔為f1,那麼,那麼頻率軸就是k倍的f1,即是kf1,其中f1=fs/N;

舉個例子

我們定義個信號,它包含幅度值為0.7,頻率為50Hz的正弦和幅度值為1,頻率為120Hz的正弦.

採樣頻率為1kHz;

信號序列長度N=1500;

程序如下:

clf;
Fs = 1000; % 採樣頻率1kHz
T = 1/Fs; % 採樣週期1ms
L = 1500; % 信號長度
t = (0:L-1)*T; % 時間序列
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
subplot(211);
plot(1000*t,S);
title('包含幅值為0.7的50Hz正弦量和幅值為1的120Hz正弦量')
xlabel('t (毫秒)')
ylabel('X(t)')
subplot(212);
plot(1000*t(1:50),S(1:50));
title('取前50ms的數據,包含幅值為0.7的50Hz正弦量和幅值為1的120Hz正弦量')
xlabel('t (毫秒)')
ylabel('X(t)')
Y = fft(S);
mag = abs(Y); %求得FFT變換後的振幅
f=(0:L-1)*Fs/L; %頻率序列
figure
plot(f,mag); %繪出隨頻率變化的振幅
title('信號的FFT')
xlabel('頻率f (Hz)')
ylabel('|幅度mag|')
"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

Matlab實現FFT,畫出正確的頻譜圖

圖4 四種經典的傅里葉變換

圖4(a)是最為熟悉的傅里葉變換,針對非週期、連續的信號,其變換後的頻譜為連續的、非週期的。公式為

Matlab實現FFT,畫出正確的頻譜圖

圖4(b)是傅里葉級數,針對週期、離散的信號,變換後的信號是離散的、非週期的頻譜。

圖4(c)是離散時間傅里葉變換,針對離散、非週期的信號,變換後的信號是週期的、連續的頻譜。

圖4(d)是離散傅里葉級數,針對離散的、週期的信號,變換後的頻譜是離散的、週期的

Matlab實現FFT,畫出正確的頻譜圖

圖5 四種傅里葉變換總結

四種傅里葉變換的可以如圖5總結。

我們發現:

  • 時域的連續,總是對應著頻域的非週期;
  • 時域的離散,總是對應著頻域的週期;

反之亦然。

其中FT、FS、DTFT至少有一個域不是離散的信號,所以不適合計算機去處理。

DFS滿足時域和頻域都是離散的要求,但其時域為無限長的週期序列。

Matlab實現FFT,畫出正確的頻譜圖

圖6 DFS到DFT

所以我們只要取其中N個點,定義為主值序列,然後用來求取傅里葉變換。

這樣的傅里葉變換就是DFT,離散傅里葉變換,其公式為:

Matlab實現FFT,畫出正確的頻譜圖

DFT的運算量大,不利於大數據量的計算。

Matlab實現FFT,畫出正確的頻譜圖

圖7 DFT到FFT

此時,就出現了快速傅里葉變換,即FFT。

FFT是DFT的快速算法,可以節省大量的計算時間,其本質仍然是DFT。

DFT的時域與頻域的聯繫

仔細觀察圖4的DFS系列,主值序列有N個點。

在時域中,如果離散信號是以T1為週期向兩邊延拓,那麼頻域的譜間隔為f1=1/T1;

同樣的,如果在頻域是以fs為週期向兩邊延拓,那麼時域的信號間隔為Ts=1/fs;

所以,我們可以得出fs/f1=N;

換個角度看。

X[k]算出來的是一個序列值,那麼這個序列值與頻率有何關係呢?

我們知道DFT的頻譜間隔為f1,那麼,那麼頻率軸就是k倍的f1,即是kf1,其中f1=fs/N;

舉個例子

我們定義個信號,它包含幅度值為0.7,頻率為50Hz的正弦和幅度值為1,頻率為120Hz的正弦.

採樣頻率為1kHz;

信號序列長度N=1500;

程序如下:

clf;
Fs = 1000; % 採樣頻率1kHz
T = 1/Fs; % 採樣週期1ms
L = 1500; % 信號長度
t = (0:L-1)*T; % 時間序列
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
subplot(211);
plot(1000*t,S);
title('包含幅值為0.7的50Hz正弦量和幅值為1的120Hz正弦量')
xlabel('t (毫秒)')
ylabel('X(t)')
subplot(212);
plot(1000*t(1:50),S(1:50));
title('取前50ms的數據,包含幅值為0.7的50Hz正弦量和幅值為1的120Hz正弦量')
xlabel('t (毫秒)')
ylabel('X(t)')
Y = fft(S);
mag = abs(Y); %求得FFT變換後的振幅
f=(0:L-1)*Fs/L; %頻率序列
figure
plot(f,mag); %繪出隨頻率變化的振幅
title('信號的FFT')
xlabel('頻率f (Hz)')
ylabel('|幅度mag|')
Matlab實現FFT,畫出正確的頻譜圖

圖8 原始信號

通過圖8,我們可以看出原始信號的波形。圖8的上方為1500毫秒的信號,圖8的下方為取前50ms的信號。當從上圖中,很難看出信號是由50Hz和120Hz的頻率組成。

"
Matlab實現FFT,畫出正確的頻譜圖

導讀

在通信、信號處理和更廣泛的電氣工程領域,信號是任意的、隨時間變化的或者隨空間變化的量。

信號可分為連續時間信號和離散時間信號:

離散信號或離散時間信號是一種時間序列,可能是從連續時間信號中採樣出來。

Matlab實現FFT,畫出正確的頻譜圖

圖1 連續時間信號與離散時間信號

週期信號與非週期信號。

一個信號週期為T,那麼定義其基頻f0=1/T,諧頻kf0,k=1,2,3...

任何週期信號(並不是嚴格意義上的任何)都可以由不同諧振頻率kf0信號,相疊加而成,這就是傅里葉級數展開。

Matlab實現FFT,畫出正確的頻譜圖

圖2 週期信號與非週期信號

一個信號有一個或多個頻率,可以從兩個不同的角度來觀察:時域和頻域。

Matlab實現FFT,畫出正確的頻譜圖

圖3 信號的時域與頻域

本文就是介紹如何進行頻域的分析,當然使用計算機啦。

通過計算機中的MATLAB軟件自帶的FFT函數分析頻譜。

文中舉得例子看似簡單,但同學們如果真正要理解,其實是需要一定信號處理知識的積累的。

四種傅里葉變換

再來看一下經典的圖4,我認為學習通信或者數字信號處理,必須要搞明白各種不同的"傅里葉"。

Matlab實現FFT,畫出正確的頻譜圖

圖4 四種經典的傅里葉變換

圖4(a)是最為熟悉的傅里葉變換,針對非週期、連續的信號,其變換後的頻譜為連續的、非週期的。公式為

Matlab實現FFT,畫出正確的頻譜圖

圖4(b)是傅里葉級數,針對週期、離散的信號,變換後的信號是離散的、非週期的頻譜。

圖4(c)是離散時間傅里葉變換,針對離散、非週期的信號,變換後的信號是週期的、連續的頻譜。

圖4(d)是離散傅里葉級數,針對離散的、週期的信號,變換後的頻譜是離散的、週期的

Matlab實現FFT,畫出正確的頻譜圖

圖5 四種傅里葉變換總結

四種傅里葉變換的可以如圖5總結。

我們發現:

  • 時域的連續,總是對應著頻域的非週期;
  • 時域的離散,總是對應著頻域的週期;

反之亦然。

其中FT、FS、DTFT至少有一個域不是離散的信號,所以不適合計算機去處理。

DFS滿足時域和頻域都是離散的要求,但其時域為無限長的週期序列。

Matlab實現FFT,畫出正確的頻譜圖

圖6 DFS到DFT

所以我們只要取其中N個點,定義為主值序列,然後用來求取傅里葉變換。

這樣的傅里葉變換就是DFT,離散傅里葉變換,其公式為:

Matlab實現FFT,畫出正確的頻譜圖

DFT的運算量大,不利於大數據量的計算。

Matlab實現FFT,畫出正確的頻譜圖

圖7 DFT到FFT

此時,就出現了快速傅里葉變換,即FFT。

FFT是DFT的快速算法,可以節省大量的計算時間,其本質仍然是DFT。

DFT的時域與頻域的聯繫

仔細觀察圖4的DFS系列,主值序列有N個點。

在時域中,如果離散信號是以T1為週期向兩邊延拓,那麼頻域的譜間隔為f1=1/T1;

同樣的,如果在頻域是以fs為週期向兩邊延拓,那麼時域的信號間隔為Ts=1/fs;

所以,我們可以得出fs/f1=N;

換個角度看。

X[k]算出來的是一個序列值,那麼這個序列值與頻率有何關係呢?

我們知道DFT的頻譜間隔為f1,那麼,那麼頻率軸就是k倍的f1,即是kf1,其中f1=fs/N;

舉個例子

我們定義個信號,它包含幅度值為0.7,頻率為50Hz的正弦和幅度值為1,頻率為120Hz的正弦.

採樣頻率為1kHz;

信號序列長度N=1500;

程序如下:

clf;
Fs = 1000; % 採樣頻率1kHz
T = 1/Fs; % 採樣週期1ms
L = 1500; % 信號長度
t = (0:L-1)*T; % 時間序列
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
subplot(211);
plot(1000*t,S);
title('包含幅值為0.7的50Hz正弦量和幅值為1的120Hz正弦量')
xlabel('t (毫秒)')
ylabel('X(t)')
subplot(212);
plot(1000*t(1:50),S(1:50));
title('取前50ms的數據,包含幅值為0.7的50Hz正弦量和幅值為1的120Hz正弦量')
xlabel('t (毫秒)')
ylabel('X(t)')
Y = fft(S);
mag = abs(Y); %求得FFT變換後的振幅
f=(0:L-1)*Fs/L; %頻率序列
figure
plot(f,mag); %繪出隨頻率變化的振幅
title('信號的FFT')
xlabel('頻率f (Hz)')
ylabel('|幅度mag|')
Matlab實現FFT,畫出正確的頻譜圖

圖8 原始信號

通過圖8,我們可以看出原始信號的波形。圖8的上方為1500毫秒的信號,圖8的下方為取前50ms的信號。當從上圖中,很難看出信號是由50Hz和120Hz的頻率組成。

Matlab實現FFT,畫出正確的頻譜圖

圖9 信號的頻譜

圖9的橫座標為頻率單位Hz,總長為1000Hz(為什麼呢?讀者可以思考下)

我們發現在50Hz和120Hz處,出現明顯的峰值。

總結

本文中採樣頻率Fs=1000Hz,整個頻譜是關於500Hz對稱的。其中500Hz就是Nyquist頻率Fs/2。

所以FFT的頻譜圖是以Nyquist頻率為對稱軸的。

並且可以明顯識別出信號中含有兩種頻率成分:50Hz和120Hz。

因此用FFT對信號做譜分析,只需考察0~Nyquist頻率範圍內的幅頻特性。

本文只是簡單的入門,如果各位同學想用好FFT這個頻譜分析工具,建議動手去實驗,可以發現很多有趣的性質。

看到這裡幫班長點個贊吧,歡迎在評論去留言討論!

參考文獻:

[1]FFT-Matlab初步實現.https://www.cnblogs.com/WHaoL/p/6595132.html

[2]matlab 中fft的用法.https://www.cnblogs.com/alexanderkun/p/4723577.html

[3]fft.https://ww2.mathworks.cn/help/matlab/ref/fft.html

"

相關推薦

推薦中...