首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蟒蛇的多锥光谱分析

蟒蛇的多锥光谱分析
EN

Stack Overflow用户
提问于 2020-07-10 22:15:07
回答 1查看 763关注 0票数 1

我正在使用python上的谱库(https://pyspectrum.readthedocs.io/en/latest/install.html)进行多锥度分析,但我不能完全理解输出的振幅。

下面是一段用于说明的代码:

代码语言:javascript
复制
from spectrum import *
N=500
dt=2*10**-3
# Creating a signal with 2 sinus waves.
x = np.linspace(0.0, N*dt, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)

# classical FFT
yf = fft.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*dt), N//2)

# The multitapered method
NW=2.5
k=4
[tapers, eigen] = dpss(N, NW, k)
Sk_complex, weights, eigenvalues=pmtm(y, e=eigen, v=tapers, NFFT=500, show=False)

Sk = abs(Sk_complex)
Sk = np.mean(Sk * np.transpose(weights), axis=0)

# ploting both the results
plt.plot(xf,abs(yf[0:N//2])*dt*2)

plt.plot(xf,Sk[0:N//2])

这两个结果是相似的,并发现在50和80 Hz的频率峰值。经典的FFT也能找到较好的振幅(1和0.5),但多锥法找不到合适的振幅。在这个例子中,它的重要性大约是5倍。有没有人知道如何正确显示结果?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-12 10:26:45

据我所知,这里有几个因素在起作用。

首先,要获得功率谱密度的多锥度估计,您应该像这样计算:

代码语言:javascript
复制
Sk = abs(Sk_complex)**2
Sk = np.mean(Sk * np.transpose(weights), axis=0) * dt

也就是说,你需要平均功率谱,而不是傅立叶分量。

其次,要获得功率谱,您只需使用fft将能量谱除以估计值的N,然后乘以dt (您需要**2来从傅立叶分量中获得功率):

代码语言:javascript
复制
plt.plot(xf,abs(yf[0:N//2])**2 / N * dt)
plt.plot(xf,Sk[0:N//2])

最后,应该直接比较的不是功率谱密度中的振幅,而是总功率。您可以查看以下内容:

代码语言:javascript
复制
print(np.sum(abs(yf[0:N//2])**2/N * dt), np.sum(Sk[0:N//2]))

非常接近的匹配。

所以你的整个代码变成了:

代码语言:javascript
复制
from spectrum import *
N=500
dt=2*10**-3
# Creating a signal with 2 sinus waves.
x = np.linspace(0.0, N*dt, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)

# classical FFT
yf = fft.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*dt), N//2)

# The multitapered method
NW=2.5
k=4
[tapers, eigen] = dpss(N, NW, k)
Sk_complex, weights, eigenvalues=pmtm(y, e=eigen, v=tapers, NFFT=N, show=False)

Sk = abs(Sk_complex)**2
Sk = np.mean(Sk * np.transpose(weights), axis=0) * dt

# ploting both results
plt.figure()
plt.plot(xf,abs(yf[0:N//2])**2 / N * dt)
plt.plot(xf,Sk[0:N//2])

# ploting both results in log scale
plt.semilogy(xf, abs(yf[0:N // 2]) ** 2 / N * dt)
plt.semilogy(xf, Sk[0:N // 2])

# comparing total power
print(np.sum(abs(yf[0:N//2])**2 / N * dt), np.sum(Sk[0:N//2]))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62836233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档