在数据上使用Scipy的signal.welch命令:ValueError和维度不匹配?

时间:2014-07-25 15:17:39

标签: python matlab scipy signal-processing

我试图使用实际数据绘制我的第一个功率谱密度图,而不是在Python中纯粹理论和生成的东西。但是,我无法解决任何问题。代码附在下面,然后是第19行之后我在控制台中收到的错误。

不知道它是否有所作为,但我从主要在MATLAB中工作过渡到Python。我不指望永远访问许可证,所以我真的想学习如何开始用Python做所有事情。但这很难。

代码:

import numpy as np
from scipy import signal
import scipy.io
import matplotlib.pyplot as plt

#import data from a .mat file using the loadmat command
mat = scipy.io.loadmat('Mic_Data_Sums.mat')

# 1 x 1 array, sampling frequency of 22050 Hz
fs = mat['Fs']

# Attempted fix: change data type to 8-point float?
# fs = fs.astype('f8')

# 13 x 1323000 array - 13 separate time series of data, 60 seconds each
data = mat['Mic_Data_Sums']

# Welch function - transpose 'data' and use the 2nd time series
f, Pxx_spec = signal.welch(data.T[1], fs, window = 'hanning', nperseg = fs,
    noverlap = fs/2, scaling = 'spectrum')

控制台:

/Users/******/anaconda/lib/python3.4/site-packages/scipy/signal/spectral.py:297: RuntimeWarning: divide by zero encountered in double_scalars
  scale = 1.0 / win.sum()**2
Traceback (most recent call last):
  File "plotPSDs.py", line 20, in <module>
    noverlap = fs/2, scaling = 'spectrum')
  File "/Users/******/anaconda/lib/python3.4/site-packages/scipy/signal/spectral.py", line 333, in welch
    xft = fftpack.rfft(x_dt*win, nfft)
ValueError: operands could not be broadcast together with shapes (22050,) (0,22051) 

请注意ValueError标记如何为我提供奇怪的形状(维度)结果:我不知道22051的来源。

编辑:作为一种解决方案解决方案,我注释掉fs = mat['Fs']行,并将其替换为fs = 22050,这使代码成功执行。但问题仍然存在,为什么我不能简单地引用变量,因为它存储在.mat文件中?

1 个答案:

答案 0 :(得分:1)

[来自上述评论]如果您知道fs是1x1,请尝试将fs[0,0]传递给welchwelch的文档字符串表示fs应该是一个浮点数,因此如果给它一个二维数组,它可能会出现不可预测的行为。 - Warren Weckesser 22小时前

这很好用。我实现的代码是:

# 1 x 1 array, sampling frequency (22050 Hz)
fs = mat['Fs']
fs = fs[0,0]

然后使用之前的代码,

f, Pxx_spec = signal.welch(data.T[1], fs, window = 'hanning', nperseg = fs,
noverlap = fs/2, scaling = 'spectrum')