同步来自不同来源的多个信号。
Jointl的Python项目详细描述
联合:信号同步器
同步过程
为了使两个信号源相互同步,它们需要在两个共同的时间点上同时记录一个具有特征信号的信号。这可能是加速度计的大小,例如,如果多个设备一起震动。
选择公共段
脚本可以使用ShakeExtractor
自动检测显著的震动。这是通过检测特定threshold
上的峰值来完成的。如果两个峰值之间的距离不超过指定的distance
(以毫秒为单位),则它们将合并到序列中。小于min_length
峰的序列被过滤掉。在第二步中,从信号的开始和结束开始到结束的时间不在window
秒内开始或结束的序列被过滤。从这些过滤序列中,选择具有最高权重(序列的平均值+中值)的序列作为对应的片段。
计算时移
为了补偿不同源的系统时间差异,将计算使所选段彼此同步的时间偏移。为了自动计算两个信号之间的时移,计算每个段与参考信号的互相关。信号被移位,使得所选择的段之间的相关性最大化。
调整频率
由于时钟漂移表示时钟没有以与指定参考时钟完全相同的频率运行,因此可以在一个时间点同步的信号会随着时间的推移逐渐失去同步。为了补偿这种影响,计算了拉伸因子,使得基于第一和第二段的同步的时间偏移之间的差分别为零。拉伸信号后,必须再次计算校准信号的时移。
示例
同步数据
数据必须用pandasDataFrame
和DateTimeIndex
提供。
importjointlysources={'Faros':{'data':faros.data,'ref_column':'acc_mag',},'Empatica':{'data':empatica.data,'ref_column':'acc_mag',},'Everion':{'data':everion.data,'ref_column':'acc_mag',}}ref_source_name='Empatica'extractor=jointly.ShakeExtractor()synchronizer=jointly.Synchronizer(sources,ref_source_name,extractor)synced_data=synchronizer.get_synced_data()
保存数据
要定义应该保存的表,请创建字典。根级别的每个键都定义了相应文件的名称。第二级的字典为每个源定义一个列列表,这些列应该保存在此文件中。save_data()
方法还将自动将来自所有源的所有数据保存在名为TOTAL.csv
的文件中。这可以通过添加参数save_total_table = False
来停用。
tables={'ACC':{'Faros':['Accelerometer_X','Accelerometer_Y','Accelerometer_Z'],'Empatica':['acc_x','acc_y','acc_z'],'Everion':['accx_data','accy_data','accz_data'],},'PPG':{'Empatica':['bvp'],'Everion':['blood_pulse_wave','led2_data','led3_data'],},'EDA':{'Empatica':['eda'],'Everion':['gsr_electrode'],},'ECG':{'Faros':['ECG'],},'TEMP':{'Empatica':['temp'],'Everion':['temperature_object'],},'HR':{'Empatica':['hr'],'Everion':['heart_rate','heart_rate_quality'],},'IBI':{'Faros':['HRV'],'Empatica':['ibi'],'Everion':['inter_pulse_interval','inter_pulse_interval_deviation'],}}synchronizer.save_data(sync_dir_path,tables=tables)
日志记录
要激活日志记录,只需在代码中添加以下行:
fromjointly.logimportloggerlogger.setLevel(10)
这将使您深入了解震动检测、时移和拉伸因子的计算以及分段的输出图。