【问题标题】:Using the sinc function for interpolation使用 sinc 函数进行插值
【发布时间】:2017-03-21 05:02:30
【问题描述】:

对于大学作业,我必须插入一些我之前从波中采样的点。只要我用interp1 函数对它们进行插值,它就可以工作。

我的老师希望我们使用 sinc 函数对其进行插值,所以我用谷歌搜索了它,mathworks 文档说我应该这样做:

rng default

t = 1:10;
x = randn(size(t))';
ts = linspace(-5,15,600);
[Ts,T] = ndgrid(ts,t);
y = sinc(Ts - T)*x;

plot(t,x,'o',ts,y)
xlabel Time, ylabel Signal
legend('Sampled','Interpolated','Location','SouthWest')
legend boxoff

它有效,但由于我必须插入缩小域中的点,我修改了代码以尝试插入范围从 01 的点:

rng shuffle

t = 0:0.1:1;
x = randn(size(t))';
ts = linspace(-1,2,600);
[Ts,T] = ndgrid(ts,t);
y = sinc(Ts - T)*x;

plot(t,x,'o',ts,y)
xlabel Time, ylabel Signal
legend('Sampled','Interpolated','Location','SouthWest')
legend boxoff

它只是不能正常工作,我从上面得到这个:

您能否告诉我我做错了什么,或者sinc 是否仅适用于“大”域?

【问题讨论】:

  • 你想实现/使用什么插值算法? “大”域中的结果是什么样的?

标签: matlab math signal-processing interpolation coordinate-transformation


【解决方案1】:

您还应该在时间方向上缩放您的 sinc 函数以适合您的数据:

dt = 0.1;
y = sinc((Ts - T)/dt)*x;

说明

因为你想在你的数据点之间进行插值,所以你应该确保其他数据点的插值函数(f)在当前数据点处为零:

f(k*dt) = 0    for all integers k != 0

众所周知

sinc(k) = 0    for all integers k != 0

因此你的插值函数应该是

f(t) = sinc(t/dt);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多