python頻譜分析

2021-06-22 21:30:00 字數 1417 閱讀 7711

import numpy as np

import matplotlib.pyplot as pl

sampling_rate = 8000

fft_size = 512

# 首先定義了兩個常數:sampling_rate, fft_size,分別表示數碼訊號的取樣頻率和fft的長度.由於快速離散傅利葉演算法的影響這裡的n必須是2的整數次冪,也稱為fft_size。如果你不是取的整數次,小於則訊號補0,大於則訊號截斷.

t = np.arange(0, 1.0, 1.0/sampling_rate)

x = np.sin(2*np.pi*156.25*t)  + 2*np.sin(2*np.pi*234.375*t)

#取樣時間陣列t可以很方便地呼叫函式計算出波形資料,這裡計算的是兩個正弦波的疊加,乙個頻率是156.25hz,乙個是234.375hz.

用取樣時間陣列t可以很方便地呼叫函式計算出波形資料,這裡計算的是兩個正弦波的疊加,乙個頻率是156.25hz,乙個是234.375hz:

對於8khz取樣,512點fft來說,8000/512=15.625hz,156.25hz和234.375hz正好是其10倍和15倍。

xs = x[:fft_size]

xf = np.fft.rfft(xs)/fft_size

#下面從波形資料x中擷取fft_size個點進行fft計算。np.fft庫中提供了乙個rfft函式,它方便我們對實數訊號進行fft計算。根據fft計算公式,為了正確顯示波形能量,還需要將rfft函式的結果除以fft_size:

freqs = np.linspace(0, sampling_rate/2, fft_size/2+1)

#rfft函式的返回值是n/2+1個複數,分別表示從0(hz)到sampling_rate/2(hz)的n/2+1點頻率的成分。於是可以通過下面的np.linspace計算出返回值中每個下標對應的真正的頻率.n/2+1個。為什麼?因為共軛對稱。

xfp = 20*np.log10(np.clip(np.abs(xf), 1e-20, 1e100))

#最後我們計算每個頻率分量的幅值,並通過 20*np.log10() 將其轉換為以db單位的值。為了防止0幅值的成分造成log10無法計算,我們呼叫np.clip對xf的幅值進行上下限處理:

pl.figure(figsize=(8,4))

pl.subplot(211)

pl.plot(t[:fft_size], xs)

pl.xlabel(u"時間(秒)")

pl.title(u"156.25hz和234.375hz的波形和頻譜")

pl.subplot(212)

pl.plot(freqs, xfp)

pl.xlabel(u"頻率(hz)")

pl.subplots_adjust(hspace=0.4)

pl.show()

頻譜分析 頻譜分析儀概述及選購要點

在無線通訊裝置 元器件或系統測試應用中,頻譜分析儀是應用最廣泛的測量裝置。它能測量和顯示射頻訊號的頻譜分布,也能測量和讀取頻率和幅值資訊。儘管當前無線通訊以數字通訊技術為主,但是頻譜分析儀測量頻譜仍然是一種不可缺少的重要手段。如需選擇頻譜分析儀,請先考慮如下關鍵點 1 頻率範圍 選擇合適的頻譜分析儀...

FFT頻譜分析原理

fft頻譜分析原理 取樣定理 取樣頻率要大於訊號頻率的兩倍。n個取樣點經過fft變換後得到n個點的以複數形式記錄的fft結果。假設取樣頻率為fs,取樣點數為n。那麼fft運算的結果就是n個複數 或n個點 每乙個複數就對應著乙個頻率值以及該頻率訊號的幅值和相位。第乙個點對應的頻率為0hz 即直流分量 ...

頻譜分析之FFT

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