基于interp1/spline的不等长信号重采样长度匹配问题求助
解决信号插值匹配长度的问题
我之前也踩过类似的手动构造插值点的坑,给你分享几个靠谱的解决方案:
1. 精准生成对应长度的插值点(最直接的方法)
你之前手动计算xq的方式容易因为浮点精度或非整数比例出现长度偏差,换用linspace函数就能完美解决——它可以精确生成指定数量的均匀分布点,覆盖原时间向量x2的整个区间,完全不需要担心长度不匹配:
% 生成恰好与y1长度一致的查询时间向量 xq = linspace(x2(1), x2(end), length(y1)); % 用spline插值得到匹配长度的y2_interp y2_interp = interp1(x2, y2, xq, 'spline'); % 计算RMS误差 RMS = rms(y1 - y2_interp);
linspace会自动计算每个点的间隔,不管原长度比例是不是整数,都能保证生成的xq长度正好是length(y1),彻底解决你之前的长度匹配问题。
2. 时间轴对齐的插值(更严谨的信号比较方式)
如果x1和x2是对应信号的实际时间轴,其实更合理的做法是直接把y2插值到x1的时间点上,这样不仅长度匹配,信号的时间维度也完全对齐,避免单纯拉伸长度带来的物理意义偏差:
% 直接用y1的时间轴x1作为插值查询点 y2_interp = interp1(x2, y2, x1, 'spline'); RMS = rms(y1 - y2_interp);
这种方式下,y2_interp的长度自然和y1一致(因为x1的长度就是length(y1)),同时保证每个插值点都对应y1的实际采样时间,比较结果更有意义。
关于resample的替代说明
你提到resample有混叠问题且不想滤波,上面的interp1方法完全不需要滤波步骤,它是纯插值操作,不会引入resample的低通滤波,正好符合你的需求。如果用resample且关闭滤波(n=0),本质是直接重采样,容易出现采样失真,所以不推荐。
内容的提问来源于stack exchange,提问作者RubenS
相关产品推荐
相关产品推荐

