如何使用Scipy对时间序列进行浮点因子下采样以对齐传感器数据
支持浮点下采样因子的信号对齐方案
针对你的需求,这里有两种可靠的方法,既能处理浮点下采样因子,又能应用抗混叠滤波保证结果准确性:
方法1:使用scipy.signal.resample_poly处理有理分数采样率转换
3.6可以转化为分数18/5,对应采样率从180Hz降到50Hz的比例是50/180 = 5/18。resample_poly函数支持通过分子(up)和分母(down)指定采样率转换比例,并且会自动应用抗混叠FIR滤波器,完美适配你的场景。
代码示例:
import numpy as np from scipy.signal import resample_poly # 模拟数据 sensorOneData = np.random.rand(50) sensorTwoData = np.random.rand(180) # 采样率转换:180Hz -> 50Hz,对应up=5,down=18 alignedSensorTwoData = resample_poly(sensorTwoData, up=5, down=18) # 验证输出长度:应该和sensorOneData一致(50) print(alignedSensorTwoData.shape[0]) # 输出50
方法2:分步插值+整数下采样
如果需要更灵活控制滤波过程,可以先将传感器2的数据上采样到原采样率和目标采样率的最小公倍数对应的采样率,再进行整数下采样:
- 180Hz和50Hz的最小公倍数是900Hz,先把180Hz的数据上采样5倍到900Hz;
- 再将900Hz的数据下采样18倍到50Hz,这里可以用
decimate函数(支持整数因子,且自带抗混叠滤波)。
代码示例:
import numpy as np from scipy.signal import decimate, resample sensorOneData = np.random.rand(50) sensorTwoData = np.random.rand(180) # 步骤1:上采样到900Hz(180*5) upsampled = resample(sensorTwoData, len(sensorTwoData)*5) # 步骤2:下采样18倍到50Hz(900/18) alignedSensorTwoData = decimate(upsampled, 18) print(alignedSensorTwoData.shape[0]) # 输出50
两种方法都能保证抗混叠滤波的应用,输出和传感器1长度一致的对齐数据。相比resample,它们解决了无抗混叠滤波的问题;相比decimate,则支持了非整数的下采样因子需求。
内容的提问来源于stack exchange,提问作者RabbitBadger
相关产品推荐
相关产品推荐

