使用sinc函数进行插值

时间:2017-03-21 05:02:30

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

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

我的老师希望我们使用sinc函数对其进行插值,因此我使用Google搜索并且数学文档说我应该这样做:

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

它只是没有正常工作,我从上面得到了这个:

Figure

你能告诉我我做错了什么,或者sinc只适用于"大"域?

1 个答案:

答案 0 :(得分:4)

您还应该在时间方向上缩放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);