【问题标题】:Problem with the y-values of the power spectrum plotted in pythonpython中绘制的功率谱的y值问题
【发布时间】:2021-01-09 02:22:30
【问题描述】:

我有一些数据,我使用 MATLAB 绘制了功率谱。但我努力将相同的指令翻译成 Python 并获得确切的情节。在 Python 中获得的绘图形状似乎很好,只是 y 值由于某种原因是正的!谁能告诉我哪里出错了?下面,我附上了MATLAB和python中的说明以及获得的两个图。

MATLAB:                                                    
N=length(signal);
xdft = fft(signal);
xdft = xdft(1:N/2+1);
psdx=(1/(fs*N))*abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:fs/N:fs/2;
plot(freq, 10*log10(psdx))

Python:
N = len(signal)
psdx = pow(np.fft.rfft(signal),2)
psdx[1:len(psdx)-1] = 2*psdx[1:len(psdx)-1]
f = np.arrange(0, (fs/2) + (1/N), fs/N)
plt.plot(f, (10*np.log10(psdx)))
plt.show() 

可以使用以下方式找到信号:https://gofile.io/d/tlJm7F/edit 请注意,您需要先加载/读取文件

【问题讨论】:

标签: python matlab plot yaxis


【解决方案1】:

快速浏览一下,我认为您没有将 psdx 除以 fs*N 从您的 matlab 代码中。 这可能是原因。我会在 matlab 中打印 psdx 的值并检查它是否与 python 匹配。

【讨论】:

  • 我怀疑这就是原因。无论如何,取 log10 应该会导致负值,但 Python 出于某种原因对此不满意。不确定我是否需要更改绘图的设置或缩放比例。
【解决方案2】:

我只是使用了 MATLAB 代码,没有使用 numpy.fft.rfft 函数。我还假设 fs 等于 120。请根据您的代码进行更改。

该图如下所示,对我来说更接近您的 MATLAB 代码。

代码在这里。

import matplotlib.pyplot as plt
import numpy as np
with open("./FileName2.txt","r") as FileHandle:
    Signal = FileHandle.readlines()
signal = np.array([i.rstrip("\n") for i in Signal])
fs = 120
N = len(signal)
xdft = np.fft.fft(signal)
xdft = xdft[:int(N/2)+1]
psdx=(1/(fs*N))*np.abs(xdft)**2
f = np.arange(0, (fs/2) + (1/N), fs/N)
plt.plot(f, (10*np.log10(psdx)))
plt.show() 

【讨论】:

  • 非常感谢,不知道为什么用了no.fft.rfft
猜你喜欢
  • 2013-03-01
  • 2016-12-09
  • 2017-07-29
  • 1970-01-01
  • 2023-03-23
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多