这是本人本科毕业设计中的一些探索性代码,由于本人对滤波器的理解较为浅薄和粗糙,所以在信号的处理上并不专业,如有专业人士愿意不吝赐教,深表感激。
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()
所得对比图如下,蓝色为原始信号,橙色为编码后解码的信号,可以观察到解码后的信号很好的还原了原始信号。