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



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

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

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

蟒:

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=",")

马特实验室:

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

我怀疑 scipy 是问题所在,因为它的输出在事先反映我使用的滤波器(使用 filtfilt 从 0.3 到 35 Hz 的 4 阶巴特沃斯带通(方面没有意义 - 然而,MATLAB 的输出确实如此:

每个方法都使用 MATLAB 中的 imagesc 输出

元素差异的一些图在这里

元素差异(y轴应为0-64!((第三块图我排除了最极端的值(

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

你的 Python 和 MATLAB 文件的排序方式不同,这会导致错误。即使数组的形状相同,这些值在 Python 中按行排序,在 MATLAB 中按列排序。

您可以通过重塑输入数组和转置来解决此问题。这将为您提供与 MATLAB 中相同的值顺序:

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

相关内容