BSA编码及解码

这是本人本科毕业设计中的一些探索性代码,由于本人对滤波器的理解较为浅薄和粗糙,所以在信号的处理上并不专业,如有专业人士愿意不吝赐教,深表感激。

BSA代码

对原始信号的处理对解码质量的影响很大...但是原文也没说他是怎么处理的。这里采用的是z-score处理,即减均值除以方差(我试过减最小值除以最大值减最小值的做法,结果来看不太好)。

def BSA(input, filter, threshold, channels_num=23):
    """

    :param input: 形状为 [23,1024]
    :param filter: 滤波器
    :param threshold: 阈值
    :return:
    """
    data = input.copy()
    output = np.zeros(shape=(data.shape[0], data.shape[1]))
    global mul
    global sigma
    global Min
    for i in range(channels_num):
        mul[i]=mean(data[i,:])
        sigma[i]=np.std(data[i,:])
        data[i,:]=(data[i,:]-mul[i])/sigma[i]
    # for i in range(channels_num):
    #     Min[i] = min(data[i, :])
    #     data[i, :] = data[i, :] - Min[i]
    for channel in range(channels_num):
        for i in range(data.shape[1]):
            error1 = 0
            error2 = 0
            for j in range(len(filter)):
                if i + j - 1 <= data.shape[1] - 1:
                    error1 += abs(data[channel][i + j - 1] - filter[j])
                    error2 += abs(data[channel][i + j - 1])
            if error1 <= (error2 - threshold):
                output[channel][i] = 1
                for j in range(len(filter)):
                    if i + j - 1 <= data.shape[1] - 1:
                        data[channel][i + j - 1] -= filter[j]
            else:
                output[channel][i] = 0
    output = np.array(output)
    print("BSA编码结束:形状为:",output.shape)
    return output

BSA解码代码

def decoding(spikings, filter):
    output = np.zeros(shape=(spikings.shape[0], spikings.shape[1]))
    s = 0
    for channel in range(23):
        for t in range(spikings.shape[1]):
            for k in range(len(filter)):
                s += spikings[channel][t - k] * filter[k]
            output[channel][t] = s
            s = 0
    global mul
    global sigma
    global Min
    for channel in range(spikings.shape[0]):
        output[channel,:]=output[channel,:]*(sigma[channel])+mul[channel]
    # for channel in range(spikings.shape[0]):
    #     output[channel, :] = output[channel, :] + Min[channel]
    return output

测试代码,所用数据为本人另一篇博客中所得到的波士顿儿童医院癫痫数据集,形状为[样本数,23,1024],但本代码最令我迷惑的地方在于,似乎在我使用的这种滤波器下只能对正的信号进行编码,而对负的信号则全部为0,由于我对滤波器的了解不深,故我将负的信号转成正的信号...但这种方法在生物可解释性上不知道该怎么说....但结果上是合理的,如果大家参考了我的代码,还请大家在这方面自行考虑。

NUM_TAPS = 11
CUT_OFF_FREQ = 15
dlti_filter = signal.dlti(signal.firwin(NUM_TAPS, cutoff=CUT_OFF_FREQ, fs=2.0), [1] + [0] * 10, 1)
t, imp = signal.dimpulse(dlti_filter, n=NUM_TAPS)

data=np.load("seizure_data.npy")

BSA_code1=BSA(data[0,:,:],np.squeeze(imp),2.8) #正值部分
BSA_code2=BSA(-data[0,:,:],np.squeeze(imp),2.8) #负值部分
BSA_code=BSA_code1-BSA_code2 
decode=decoding(BSA_code,np.squeeze(imp)) #解码



plt.figure(0,figsize=(10,3))
plt.plot(range(1,len(data[0,0,:])+1),data[0,0,:])
plt.plot(range(1,len(decode[0,:])+1),decode[0,:])
plt.show()

所得对比图如下,蓝色为原始信号,橙色为编码后解码的信号,可以观察到解码后的信号很好的还原了原始信号。

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值