FFT頻譜分析原理

2021-08-21 21:27:01 字數 3500 閱讀 5003

fft頻譜分析原理

取樣定理:取樣頻率要大於訊號頻率的兩倍。

n個取樣點經過fft變換後得到n個點的以複數形式記錄的fft結果。

假設取樣頻率為fs,取樣點數為n。那麼fft運算的結果就是n個複數(或n個點),每乙個複數就對應著乙個頻率值以及該頻率訊號的幅值和相位。第乙個點對應的頻率為0hz(即直流分量),最後乙個點n的下乙個點對應取樣頻率fs。其中任意乙個取樣點n所代表的訊號頻率:

fn=(n-1)*fs/n。

這表明,頻譜分析得到的訊號頻率最大為(n-1)*fs/n,對頻率的分辨能力是fs/n。取樣頻率和取樣時間制約著通過fft運算能分析得到的訊號頻率上限,同時也限定了分析得到的訊號頻率的解析度。

每乙個複數的模值對應該點所對應的頻率值的幅度特性,具體的定量關係如下:

假設訊號由以下週期的原始訊號疊加而成:

y = a1 + a2 cos (2*pi*ω2*t + φ2 * pi/180) + a3 cos (2*pi*ω3*t + φ3 * pi/180)

那麼,在經過fft分析後得到的第乙個點的模值是a1的n倍,而且只有在fft結果點對應的頻率在ω2,ω3時,其模值才明顯放大,在其他頻率點,模值接近於0。在這些模值明顯放大的點中,除第乙個點之外的其它點模值是相應訊號幅值的n/2倍。

每個複數的相位就是在該頻率值下訊號的相位:φ2,φ3。

fft結果有對稱性,通常我們只是用前半部分的結果,也就是小於取樣頻率一半的結果。同時也只有取樣頻率一半以內、具有一定幅值的訊號頻率才是真正的訊號頻率。

python實踐fft頻譜分析

假如訊號s是有1個直流訊號和4個週期訊號疊加而成,如下公式所列(t為自變數,pi為圓周率值)現要對其進行fft分析並繪製頻譜圖。

s =  2.0  + 3.0 * cos(2.0 * pi * 50 * t - pi * 30/180)

+ 1.5 * cos(2.0 * pi * 75 * t + pi * 90/180)

+  1.0 * cos(2.0 * pi * 150 * t + pi * 120/180)

+  2.0 * cos(2.0 * pi * 220 * t + pi * 30/180)

我們先使用python繪製其1秒內的波形圖:

import numpy as np

import pylab as pl

import math

# 取樣步長

t = [x/1048.0 for x in range(1048)]

# 設計的取樣值

y = [2.0 + 3.0 * math.cos(2.0 * math.pi * 50 * t0 - math.pi * 30/180)

+ 1.5 * math.cos(2.0 * math.pi * 75 * t0 + math.pi * 90/180)

+  1.0 * math.cos(2.0 * math.pi * 150 * t0 + math.pi * 120/180)

+  2.0 * math.cos(2.0 * math.pi * 220 * t0 + math.pi * 30/180)

for t0 in t ]

pl.plot(t,y)

pl.show()

波形圖如圖1所示。

圖 1 訊號s在1秒內的波形

現在我們要對該訊號在0-1秒時間內進行頻譜分析,我們在這1秒時間內取樣1048點,則我們的取樣頻率為1048hz。這兩個設定決定了我們頻譜分析所能得到的最高訊號頻率是1047hz (1048hz*(1048-1)/1048),但只有小於524hz的頻率才可能是真實的訊號頻率。我們能分辨的最小頻率差為1hz(1048hz/1048)。輸入如下的python**:

n=len(t)    # 取樣點數

fs=1048.0     # 取樣頻率

df = fs/(n-1)   # 解析度

f = [df*n for n in range(0,n)]   # 構建頻率陣列

使用下面的**進行快速傅利葉變換並對結果模值進行縮放:

y = np.fft.fft(y)*2/n  #*2/n 反映了fft變換的結果與實際訊號幅值之間的關係

absy = [np.abs(x) for x in y]      #求傅利葉變換結果的模

此時我們得到了訊號的fft分析結果,它儲存在列表y內,同時我們也獲取了y內每乙個元素(是複數)的模組成的列表absy。根據理論分析,absy內的元素大部分都極其接近0,只有極少數峰值提示的是訊號頻率的幅度。我們寫一小段**顯示幅度較大的訊號的資訊。**如下:

i=0while i 

if absy[i]>0.01:

print("freq:m, y: %5.2f + %5.2f j, a:%3.2f, phi: %6.1f"

%(i, y[i].real, y[i].imag, absy[i],math.atan2(y[i].imag,y[i].real)*180/math.pi))

i+=1

該段**的執行結果如下:

freq:   0, y:  4.00 +  0.00 j, a:4.00, phi:    0.0

freq:  50, y:  2.60 + -1.50 j, a:3.00, phi:  -30.0

freq:  75, y:  0.00 +  1.50 j, a:1.50, phi:   90.0

freq: 150, y: -0.50 +  0.87 j, a:1.00, phi:  120.0

freq: 220, y:  1.73 +  1.00 j, a:2.00, phi:   30.0

freq: 828, y:  1.73 + -1.00 j, a:2.00, phi:  -30.0

freq: 898, y: -0.50 + -0.87 j, a:1.00, phi: -120.0

freq: 973, y:  0.00 + -1.50 j, a:1.50, phi:  -90.0

freq: 998, y:  2.60 +  1.50 j, a:3.00, phi:   30.0

該段結果很好的反映了原始訊號的頻率、幅度和相位,我們在**中已經對fft結果與訊號幅值做了乙個換算2/n,但在0hz處,實際的訊號應該是fft結果的1/n,也就是a:4.00再除以2。

使用如下**繪製頻譜圖,得到圖2:

圖 2 訊號s的頻譜分析圖

由圖2可見,頻譜分析的結果具有對稱性,同220hz對稱的頻率為828hz,可以計算出對稱軸為524hz。但只有小於524hz的頻率才是訊號頻率。我們通過修改取樣頻率和取樣點數,我們發現作為對稱軸的頻率會變化,同樣的對稱軸右側的訊號頻率也會發生變化。提示右側的頻率沒有實際意義,這也從乙個方面印證了取樣定理。

頻譜分析之FFT

參考 fft是離散傅利葉變換的快速演算法,可以將乙個訊號變換到頻域。有些訊號在時域上是很難看出什麼特徵的,但是如果變換到頻域之後,就很容易看出特徵了。這就是很多訊號分析採用fft變換的原因。頻率是表徵資料變化劇烈程度的指標,是資料在平面空間上的梯度.從物理效果看,傅利葉變換是將影象從空間域轉換到頻率...

使用 FFT 進行頻譜分析

下面的示例說明了如何使用 fft 函式進行頻譜分析。fft 的乙個常用場景是確定乙個時域雜訊訊號的頻率分量。首先建立一些資料。假設是以 1000 hz 的頻率對資料進行的取樣。首先為資料構造一條時間軸,時間範圍從 t 0 至 t 0.25,步長為 1 毫秒。然後,建立乙個包含 50 hz 和 120...

FFT頻譜分析中的幾個誤差

fft在分析頻譜分析的時候,會有下面四個方面的誤差 1 頻譜混疊 奈奎斯特定理已被眾所周知了,所以幾乎所有人的都知道為了不讓頻譜混疊,理論上取樣頻譜大於等於訊號的最高頻率。那和時域上聯絡起來的關係是什麼呢?取樣週期的倒數是頻譜解析度,最高頻率的倒數是取樣週期。設定取樣點數為n,取樣頻率fs,最高頻率...