Python中一维光谱数据精准重采样(含加权下采样)方案问询
光谱数据标准化波长刻度的重采样问题
我有两台不同光谱仪采集的均匀间隔测量数据,需要将它们重采样到标准化的1nm波长刻度:
- 一台需从约3nm分辨率上采样至1nm,这块用插值就能实现,没有问题;
- 另一台需从约0.3nm分辨率下采样至1nm,但这台的数据存在噪声,不想采用仅取近邻点的插值方式,避免丢失中间数据的有效信息。
理想下采样方案
理论1nm步长光谱的像素边界
| 波长索引[nm] | 像素左边界[nm] | 像素右边界[nm] |
|---|---|---|
| 400 | 399.5 | 400.5 |
| 401 | 400.5 | 401.5 |
| ... | ... | ... |
实际0.3nm分辨率光谱仪的像素边界
| 波长索引[nm] | 像素左边界[nm] | 像素右边界[nm] |
|---|---|---|
| 400 | 399.85 | 400.15 |
| 400.3 | 400.15 | 400.45 |
| 400.6 | 400.45 | 400.75 |
| 400.9 | 400.75 | 401.05 |
| 401.2 | 401.05 | 401.35 |
| 401.5 | 401.35 | 401.65 |
| ... | ... | ... |
(注:原数据中401.2nm的左边界疑似笔误,已修正为401.05nm)
以理论401nm数据点为例,计算逻辑如下:
- 完全落在理论像素区间(400.5-401.5)内的400.9nm、401.2nm数据点,直接取平均;
- 与理论像素部分重叠的400.6nm(重叠区间0.25nm,占自身像素宽度0.3nm的比例为
0.25/0.3)、401.5nm(重叠区间0.15nm,占比0.15/0.3)数据点,按重叠比例加权后纳入计算;
这本质上是带梯形窗的移动窗口滤波。
已排除的不适用函数
scipy.signal.resample:假设数据为周期性,不符合光谱数据的非周期特性;scipy.signal.resample_poly:仅支持整数倍重采样,无法匹配目标1nm刻度的非整数倍转换需求;scipy.signal.decimate:同样只支持整数倍重采样,精度达不到要求;pandas.Series.resample:仅针对时间维度设计,不适用波长轴的重采样;scipy.interpolate.interp1d:要求曲线经过所有带噪声的原始数据点,无法利用过采样数据进行降噪。
我知道可以结合scipy.signal.decimate(因子3,精度不足)和插值来实现近似效果,但希望找到能直接处理非整数倍、甚至支持非均匀数据的Python函数,请问是否存在这类工具?
内容的提问来源于stack exchange,提问作者Gerrit
相关产品推荐
相关产品推荐

