离散时间序列的内插算法(sinc 函数内插)
2014-12-21 16:15
309 查看
有些时候,为了后续处理更方便,我们需要对采集到的数据点进行内插处理,也就是所谓的增采样。本文就来讨论一下常用的几种内插算法。
我们的信号 x(t) 是个实信号,带宽有限,能量有限。x
=x(nΔ)和 x’
=x(nΔ’)是对这个信号的两种采样,并且都满足采样定理的要求,也就是说信息并没有丢失。两次采样的采样率满足如下关系。
![](http://img.blog.csdn.net/20141220215620856?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
也就是说第二种采样的采样率是第一种采样的采样率的M 倍。如果我们有了x’
,那么很容易获得x
:
![](http://img.blog.csdn.net/20141220215634428?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
但是反过来就不是那么容易了。下面就来推导如何在已知x
的情况下,计算出x’
。
对于连续信号x(t),有如下关系。
![](http://img.blog.csdn.net/20141221160738679?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
对于离散信号x
,有如下关系。
![](http://img.blog.csdn.net/20141221160755343?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这里的ω与Ω的关系如下:ω=ΩΔ,那X’(ω)与X(Ω)有什么关系呢?我们先假设X’(ω)=X(Ω),那么有:
![](http://img.blog.csdn.net/20141221160847484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这说明,X’(ω)=X(Ω)/Δ。利用这个关系式,可以得到:
![](http://img.blog.csdn.net/20141221160848802?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
至此,利用sinc函数内插的公式就出来了:
![](http://img.blog.csdn.net/20141221160905578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当Δ=1时,上面式子还可以简化为:
![](http://img.blog.csdn.net/20141221160929580?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
下面是个测试例子,scilab 语言的。
![](http://img.blog.csdn.net/20141221161011076?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dWFuYmh1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
再将这个结果与 fft 内插的结果比较一下,可以看到效果类似,之所以不完全相同,是因为这个代码中只用到了临近的5个数据点,而且到了边界处就直接截断处理了。而fft内插是将数据周期延拓后计算的结果。
sinc 函数内插
我们的信号 x(t) 是个实信号,带宽有限,能量有限。x
=x(nΔ)和 x’
=x(nΔ’)是对这个信号的两种采样,并且都满足采样定理的要求,也就是说信息并没有丢失。两次采样的采样率满足如下关系。
也就是说第二种采样的采样率是第一种采样的采样率的M 倍。如果我们有了x’
,那么很容易获得x
:
但是反过来就不是那么容易了。下面就来推导如何在已知x
的情况下,计算出x’
。
对于连续信号x(t),有如下关系。
对于离散信号x
,有如下关系。
这里的ω与Ω的关系如下:ω=ΩΔ,那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 函数内插)
- 离散时间序列的内插算法(利用fft)
- 离散时间序列的内插算法(利用fft)
- 设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。
- 数组连续子序列的最大的和-四种算法,四种时间复杂度
- R语言时间序列函数整理
- O(n)时间算法最大子序列和
- 每天学习一算法系列(3)(设计包含min函数的栈,要求函数min、push以及pop的时间复杂度都是O(1))
- 最大子序列的3种不同时间复杂度的算法
- R语言时间序列函数整理
- R:预测离散值时间序列
- 时间算法函数
- n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j|<=K,请设计一种排序算法,对该序列进行排序。注:算法时间复杂度为O(nlgn)的得0分,复杂度为O(nk) 的得两分,总分是20分
- 算法基础(1)关于时间复杂度计算之函数增长
- Linux+Qt 算法运行时间(计时函数)
- R语言时间序列函数整理[不断更新]
- 算法导论12.2-8 从任意结点使用后继函数k次的时间复杂度为O(k+h)
- 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)
- 最大子序列和的线性时间算法
- R语言时间序列函数整理