Python中Whittaker–Shannon(sinc)插值是否已有现成实现?
Whittaker–Shannon插值的Scipy实现方案
Scipy的interp1d确实没有内置Whittaker–Shannon插值的选项,但你有两种可行的实现方式:
1. 手动实现(适用于均匀采样场景)
Whittaker–Shannon插值基于奈奎斯特采样定理,核心公式是采样点的sinc函数加权求和,对于均匀采样的数据,手动实现非常直接:
import numpy as np def whittaker_shannon_interp(x, y, x_new): # 假设输入x是均匀间隔的采样点 dx = x[1] - x[0] # 生成sinc权重矩阵 sinc_weights = np.sinc((x_new[:, np.newaxis] - x) / dx) # 加权计算插值结果 return np.dot(sinc_weights, y)
如果是非均匀采样的场景,公式需要调整为带权重的sinc求和,但这种情况Whittaker–Shannon的理论假设不成立,实际应用价值有限。
2. 利用Scipy的信号处理工具
如果你处理的是时域信号,Scipy的scipy.signal.resample本质上就是基于Whittaker–Shannon插值实现的,它可以直接将采样信号重采样到指定点数,等价于完成插值操作。
关于为什么interp1d不包含该算法
虽然Whittaker–Shannon在理论上很重要,但实际应用中存在明显局限性:
- 严格依赖奈奎斯特采样准则,对非均匀采样数据效果很差
- 计算量随采样点数量线性增长,大样本场景下效率远低于样条、线性插值
- sinc函数的旁瓣会引发吉布斯现象,导致插值结果出现不必要的振荡
这些原因使得它没有成为interp1d的常规选项,更多用于信号处理领域的重采样场景。
内容的提问来源于stack exchange,提问作者user171780
相关产品推荐
相关产品推荐

