我试图使用实际数据绘制我的第一个功率谱密度图,而不是在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文件中?
答案 0 :(得分:1)
[来自上述评论]如果您知道fs
是1x1,请尝试将fs[0,0]
传递给welch
。 welch
的文档字符串表示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')