Scipy welch和MATLAB pwelch没有提供相同的答案

时间:2018-05-10 02:29:31

标签: python matlab scipy

我在python中使用名为welch(https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.signal.welch.html)的scipy.signal方法遇到了麻烦,它估计了时间信号的频谱,因为它(根本没有)提供与MATLAB相同的输出给定相同参数(窗口大小,重叠等)的方法称为pwelch。 Beneath是我在每种语言中的代码,输入文件和输出文件在这里的链接中:

https://www.dropbox.com/s/2ch36phbbmjfhqg/inputs_outputs.zip?dl=0

输入是2D数组,其中行是时间步长,每列是信号段。输出中的列是输入中相应列的光谱。

的Python:

import numpy as np
from scipy.signal import welch, get_window
input = np.genfromtxt('python_input.csv', delimiter=',')
fs = 128

window = get_window('hamming', fs*1)
ff,yy = welch(input, fs=fs, window = window, noverlap = fs/2, nfft=fs*2, 
axis=0, scaling="density", detrend=False)
np.savetxt("python_spectrum.csv", 10*np.log10(yy), delimiter=",")

MATLAB:

input       = csvread('matlab_input.csv');
fs          = 128
win         = hamming(fs);
[pxx,f]     = pwelch(input ,win,[],[],fs,'psd');
csvwrite('matlab_spectrum.csv',pxx);

我怀疑scipy是问题所在,因为它的输出在反映我使用的滤波器(4阶的butterworth带通从0.3到35 Hz with filtfilt)方面没有意义 - 然而,MATLAB的输出:

Each methods output using imagesc in MATLAB

这里有一些元素差异的图表

Elementwise differences (y-axis should be 0-64!) (the third plot I have excluded the most extreme values)

我确实试过一个简单的正弦曲线,它在两种编程语言中运行良好 - 所以我完全迷失了。

1 个答案:

答案 0 :(得分:4)

您的Python和MATLAB文件没有以相同的方式排序,这会给您带来错误。即使数组的形状相同,这些值在Python中按行排序,在MATLAB中按列排序。

您可以通过重新整形输入数组并进行转置来解决此问题。这将为您提供与MATLAB中相同的值排序:

input = input.reshape((input.shape[1], input.shape[0])).T