ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用Psychopy实现SSVEP二分类闪烁块,并进行CCA计算

2022-05-08 10:34:55  阅读:331  来源: 互联网

标签:signals SSVEP sti sin fr np pi CCA Psychopy


import numpy as np
from psychopy import visual, core


def present_stim(sti_fr_list=[1, 1], stim_time=3.0):
    win = visual.Window(size=(1280, 130), pos=(0, 543), color=(0, 0, 0))

    block1 = visual.Rect(win, pos=(-0.82, 0), size=(0.3, 1.8), fillColor='white')
    block1.autoDraw = True
    frq1 = sti_fr_list[0]

    block2 = visual.Rect(win, pos=(0.82, 0), size=(0.3, 1.8), fillColor='white')
    block2.autoDraw = True
    frq2 = sti_fr_list[1]

    timer = core.Clock()
    timer.reset()
    now_time = 0
    while now_time < stim_time:
        now_time = timer.getTime()
        block1.contrast = np.sin(2 * np.pi * now_time * frq1)
        block2.contrast = np.sin(2 * np.pi * now_time * frq2)
        win.flip()
    win.close()

主要思路就是调用core.Clock和visual,然后利用contrast(对比度)随时间改变来实现闪烁。

from sklearn.cross_decomposition import CCA
def ref_sig_gen(sti_fr_list, eeg_signals_len, sampling_rate=1000):
    ref_signals_all = []
    t_series = np.arange(eeg_signals_len) / sampling_rate
    for i, sti_fr in enumerate(sti_fr_list):
        sin1_0 = np.sin(2 * np.pi * sti_fr * t_series + 0.0)
        sin1_30 = np.sin(2 * np.pi * sti_fr * t_series + np.pi*0.166667)
        sin1_45 = np.sin(2 * np.pi * sti_fr * t_series + np.pi*0.25)
        sin1_60 = np.sin(2 * np.pi * sti_fr * t_series + np.pi*0.333333)
        sin1_90 = np.sin(2 * np.pi * sti_fr * t_series + np.pi*0.5)
        sin2_0 = np.sin(2 * np.pi * 2 * sti_fr * t_series + 0.0)
        sin2_90 = np.sin(2 * np.pi * 2 * sti_fr * t_series + np.pi*0.5)
        sin3_0 = np.sin(2 * np.pi * 3 * sti_fr * t_series + 0.0)
        sin3_90 = np.sin(2 * np.pi * 3 * sti_fr * t_series + np.pi*0.5)
        sin1_0 = np.sin(2 * np.pi * sti_fr * t_series + 0.0)

        ref_signals = np.vstack((sin1_0, sin1_30, sin1_45, sin1_60, sin1_90,
                                 sin2_0, sin2_90, sin3_0, sin3_90))
        ref_signals_all.append(ref_signals)
    return ref_signals_all


def process_cca(ref_sin, eeg_signals):
    ref_sin = ref_sin.T
    eeg_signals = eeg_signals.T
    cca_sklearn = CCA(n_components=1)
    cca_sklearn.fit(ref_sin, eeg_signals)
    X_c, Y_c = cca_sklearn.transform(ref_sin, eeg_signals)
    rho = np.corrcoef(X_c[:, 0], Y_c[:, 0])[0, 1]
    return rho


def get_sti_target(ref_signals_all, processed_eeg_datas):
    coef_list = []

    for i in range(len(ref_signals_all)):
        coef = process_cca(ref_signals_all[i], processed_eeg_datas)
        coef_list.append(coef)

    target_index = coef_list.index(max(coef_list))
    # target_index = 1
    print(target_index)
    return target_index

if __name__ == '__main__':
    present_stim()

标签:signals,SSVEP,sti,sin,fr,np,pi,CCA,Psychopy
来源: https://www.cnblogs.com/DWYCWWYHWYA/p/16244925.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有