【问题标题】:Creating wavelet transform of brain signals using scipy使用 scipy 创建大脑信号的小波变换
【发布时间】:2021-10-01 19:10:44
【问题描述】:

我正在尝试创建我的大脑信号的时频表示。我想为 0hz - 120hz 的频率创建数据(因此它可以覆盖、delta、theta、alpha、beta、低伽马和高伽马频段)。

这是我的代码:

首先,我可视化我的大脑信号:

ax1.plot(list(range(stc_broca_tmp2.shape[1])), brain_signal, linewidth=3, color='blue')

结果:

brain_signal.shape

我正在尝试创建我的大脑信号的时频表示。我想为 0hz - 120hz 的频率创建数据(因此它可以覆盖、delta、theta、alpha、beta、低伽马和高伽马频段)。

这是我的代码:

首先,我可视化我的大脑信号:

ax1.plot(list(范围(stc_broca_tmp2.shape1)), brain_signal, linewidth=3, color='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 (last last call last) in 2 #brain_signal = stc_broca[3, :] 3 宽度 = np.arange(0, 130) ----> 4 cwtmatr = signal.cwt(brain_signal,signal.ricker,宽度)5 plt.imshow(cwtmatr, 范围=[0, 信号长度, 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 cwt(数据,小波,宽度,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 返回 输出

/usr/local/lib/python3.6/dist-packages/scipy/signal/signaltools.py convolve(in1, in2, mode, method) 1276 # fastpath to faster numpy.convolve 尽可能用于一维输入 1277 if _np_conv_ok(volume, 内核,模式):-> 1278 返回 np.convolve(体积,内核,模式)1279 1280 返回相关(音量,_reverse_and_conj(内核),模式, '直接')

in convolve(*args, **kwargs)

~/.local/lib/python3.6/site-packages/numpy/core/numeric.py 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 不能为空

我的大脑信号不是空的。为什么我会收到这样的错误?

提前致谢

【问题讨论】:

    标签: python numpy scipy signal-processing wavelet


    【解决方案1】:

    您的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()
    

    【讨论】:

    • 非常感谢。因此,y 轴显示的是频率值,对吧?
    • 另外,请您告诉我如何更改 y 轴上的值从轴底部的 0 开始? (目前0在顶部)
    • 对于这段代码,你可以使用axes[1].invert_yaxes()来反转y轴。对于其他情况,请将 axes[1] 替换为您的绘图返回的 ax
    • 非常感谢。是的,现在工作得很好。只是为了我的确认,y轴上的值显示频率值,对吗?
    • 是的,但是更正确的描述是 Y 轴是输入信号的 缩放 形式,因为小波(对于您的情况,小波更粗),X -轴是原始波中的时间点。对于每个缩放的组件,我们可以分配一个频率范围。我想你可以针对这个话题提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2021-02-02
    • 2019-07-02
    相关资源
    最近更新 更多