使用 scipy 创建大脑信号的小波变换
Creating wavelet transform of brain signals using scipy
我正在尝试创建我的大脑信号的时频表示。我想为 0hz - 120hz 的频率创建数据(因此它可以覆盖 delta、theta、alpha、beta、low-gamma 和 high-gamma 频段)。
这是我的代码:
首先,我可视化我的大脑信号:
ax1.plot(list(range(stc_broca_tmp2.shape[1])), brain_signal, linewidth=3, color='blue')
结果:
brain_signal.shape
我正在尝试创建我的大脑信号的时频表示。我想为 0hz - 120hz 的频率创建数据(因此它可以覆盖 delta、theta、alpha、beta、low-gamma 和 high-gamma 频段)。
这是我的代码:
首先,我可视化我的大脑信号:
ax1.plot(列表(范围(stc_broca_tmp2.shape1)), brain_signal, 线宽=3, 颜色='blue')
结果:
在此处输入图片描述
brain_signal.shape
(353191,)
然后我使用下面的代码来计算它的时频表示:
t = np.linspace(0, signal_length, signal_length, endpoint=False)
#brain_signal = stc_broca[3, :]
widths = np.arange(0, 130)
cwtmatr = signal.cwt(brain_signal, signal.ricker, widths)
plt.imshow(cwtmatr, extent=[0, signal_length, 0, 130], cmap='PRGn', aspect='auto',
vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
plt.show()
但是,我收到以下错误:
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) in 2 #brain_signal =
stc_broca[3, :] 3 widths = np.arange(0, 130) ----> 4 cwtmatr =
signal.cwt(brain_signal, signal.ricker, widths) 5 plt.imshow(cwtmatr,
extent=[0, signal_length, 0, 130], cmap='PRGn', aspect='auto', 6
vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
/usr/local/lib/python3.6/dist-packages/scipy/signal/wavelets.py in
cwt(data, wavelet, widths, dtype, **kwargs) 478 N = int(N) 479
wavelet_data = np.conj(wavelet(N, width, **kwargs)[::-1]) --> 480
output[ind] = convolve(data, wavelet_data, mode='same') 481 return
output
/usr/local/lib/python3.6/dist-packages/scipy/signal/signaltools.py in
convolve(in1, in2, mode, method) 1276 # fastpath to faster
numpy.convolve for 1d inputs when possible 1277 if _np_conv_ok(volume,
kernel, mode): -> 1278 return np.convolve(volume, kernel, mode) 1279
1280 return correlate(volume, _reverse_and_conj(kernel), mode,
'direct')
<array_function internals> in convolve(*args, **kwargs)
~/.local/lib/python3.6/site-packages/numpy/core/numeric.py in
convolve(a, v, mode) 813 raise ValueError('a cannot be empty') 814 if
len(v) == 0: --> 815 raise ValueError('v cannot be empty') 816 mode =
_mode_from_name(mode) 817 return multiarray.correlate(a, v[::-1], mode)
ValueError: v cannot be empty
我的大脑信号不是空的。为什么我会收到这样的错误?
提前致谢
您的 widths
必须从 1 而不是 0 开始。这是使用随机数据的示例。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
N = 5000
rnd = np.random.RandomState(12345)
brain_signal = np.sin(np.linspace(0, 1000, N)) + rnd.uniform(0, 1, N)
widths = np.arange(1, N//8)
cwtmatr = signal.cwt(brain_signal, signal.ricker, widths)
fig, ax = plt.subplots(nrows=2, ncols=1, figsize=(10, 6))
axes = ax.flatten()
sns.lineplot(np.linspace(0, 1000, N), brain_signal, ax=axes[0], lw=2)
sns.heatmap(cwtmatr, cmap='Spectral', ax=axes[1]);
axes[0].set_title('Brain signal')
axes[1].set_title('CWT of brain signal')
plt.tight_layout()
我正在尝试创建我的大脑信号的时频表示。我想为 0hz - 120hz 的频率创建数据(因此它可以覆盖 delta、theta、alpha、beta、low-gamma 和 high-gamma 频段)。
这是我的代码:
首先,我可视化我的大脑信号:
ax1.plot(list(range(stc_broca_tmp2.shape[1])), brain_signal, linewidth=3, color='blue')
结果:
brain_signal.shape
我正在尝试创建我的大脑信号的时频表示。我想为 0hz - 120hz 的频率创建数据(因此它可以覆盖 delta、theta、alpha、beta、low-gamma 和 high-gamma 频段)。
这是我的代码:
首先,我可视化我的大脑信号:
ax1.plot(列表(范围(stc_broca_tmp2.shape1)), brain_signal, 线宽=3, 颜色='blue') 结果:
在此处输入图片描述
brain_signal.shape (353191,)
然后我使用下面的代码来计算它的时频表示:
t = np.linspace(0, signal_length, signal_length, endpoint=False)
#brain_signal = stc_broca[3, :]
widths = np.arange(0, 130)
cwtmatr = signal.cwt(brain_signal, signal.ricker, widths)
plt.imshow(cwtmatr, extent=[0, signal_length, 0, 130], cmap='PRGn', aspect='auto',
vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
plt.show()
但是,我收到以下错误:
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) in 2 #brain_signal = stc_broca[3, :] 3 widths = np.arange(0, 130) ----> 4 cwtmatr = signal.cwt(brain_signal, signal.ricker, widths) 5 plt.imshow(cwtmatr, extent=[0, signal_length, 0, 130], cmap='PRGn', aspect='auto', 6 vmax=abs(cwtmatr).max(), vmin=-abs(cwtmatr).max())
/usr/local/lib/python3.6/dist-packages/scipy/signal/wavelets.py in cwt(data, wavelet, widths, dtype, **kwargs) 478 N = int(N) 479 wavelet_data = np.conj(wavelet(N, width, **kwargs)[::-1]) --> 480 output[ind] = convolve(data, wavelet_data, mode='same') 481 return output
/usr/local/lib/python3.6/dist-packages/scipy/signal/signaltools.py in convolve(in1, in2, mode, method) 1276 # fastpath to faster numpy.convolve for 1d inputs when possible 1277 if _np_conv_ok(volume, kernel, mode): -> 1278 return np.convolve(volume, kernel, mode) 1279 1280 return correlate(volume, _reverse_and_conj(kernel), mode, 'direct')
<array_function internals> in convolve(*args, **kwargs)
~/.local/lib/python3.6/site-packages/numpy/core/numeric.py in convolve(a, v, mode) 813 raise ValueError('a cannot be empty') 814 if len(v) == 0: --> 815 raise ValueError('v cannot be empty') 816 mode = _mode_from_name(mode) 817 return multiarray.correlate(a, v[::-1], mode)
ValueError: v cannot be empty
我的大脑信号不是空的。为什么我会收到这样的错误?
提前致谢
您的 widths
必须从 1 而不是 0 开始。这是使用随机数据的示例。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
N = 5000
rnd = np.random.RandomState(12345)
brain_signal = np.sin(np.linspace(0, 1000, N)) + rnd.uniform(0, 1, N)
widths = np.arange(1, N//8)
cwtmatr = signal.cwt(brain_signal, signal.ricker, widths)
fig, ax = plt.subplots(nrows=2, ncols=1, figsize=(10, 6))
axes = ax.flatten()
sns.lineplot(np.linspace(0, 1000, N), brain_signal, ax=axes[0], lw=2)
sns.heatmap(cwtmatr, cmap='Spectral', ax=axes[1]);
axes[0].set_title('Brain signal')
axes[1].set_title('CWT of brain signal')
plt.tight_layout()