码迷,mamicode.com
首页 > 编程语言 > 详细

离散时间序列的内插算法(sinc 函数内插)

时间:2014-12-21 16:38:32      阅读:894      评论:0      收藏:0      [点我收藏+]

标签:

有些时候,为了后续处理更方便,我们需要对采集到的数据点进行内插处理,也就是所谓的增采样。本文就来讨论一下常用的几种内插算法。

sinc 函数内插

我们的信号 x(t) 是个实信号,带宽有限,能量有限。x[n] =x(nΔ)和 x’[n]  =x(nΔ’)是对这个信号的两种采样,并且都满足采样定理的要求,也就是说信息并没有丢失。两次采样的采样率满足如下关系。

技术分享

也就是说第二种采样的采样率是第一种采样的采样率的倍。如果我们有了x’[n],那么很容易获得x[n]:

技术分享

但是反过来就不是那么容易了。下面就来推导如何在已知x[n]的情况下,计算出x’[n]。

对于连续信号x(t),有如下关系。

技术分享

对于离散信号x[n],有如下关系。

技术分享

这里的ω与Ω的关系如下:ω=ΩΔ,那X’(ω)与X(Ω)有什么关系呢?我们先假设X’(ω)=X(Ω),那么有:

技术分享

这说明,X’(ω)=X(Ω)/Δ。利用这个关系式,可以得到:

技术分享


至此,利用sinc函数内插的公式就出来了:

技术分享

当Δ=1时,上面式子还可以简化为:

技术分享

下面是个测试例子,scilab 语言的。

function y = sinc_interp(x, n)
    s = size(x);
    if s(1) == 1 then 
        nx = s(2);
        ny =  (nx) * n;
        s(2) = ny;
    else
        nx = s(1);
        ny =  (nx) * n;
        s(1) = ny;
    end
    y = zeros(s(1), s(2));
    
    for(i = 1 : ny)
        t = (i - 1) / n + 1;
        a = ceil( t - 5 );
        b =  floor(t + 5);
        if (a < 1) then a = 1;  end
        if (b > nx) then b = nx;  end   
        if t == int(t) then
            y(i)  = x(t);
        else
            z = 0;
            for j =a : b
                z = z + x(j) * sin((t-j)*%pi) / ((t-j)*%pi);
            end 
            y(i) = z;
        end    
    end   
endfunction
用这个函数随便测试了一个随机生成的数列的内插结果。
技术分享

再将这个结果与 fft 内插的结果比较一下,可以看到效果类似,之所以不完全相同,是因为这个代码中只用到了临近的5个数据点,而且到了边界处就直接截断处理了。而fft内插是将数据周期延拓后计算的结果。

技术分享

离散时间序列的内插算法(sinc 函数内插)

标签:

原文地址:http://blog.csdn.net/liyuanbhu/article/details/42061089

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!