在python中绘制的功率谱的y值有问题

问题描述

我得到了一些数据,并使用 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 注意需要先加载/读取文件

enter image description here

enter image description here

解决方法

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

,

我只是使用 MATLAB 代码,因为它没有使用 numpy.fft.rfft 函数。另外 fs 我假设等于 120。请按照您的代码希望更改。

该图如下所示,对我来说它更接近您的 MATLAB 代码。 Python Code changed as per MATLAB code

代码在这里。

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()