9.12 sinc插值

文章目录

公式

  前文讲了傅里叶变换家族,如果要讲清楚,得单开一个专栏,这里就拿其中的sinc插值作为本专栏完结文章。

  Sinc变换,大白话就是将离散的的采样点,完美还原为函数。其公式超级简单:
x ( t ) = ∑ n = − ∞ ∞ x n ⋅ sinc ⁡ ( t − n T T ) x(t) = \sum_{n=-\infty}^{\infty} xn \cdot \operatorname{sinc}\left( \frac{t - nT}{T} \right) x(t)=n=−∞∑∞xn⋅sinc(Tt−nT)

  其中sinc函数是归一化的定义:
sinc ⁡ ( x ) = { sin ⁡ ( π x ) π x if x ≠ 0 1 if x = 0 \operatorname{sinc}(x) = \begin{cases} \dfrac{\sin(\pi x)}{\pi x} & \text{if } x \neq 0 \\ 1 & \text{if } x = 0 \end{cases} sinc(x)=⎩ ⎨ ⎧πxsin(πx)1if x=0if x=0

  T就是采样周期(不是数据展现的周期), n n n就是采样点的编号。

例子

  以下列数据为例子:

采样点编号 采样时间 数值
0 0.5 7
1 1 6
2 1.5 7
3 2 -1
4 2.5 7

  周期 T = 0.5 T=0.5 T=0.5,代入公式就是:
x ( t ) =    7    sinc ⁡  ⁣ ( t − 0 2 ) + 6    sinc ⁡  ⁣ ( t − 0.5 2 ) + 7    sinc ⁡  ⁣ ( t − 1 2 ) − 1    sinc ⁡  ⁣ ( t − 1.5 2 ) + 7    sinc ⁡  ⁣ ( t − 2 2 ) \begin{aligned} x(t)=&\;7\;\operatorname{sinc}\!\Bigl(\frac{t-0}{2}\Bigr) +6\;\operatorname{sinc}\!\Bigl(\frac{t-0.5}{2}\Bigr) \\ &+7\;\operatorname{sinc}\!\Bigl(\frac{t-1}{2}\Bigr) -1\;\operatorname{sinc}\!\Bigl(\frac{t-1.5}{2}\Bigr) \\ &+7\;\operatorname{sinc}\!\Bigl(\frac{t-2}{2}\Bigr) \end{aligned} x(t)=7sinc(2t−0)+6sinc(2t−0.5)+7sinc(2t−1)−1sinc(2t−1.5)+7sinc(2t−2)

实验

  将代码写好,再看看效果:

python 复制代码
import matplotlib
import numpy as np
import matplotlib.pyplot as plt

# -------------------------------------------------
# 1. 参数
T = 0.5                                 # 采样周期
                   # 采样点编号 0~4
x_n = np.array([7, 6, 7, -1, 7])       # 对应的幅值
n = np.arange(0, len(x_n))
# 2. sinc 插值函数(归一化 sinc)
def sinc_interp(t):
    """在任意实数 t 处返回 sinc 插值结果"""
    # 计算每个基函数的贡献并求和
    # np.sinc 的定义为 sin(pi*x)/(pi*x),恰好是归一化 sinc
    # 这里的自变量是 (t - n*T)/T
    return np.sum(x_n[:, None] *
                  np.sinc((t[None, :] - n[:, None] * T) / T), axis=0)

if __name__ == "__main__":
    # 3. 生成绘图用的时间轴
    t_fine = np.linspace(0, 12, 2000)   # 细密采样,覆盖几个周期

    # 4. 计算插值曲线
    x_fine = sinc_interp(t_fine)
    matplotlib.rcParams['font.family'] = 'Microsoft YaHei'  # Windows 常用

    # 5. 绘图
    plt.figure(figsize=(8, 4))
    # 连续插值曲线
    plt.plot(t_fine, x_fine, label='Sinc 插值', color='steelblue')
    # 采样点(用实心圆标记)
    plt.scatter([i * T for i in n], x_n, color="steelblue", s=60, edgecolor="k", alpha=0.8)
    # 美化
    plt.title(f'Sinc 插值重建(周期 $T={T}$)')
    plt.xlabel('时间 $t$')
    plt.ylabel('幅值')
    plt.grid(True, which='both', ls='--', alpha=0.5)
    plt.legend()
    plt.tight_layout()
    plt.gca().set_aspect('equal', adjustable='box')
    plt.show()

  效果为:

  可见,并不能还原为周期函数,在采样范围外,是越来越离谱了。

相关推荐
地平线开发者9 小时前
J6B vio scenario sample
算法
SelectDB15 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
BothSavage21 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn21 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽1 天前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
荣码1 天前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
金銀銅鐵1 天前
[Python] 基于欧几里得算法,实现分数约分计算器
python·数学
Lyn_Li1 天前
Kaggle Top 5 | 198只股票、200条数据的金融预测——BattleFin高分方案从零复现
python·kaggle·比赛复盘·金融预测