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

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

sinc 函数内插

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

也就是说第二种采样的采样率是第一种采样的采样率的M 倍。如果我们有了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内插是将数据周期延拓后计算的结果。

时间: 2024-12-11 05:11:51

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

离散时间序列的内插算法(利用fft)

有些时候,为了后续处理更方便,我们需要对采集到的数据点进行内插处理,也就是所谓的增采样.本文就来讨论一下常用的几种内插算法. 利用FFT实现信号内插 我们的信号 x(t) 是个实信号,带宽有限,能量有限.x[n] =x(nΔ)和 x'[n]  =x(nΔ')是对这个信号的两种采样,并且都满足采样定理的要求,也就是说信息并没有丢失.两次采样的采样率满足如下关系. 也就是说第二种采样的采样率是第一种采样的采样率的M 倍.如果我们有了x'[n],那么很容易获得x[n]: 但是反过来就不是那么容易了.下

STL算法设计理念 - 函数对象和函数对象当參数和返回值

函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)"的方式使用一个类对象,假设没有上下文,全然能够把它看作一个函数对待. 这是通过重载类的operator()来实现的. "在标准库中.函数对象被广泛地使用以获得弹性".标准库中的非常多算法都能够使用函数对象或者函数来作为自定的回调行为: demo #include <iostr

STL算法设计理念 - 函数对象和函数对象当参数和返回值

函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)"的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待. 这是通过重载类的operator()来实现的. "在标准库中,函数对象被广泛地使用以获得弹性",标准库中的很多算法都可以使用函数对象或者函数来作为自定的回调行为: demo #include <iostrea

STL 算法中函数对象和谓词

STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)"的方式使用一个类对象,如果没有上下文,完全可以把它看作一个函数对待.          这是通过重载类的operator()来实现的.          "在标准库中,函数对象被广泛地使用以获得弹性",标准库中的很多算法都可以使用函数

算法导论 - 函数的增长。

1.为什么我们要学习函数的增长? 因为在计算机编程的学习中,我们需要掌握一个类似于“需求量”的东西,怎么去理解需求量呢,举个最简单的例子,你有一个双层循环,这个双层循环所需要的时间,就是一个增长量.具体一点可以这么去解释这个问题,如果你在一个循环里面的每一个步骤所需要的时间都不同的话,那么:你的需求量就是一个分布式的增长.我们需要了解一个程序的线性增长或者减少,就必须要了解一些实质性的东西.废话不多,下面开始讲解各个知识点: 2.渐进记号 这里我还是不想照着书上讲,那样太没意思了,我就说说我个人

hdu 2112 HDU Today &lt;迪杰斯特拉算法+map函数&gt;

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19697    Accepted Submission(s): 4635 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 传入函数 函数的本身也可以作为参数. Python内建的mapreduce的函数.(来源于谷歌的,后来被道格这家伙开源了,成为当今处理大数据最火热的hadoop中的计算模型---MapReduce) 我们先看map.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序

时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息

from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在之后的走势,三次指数平滑(Triple/Three Order Exponential Smoothing,Holt-Winters)算法可以很好的进行时间序列的预测. 时间序列数据一般有以下几种特点:1.趋势(Trend)  2. 季节性(Seasonality). 趋势描述的是时间序列的整体走势

粒子群算法的寻优算法-非线性函数极值寻优

一.简介   粒子群算法又被称为粒子群优化算法(PSO).粒子群算法是源于对鸟群捕食的行为研究:是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法. 二.粒子群算法分析 1.基本思想 粒子群算法通过设计一种粒子来模拟鸟群中的鸟类个体,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向.每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,不断迭代,更新速度和位