Проблема с y-значениями спектра мощности, построенными в python

У меня есть некоторые данные, и я использовал 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. что вам нужно сначала загрузить/прочитать файл

введите здесь описание изображения

введите здесь описание изображения


person Khalid    schedule 09.01.2021    source источник
comment
Не могли бы вы поделиться примером массива сигналов?   -  person Amit    schedule 09.01.2021
comment
gofile.io/d/tlJm7F/edit   -  person Khalid    schedule 09.01.2021
comment
Дайте знать пожалуйста, если разобрались   -  person Khalid    schedule 09.01.2021


Ответы (2)


с первого взгляда я думаю, что вы не делите psdx на fs * N из своего кода Matlab. Это может быть причиной. Я бы распечатал значения psdx в Matlab и проверил, совпадает ли он с python.

person Yash    schedule 09.01.2021
comment
Сомневаюсь, что это причина. В любом случае получение log10 должно привести к отрицательным значениям, но Python по какой-то причине не доволен этим. Не уверен, что мне нужно изменить настройки или масштабирование сюжета. - person Khalid; 09.01.2021

Я просто использовал код MATLAB без использования функции numpy.fft.rfft. Также я предположил, что fs равен 120. Пожалуйста, измените, как этого хочет ваш код.

Сюжет выглядит так, как показано ниже, что мне ближе к вашему коду MATLAB. Код Python изменен в соответствии с кодом 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() 
person Amit    schedule 09.01.2021
comment
большое спасибо, я не знаю, почему я использовал no.fft.rfft - person Khalid; 09.01.2021