您好,登錄后才能下訂單哦!
這篇文章給大家介紹python中實(shí)現(xiàn)功率譜的原理是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
功率譜圖又叫功率譜密度圖
功率譜是功率譜密度函數(shù)的簡(jiǎn)稱,它定義為單位頻帶內(nèi)的信號(hào)功率。它表示了信號(hào)功率隨著頻率的變化情況,即信號(hào)功率在頻域的分布狀況。
功率譜表示了信號(hào)功率隨著頻率的變化關(guān)系。常用于功率信號(hào)(區(qū)別于能量信號(hào))的表述與分析,其曲線(即功率譜曲線)一般橫坐標(biāo)為頻率,縱坐標(biāo)為功率。由于功率沒(méi)有負(fù)值,所以功率譜曲線上的縱坐標(biāo)也沒(méi)有負(fù)數(shù)值,功率譜曲線所覆蓋的面積在數(shù)值上等于信號(hào)的總功率(能量)。
知乎用戶CrisYang對(duì)功率譜、能量譜、幅值譜之間的關(guān)系進(jìn)行了詳細(xì)的說(shuō)明:
在頻譜分析中幅度和功率是由緊密聯(lián)系的兩個(gè)不同的物理量:能量能表述為幅值的平方和,也能表述為功率在時(shí)間上的積分;功率譜密度,是指用密度的概念表示信號(hào)功率在各頻率點(diǎn)的分布情況,是對(duì)隨機(jī)變量均方值的量度,是單位頻率的平均功率量綱;也就是說(shuō),對(duì)功率譜在頻域上積分就可以得到信號(hào)的平均功率,而不是能量。能量譜密度是單位頻率的幅值平方和量綱,能量譜密度曲線下面的面積才是這個(gè)信號(hào)的總能量。于是,功率譜、能量譜、幅值譜之間的緊密關(guān)系主要表述為:能量譜是功率譜密度函數(shù)在相位上的卷積,也是幅值譜密度函數(shù)的平方在頻率上的積分;功率譜是信號(hào)自相關(guān)函數(shù)的傅里葉變換,能量譜是信號(hào)本身傅立葉變換幅度的平方。
from scipy.fftpack import fft, fftshift, ifftfrom scipy.fftpack import fftfreqimport numpy as npimport matplotlib.pyplot as pltimport warningswarnings.filterwarnings("ignore")fs = 1000#采樣點(diǎn)數(shù)num_fft = 1024;"""生成原始信號(hào)序列在原始信號(hào)中加上噪聲np.random.randn(t.size)"""t = np.arange(0, 1, 1/fs)f0 = 100f1 = 200x = 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_fftax=plt.subplot(513)ax.set_title('direct method')plt.plot(20*np.log10(ps[:num_fft//2]))"""相關(guān)功譜率 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()
代碼來(lái)源于網(wǎng)絡(luò),本文對(duì)代碼進(jìn)行注釋并整理
功率譜是功率譜密度(Power Spectral Density, PSD)函數(shù)的簡(jiǎn)稱,它定義為單位頻帶內(nèi)的信號(hào)功率。
它表示了信號(hào)功率隨著頻率的變化關(guān)系,即信號(hào)功率在頻域的分布狀況。
功率譜密度的單位用每赫茲的瓦特?cái)?shù)(W/Hz)表示,
它的另一種單位 dB,當(dāng)單位為dB時(shí)是因?yàn)閷?duì)數(shù)據(jù)做了對(duì)數(shù)處理(10logX)
做對(duì)數(shù)處理的目的是拉高低振幅成分,便于觀察噪聲中的周期信號(hào)
功率譜估計(jì)是頻域分析的主要分析手段,我們之前看到的是幅度隨時(shí)間變化的腦電波
功率譜展現(xiàn)的是腦電功率隨頻率變化的頻圖。
在睡眠的分期以及智力活動(dòng)與EEG之間的關(guān)系等很多方面,功率譜分析都非常有用。
MNE中專門針對(duì)Raw對(duì)象(也就是原始腦電信號(hào)),有多種繪制PSD圖的方式
1.利用plot_psd()繪制功率譜圖
2.利用plot_psd_topo()在腦地形圖上繪制功率譜圖
下面以plot_psd為例介紹一下繪制PSD的案例。
# 引入python庫(kù)import mnefrom mne.datasets import sampleimport matplotlib.pyplot as plt# sample的存放地址data_path = sample.data_path()# 該fif文件存放地址file_name = data_path + '/MEG/sample/sample_audvis_raw.fif'"""讀取數(shù)據(jù)文件"""raw = mne.io.read_raw_fif(file_name,preload=True)
"""繪制指定通道的功率譜圖"""picks = ['eeg']raw.plot_psd(picks=picks)plt.show()
"""設(shè)置更窄頻率范圍設(shè)置fmin和fmax來(lái)指定頻率的跨度。"""picks = ['eeg']#raw.plot_psd(picks=picks,fmin=0,fmax=100)raw.plot_psd(picks=picks,fmin=0,fmax=80)plt.show()
關(guān)于python中實(shí)現(xiàn)功率譜的原理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。