本教程為腦機學習者Rose原創(轉載請聯系作者授權)發表於公眾號:腦機接口社區(微信號:Brain_Computer).QQ交流群:903290195
功率譜簡介
功率譜圖又叫功率譜密度圖
功率譜是功率譜密度函數的簡稱,它定義為單位頻帶內的信號功率。它表示了信號功率隨着頻率的變化情況,即信號功率在頻域的分布狀況。
功率譜表示了信號功率隨着頻率的變化關系。常用於功率信號(區別於能量信號)的表述與分析,其曲線(即功率譜曲線)一般橫坐標為頻率,縱坐標為功率。由於功率沒有負值,所以功率譜曲線上的縱坐標也沒有負數值,功率譜曲線所覆蓋的面積在數值上等於信號的總功率(能量)。
功率譜、能量譜、幅值譜之間的關系
知乎用戶CrisYang對功率譜、能量譜、幅值譜之間的關系進行了詳細的說明:
在頻譜分析中幅度和功率是由緊密聯系的兩個不同的物理量:能量能表述為幅值的平方和,也能表述為功率在時間上的積分;功率譜密度,是指用密度的概念表示信號功率在各頻率點的分布情況,是對隨機變量均方值的量度,是單位頻率的平均功率量綱;也就是說,對功率譜在頻域上積分就可以得到信號的平均功率,而不是能量。能量譜密度是單位頻率的幅值平方和量綱,能量譜密度曲線下面的面積才是這個信號的總能量。於是,功率譜、能量譜、幅值譜之間的緊密關系主要表述為:能量譜是功率譜密度函數在相位上的卷積,也是幅值譜密度函數的平方在頻率上的積分;功率譜是信號自相關函數的傅里葉變換,能量譜是信號本身傅立葉變換幅度的平方。
功率譜python實現
from scipy.fftpack import fft, fftshift, ifft
from scipy.fftpack import fftfreq
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
fs = 1000
#采樣點數
num_fft = 1024;
"""
生成原始信號序列
在原始信號中加上噪聲
np.random.randn(t.size)
"""
t = np.arange(0, 1, 1/fs)
f0 = 100
f1 = 200
x = np.cos(2*np.pi*f0*t) + 3*np.cos(2*np.pi*f1*t) + np.random.randn(t.size)
plt.figure(figsize=(15, 12))
ax=plt.subplot(511)
ax.set_title('original signal')
plt.tight_layout()
plt.plot(x)
"""
FFT(Fast Fourier Transformation)快速傅里葉變換
"""
Y = fft(x, num_fft)
Y = np.abs(Y)
ax=plt.subplot(512)
ax.set_title('fft transform')
plt.plot(20*np.log10(Y[:num_fft//2]))
"""
功率譜 power spectrum
直接平方
"""
ps = Y**2 / num_fft
ax=plt.subplot(513)
ax.set_title('direct method')
plt.plot(20*np.log10(ps[:num_fft//2]))
"""
相關功譜率 power spectrum using correlate
間接法
"""
cor_x = np.correlate(x, x, 'same')
cor_X = fft(cor_x, num_fft)
ps_cor = np.abs(cor_X)
ps_cor = ps_cor / np.max(ps_cor)
ax=plt.subplot(514)
ax.set_title('indirect method')
plt.plot(20*np.log10(ps_cor[:num_fft//2]))
plt.tight_layout()
plt.show()
腦機學習者Rose筆記分享,QQ交流群:903290195
更多分享,請關注公眾號