Python实现EEG串行数据流12位有效信息提取的性能优化问题
EEG串行驱动数据解析性能优化问题
我正在开发EEG(时间序列采集设备)的串行驱动,该设备共26个通道,每个通道数据采用12bit编码,采样率为200Hz。
串行数据流由标识字节0xA0开头,其后跟随45字节的数据块,承载26个通道各12bit编码的采样数据。
解析难点:这些12bit数据在45字节块中并非处于固定位置,第一个字节仅使用低4位(4 LSB),剩余44个字节各仅使用低7位(7 LSB)。
为了更直观地说明,用如下示例展示:假设启动放大器后所有通道的输出均为12bit可表示的最大整型值4095(即所有数据位为1),那么数据流格式如下:
a0 0f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f a0 下一个采样...
上述数据需要映射为1~26号通道对应的整型值4095。
我编写了Python代码实现该逻辑:首先找到数据块的起始标识,将整段采样数据存入一个int/long类型变量,剔除固定位置的无效位,再在每12bit数据前补4个高位0转换为16bit表示,最后将字节数组转换为整型列表。
代码功能运行正常,但存在性能问题:单采样点的处理耗时过高,而系统要求每秒处理200个采样点,叠加真实串口读取的其他延迟后,200个采样点的总处理耗时需要远低于1秒。
# Python代码 def readByte(): # 模拟实现 return 0xA0 def read45bytes(): return int(0x0f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f) def remove_bit(num, i): mask = num >> (i + 1) mask = mask << i right = ((1 << i) - 1) & num return mask | right def insert_mult_bits(num, bits, len, i): mask = num >> i mask = (mask << len) | bits mask = mask << i right = ((1 << i) - 1) & num return right | mask def main(): while(readByte()!=0xA0): print("正在查找45字节数据包的起始位置...") print("已找到45字节数据包起始位置") # 读取完整采样数据 sample=read45bytes() # 移除未使用的位 corr=0 for i in range(7, sample.bit_length(), 8): sample=remove_bit(sample,i-corr) corr=corr+1 # 补充高位转换为2字节表示 corr=0 for i in range(12,sample.bit_length(),12): sample=insert_mult_bits(sample,0,4,i+corr) corr=corr+4 # 转换为26通道×2字节的大端字节数组 bt=sample.to_bytes(26*2,'big') # 转换为整型结果列表 idx=0 out=[] for i in range(0,26*2-1,2): out.append(int((bt[i]<<8 | bt[i+1]))) idx=idx+1 # 打印1号通道的第一个采样值 print(out.pop(0))
内容的提问来源于stack exchange,提问作者Aleks
相关产品推荐
相关产品推荐

