功率谱密度的相关推导以及Python实现
功率譜密度的相關推導以及Python實現
本文主要介紹了離散信號功率譜密度的相關推導以及PythonPythonPython實現。特別是,很多教材默認采樣頻率為單位1,本文不做此默認相關推導更具一般性。文章內容安排如下:第一部分介紹基本概念和相關推導;第二部分分別利用現成的matplotlib.pyplot.psdmatplotlib.pyplot.psdmatplotlib.pyplot.psd庫和numpy.fft.fftnumpy.fft.fftnumpy.fft.fft庫計算離散信號的功率譜密度并驗證結果。湍流領域中的文獻常用預乘譜,其物理解釋可以參考這個網站。功率譜密度的現代估計方法可以參考這個網站。
一、理論推導
1.1 基本概念
對于一個連續隨機信號xc(t)x_c(t)xc?(t),由帕薩維爾等式可知:
∫?∞+∞xc(t)2dt=12π∫?∞+∞∣x^c(ω)∣2dω(1)\int_{-\infty}^{+\infty}x_c(t)^2dt = \frac{1}{2\pi}\int_{-\infty}^{+\infty}|\hat{x}_c(\omega)|^2d\omega \tag{1} ∫?∞+∞?xc?(t)2dt=2π1?∫?∞+∞?∣x^c?(ω)∣2dω(1) 其中,x^c(ω)\hat{x}_c(\omega)x^c?(ω)為隨機信號xc(t)x_c(t)xc?(t)的傅里葉變換。類似于電磁學中用電流信號的平方表示功率(P=I2RP=I^2RP=I2R),上式左端被積函數W=xc(t)2W=x_c(t)^2W=xc?(t)2表示隨機信號的功率。因此,(1)式左端表示隨機信號的總能量,右端被積函數E(ω)=∣x^c(ω)∣2E(\omega)=|\hat{x}_c(\omega)|^2E(ω)=∣x^c?(ω)∣2表示單位頻率的能量,也即連續信號的能量譜密度。對于離散隨機信號x(n)=xc(nΔt),x^(k)=x^c(ωk)x(n)=x_c(n\Delta{t}),\hat{x}(k)=\hat{x}_c(\omega_k)x(n)=xc?(nΔt),x^(k)=x^c?(ωk?),有離散形式的帕薩維爾等式:
∑n=0N?1xc(nΔt)2Δt=12π∑k=0N?1∣x^c(ωk)∣2Δω(2)\sum_{n=0}^{N-1}x_c(n\Delta{t})^2 \Delta{t}= \frac{1}{2\pi}\sum_{k=0}^{N-1}|\hat{x}_c(\omega_k)|^2\Delta{\omega}\tag{2} n=0∑N?1?xc?(nΔt)2Δt=2π1?k=0∑N?1?∣x^c?(ωk?)∣2Δω(2)ωk=2πfk=2kπT=2kπNΔt,Δω=2πΔf=2πNΔt.\omega_k=2\pi{f_k}=\frac{2k\pi}{T}=\frac{2k\pi}{N\Delta{t}},\Delta{\omega=2\pi\Delta{f}=\frac{2\pi}{N\Delta{t}}}. ωk?=2πfk?=T2kπ?=NΔt2kπ?,Δω=2πΔf=NΔt2π?.其中,Δt\Delta{t}Δt為采樣周期,相應的采樣頻率為:fs=1/Δt.f_s=1/\Delta{t}.fs?=1/Δt. 將上式整理得到:
∑n=0N?1x(n)2Δt=∑k=0N?1∣fs?x^(k)∣2fs2?Δf(3)\sum_{n=0}^{N-1}x(n)^2 \Delta{t}=\sum_{k=0}^{N-1}\frac{|f_s·\hat{x}(k)|^2}{f_s^2}·\Delta{f}\tag{3} n=0∑N?1?x(n)2Δt=k=0∑N?1?fs2?∣fs??x^(k)∣2??Δf(3)式中x^s(k)=fs?x^(k)\hat{x}_s(k)=f_s·\hat{x}(k)x^s?(k)=fs??x^(k)是離散傅里葉變換的結果(推導見下節內容)。于是上式可以寫成:
∑n=0N?1x(n)2Δt=∑k=0N?1∣x^s(k)∣2fs2?Δf(4)\sum_{n=0}^{N-1}x(n)^2 \Delta{t}=\sum_{k=0}^{N-1}\frac{|\hat{x}_s(k)|^2}{f_s^2}·\Delta{f}\tag{4} n=0∑N?1?x(n)2Δt=k=0∑N?1?fs2?∣x^s?(k)∣2??Δf(4)對于離散信號,我們可以定義離散信號的能量譜密度為離散信號離散傅里葉變換的模的平方除以采樣頻率的平方,即:E(k)=∣x^s(k)∣2/fs2.E(k)=|\hat{x}_s(k)|^2/f_s^2.E(k)=∣x^s?(k)∣2/fs2?. 此時,離散信號的平均功率為:
W ̄=1N∑n=0N?1x(n)2=∑k=0N?1∣x^s(k)∣2Nfs?Δf.(5)\overline{W}=\frac{1}{N}\sum_{n=0}^{N-1}x(n)^2=\sum_{k=0}^{N-1}\frac{|\hat{x}_s(k)|^2}{Nf_s}·\Delta{f}.\tag{5} W=N1?n=0∑N?1?x(n)2=k=0∑N?1?Nfs?∣x^s?(k)∣2??Δf.(5)同理,可以定義離散信號的功率譜密度為離散信號的能量譜密度除以總時間T,即:P(k)=E(k)NΔt=∣x^s(k)∣2/(fsN)P(k)=\frac{E(k)}{N\Delta{t}}=|\hat{x}_s(k)|^2/(f_sN)P(k)=NΔtE(k)?=∣x^s?(k)∣2/(fs?N)。一般來說,我們需要對原始信號加窗w(n)w(n)w(n)。加窗后,為使其平均功率保持不變需要乘上一個能量恢復系數KKK[1],也即有:1N∑n=0N?1x(n)2=K?1N∑n=0N?1w(n)2x(n)2.\frac{1}{N}\sum_{n=0}^{N-1}x(n)^2=K*\frac{1}{N}\sum_{n=0}^{N-1}w(n)^2x(n)^2.N1?n=0∑N?1?x(n)2=K?N1?n=0∑N?1?w(n)2x(n)2.為計算方便,我們令x(n)=1x(n)=1x(n)=1得到加函數w(n)w(n)w(n)窗的恢復系數為:K=N∑n=0N?1w(n)2=N∣∣w∣∣2.K=\frac{N}{\sum_{n=0}^{N-1} w(n)^2}=\frac{N}{||w||^2}.K=∑n=0N?1?w(n)2N?=∣∣w∣∣2N?.加窗以后的功率譜密度為:P(k)=K?E(k)NΔt=∣x^s(k)∣2fs∣∣w∣∣2.P(k)=K*\frac{E(k)}{N\Delta{t}}=\frac{|\hat{x}_s(k)|^2}{f_s||w||^2}.P(k)=K?NΔtE(k)?=fs?∣∣w∣∣2∣x^s?(k)∣2?.
1.2 離散傅里葉變換
對連續信號xc(t)x_c(t)xc?(t)進行采樣得到離散信號x(t)x(t)x(t)的過程可以描述為:
x(t)=xc(t)s(t),s(t)=∑n=0N?1δ(t?nΔt),δ(t?t0)={1,t=t00,t≠t0(6)x(t)=x_c(t)s(t),s(t)=\sum_{n=0}^{N-1}\delta({t-n\Delta{t}}), \delta(t-t_0) = \left\{\begin{aligned} 1, & &t=t_0 \\ 0, & &t\neq{t_0}\\ \end{aligned}\right.\tag{6} x(t)=xc?(t)s(t),s(t)=n=0∑N?1?δ(t?nΔt),δ(t?t0?)={1,0,??t=t0?t=t0??(6)其中,s(t)s(t)s(t)稱之為采樣函數。根據連續函數的傅里葉變換可知:
x^c(ω)=∫?∞+∞xc(t)e?iωtdt.(7)\hat{x}_c(\omega)=\int_{-\infty}^{+\infty}x_c(t)e^{-i\omega{t}}dt.\tag{7} x^c?(ω)=∫?∞+∞?xc?(t)e?iωtdt.(7)將隨機信號x(t)x(t)x(t)代入上式即可得到離散時間傅里葉變換如下:
x^(ω)=∫?∞+∞xc(t)s(t)e?iωtdt=∑n=0N?1∫?∞+∞xc(t)δ(t?nΔt)e?iωtdt.(8)\hat{x}(\omega)=\int_{-\infty}^{+\infty}x_c(t)s(t)e^{-i\omega{t}}dt=\sum_{n=0}^{N-1}\int_{-\infty}^{+\infty}x_c(t)\delta(t-n\Delta{t})e^{-i\omega{t}}dt.\tag{8} x^(ω)=∫?∞+∞?xc?(t)s(t)e?iωtdt=n=0∑N?1?∫?∞+∞?xc?(t)δ(t?nΔt)e?iωtdt.(8)將上述積分寫成離散形式可得:
x^(ω)=∑n=1N?1∑k=0N?1xc(t)δ(kΔt?nΔt)e?iωkΔtΔt=∑n=1N?1xc(nΔt)e?iωnΔtΔt.(9)\hat{x}(\omega)=\sum_{n=1}^{N-1}\sum_{k=0}^{N-1}x_c(t)\delta(k\Delta{t}-n\Delta{t})e^{-i\omega{k\Delta{t}}}\Delta{t}=\sum_{n=1}^{N-1}x_c(n\Delta{t})e^{-i\omega{n\Delta{t}}}\Delta{t}.\tag{9} x^(ω)=n=1∑N?1?k=0∑N?1?xc?(t)δ(kΔt?nΔt)e?iωkΔtΔt=n=1∑N?1?xc?(nΔt)e?iωnΔtΔt.(9)將頻率離散后(見上一節的處理)代入上述方程即可得到離散傅里葉變換如下:
x^(ωk)=∑n=0N?1xc(nΔt)e?iωknΔtΔt.(10)\hat{x}(\omega_k)=\sum_{n=0}^{N-1}x_c(n\Delta{t})e^{-i\omega_k{n\Delta{t}}}\Delta{t}.\tag{10} x^(ωk?)=n=0∑N?1?xc?(nΔt)e?iωk?nΔtΔt.(10)整理得到:
x^s(k)=fs?x^(k)=∑n=0N?1x(n)e?i2πknN.(11)\hat{x}_s(k)=f_s·\hat{x}(k)=\sum_{n=0}^{N-1}x(n)e^{-i\frac{2\pi{kn}}{N}}.\tag{11} x^s?(k)=fs??x^(k)=n=0∑N?1?x(n)e?iN2πkn?.(11)等式左端x^s(k)\hat{x}_s(k)x^s?(k)即為離散傅里葉變換的結果。
二、python代碼
輸出結果如下圖所示:
輸出結果如下圖所示:
將結果可視化并與plt.psd的結果進行比較。
# 雙邊譜只有半邊有效(采樣定理) plt.plot(f2,Pxx2[:nfft//2],color='orange',linestyle='-',label='fft') # 利用fft計算的結果 plt.plot(f1[nfft//2:],Pxx1[nfft//2:],'b--',label='plt.psd') # 利用plt.psd計算的結果plt.xscale('log') plt.yscale('log') plt.xlabel('f/Hz',fontsize=12) plt.ylabel('PSD', fontsize=12) plt.legend(frameon=False,fontsize=12) plt.tick_params(top=True,right=True,direction='in',which='both') plt.show()按照前面的定義可知,功率譜密度與頻率圍成的面積表示離散隨機信號的平均功率。
輸出結果為:
若有錯誤歡迎在下方評論指出,謝謝!
[1]焦新濤,丁康.加窗頻譜分析的恢復系數及其求法[J].汕頭大學學報(自然科學版),2003(03):26-30+38.
總結
以上是生活随笔為你收集整理的功率谱密度的相关推导以及Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式系统的知识体系
- 下一篇: 算法还是算力?周志华微博引爆深度学习的“