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()

  效果为:

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

相关推荐
阿正的梦工坊14 分钟前
【Rust】07-错误处理:Option、Result 与 ? 运算符
开发语言·算法·rust
Zella折耳根18 分钟前
复习篇-继承和接口
java·开发语言·python
诗词在线22 分钟前
求推荐飞花令
大数据·人工智能·python
yijianace36 分钟前
Python线程与多线程完全总结(从入门到理解并发本质)
开发语言·python
八解毒剂2 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
会Tk矩阵群控的小木2 小时前
基于Python的iMessage短信群发与社媒多账号统一管理系统实现
开发语言·windows·python·新媒体运营·开源软件·个人开发
运行时记录2 小时前
别再手动写提示词了 — SkillOpt 让技能文档自己进化
算法
质造者2 小时前
LangChain + Ollama + Tavily 实现旅游问答系统
linux·人工智能·python·langchain·rag
啦啦啦啦啦zzzz2 小时前
算法总结(二分查找、双指针)
c++·算法
伊布拉西莫2 小时前
【流畅的Python】第20章:并发执行器 — 学习笔记
笔记·python·学习