信号的插值计算
前言
最近在学习信号的插值,学到了一些常用的方法,遂在此博客记录之
一、二次插值
二次函数插值是一种常见的插值方法,如下图:
假设在
x
(
n
)
,
x
(
n
−
1
)
,
x
(
n
−
2
)
x(n),x(n-1),x(n-2)
x(n),x(n−1),x(n−2)三个点已知,为了拟合估算
x
(
n
−
u
)
x(n-u)
x(n−u)的值,可以使用二次插值得到。假设二次曲线为
x
(
t
)
=
a
t
2
+
b
t
+
c
x(t)=at^2+bt+c
x(t)=at2+bt+c,将
x
(
n
)
,
x
(
n
−
1
)
,
x
(
n
−
2
)
x(n),x(n-1),x(n-2)
x(n),x(n−1),x(n−2)三个点代入计算即可得到
a
、
b
、
c
a、b、c
a、b、c的值。但这样计算略显繁琐,可以使用牛顿法直接插值得到这个二次曲线。
x
(
t
)
=
x
(
n
)
+
x
(
n
)
−
x
(
n
−
1
)
n
−
(
n
−
1
)
(
t
−
n
)
+
[
x
(
n
)
−
x
(
n
−
1
)
n
−
(
n
−
1
)
−
x
(
n
−
1
)
−
x
(
n
−
2
)
(
n
−
1
)
−
(
n
−
2
)
]
(
t
−
n
)
[
t
−
(
n
−
1
)
]
n
−
(
n
−
2
)
=
x
(
n
)
+
[
x
(
n
)
−
x
(
n
−
1
)
]
(
t
−
n
)
+
1
2
[
x
(
n
)
+
x
(
n
−
2
)
−
2
x
(
n
−
1
)
]
(
t
−
n
)
(
t
−
n
+
1
)
\begin{aligned} x(t)&=x(n)+\frac{x(n)-x(n-1)}{n-(n-1)}(t-n)+\left [\frac{x(n)-x(n-1)}{n-(n-1)}-\frac{x(n-1)-x(n-2)}{(n-1)-(n-2)} \right]\frac{(t-n)[t-(n-1)]}{n-(n-2)}\\ &=x(n)+\left[x(n)-x(n-1)\right](t-n)+\frac{1}{2}\left[ x(n)+x(n-2)-2x(n-1)\right](t-n)(t-n+1) \end{aligned}
x(t)=x(n)+n−(n−1)x(n)−x(n−1)(t−n)+[n−(n−1)x(n)−x(n−1)−(n−1)−(n−2)x(n−1)−x(n−2)]n−(n−2)(t−n)[t−(n−1)]=x(n)+[x(n)−x(n−1)](t−n)+21[x(n)+x(n−2)−2x(n−1)](t−n)(t−n+1)
所以
x
(
n
−
u
)
x(n-u)
x(n−u)的插值结果为
x
(
n
−
u
)
=
(
1
2
u
2
−
3
2
u
+
1
)
x
(
n
)
+
(
−
u
2
+
2
u
)
x
(
n
−
1
)
+
(
1
2
u
2
−
1
2
u
)
x
(
n
−
2
)
=
c
0
x
(
n
)
+
c
1
x
(
n
−
1
)
+
c
2
x
(
n
−
2
)
\begin{aligned} x(n-u)&=\left(\frac{1}{2}u^2-\frac{3}{2}u+1\right)x(n)+(-u^2+2u)x(n-1)+\left(\frac{1}{2}u^2-\frac{1}{2}u\right)x(n-2)\\ &=c_0x(n)+c_1x(n-1)+c_2x(n-2) \end{aligned}
x(n−u)=(21u2−23u+1)x(n)+(−u2+2u)x(n−1)+(21u2−21u)x(n−2)=c0x(n)+c1x(n−1)+c2x(n−2)
其中,
{
c
0
=
1
2
u
2
−
3
2
u
+
1
c
1
=
−
u
2
+
2
u
c
2
=
1
2
u
2
−
1
2
u
\begin{cases} c_0&=\frac{1}{2}u^2-\frac{3}{2}u+1\\ c_1&=-u^2+2u\\ c_2&=\frac{1}{2}u^2-\frac{1}{2}u \end{cases}
⎩
⎨
⎧c0c1c2=21u2−23u+1=−u2+2u=21u2−21u
很明显这是一个滤波器的结构,所以对任意的三个已知点
x
(
n
)
,
x
(
n
−
1
)
,
x
(
n
−
2
)
x(n),x(n-1),x(n-2)
x(n),x(n−1),x(n−2)可以用滤波器插值得到
x
(
n
−
u
)
x(n-u)
x(n−u)的值,当
0
<
u
<
1
0<u<1
0<u<1时,该滤波器实现了信号的小数倍延时。
二、分段式二次插值
以前在学习插值公式时,看到一个用4个点实现分段式二次插值的方法。假设
x
(
n
+
1
)
,
x
(
n
)
,
x
(
n
−
1
)
,
x
(
n
−
2
)
x(n+1),x(n),x(n-1),x(n-2)
x(n+1),x(n),x(n−1),x(n−2)四个点已知,利用这四个点得到类似于二次插值的系数。这个方法我查了一些资料1 , 2,得到了一些点拨3,得到了计算方法。已知的4个点如下图所示。
这里的插值分为3段。
第1段利用
x
(
n
)
,
x
(
n
−
1
)
,
x
(
n
−
2
)
x(n),x(n-1),x(n-2)
x(n),x(n−1),x(n−2)三个点插值得到第1条二次曲线
x
1
(
t
)
x_1(t)
x1(t),同上一节类似,可以利用牛顿插值得到。
x
1
(
t
)
=
x
(
n
)
+
[
x
(
n
)
−
x
(
n
−
1
)
]
(
t
−
n
)
+
1
2
[
x
(
n
)
+
x
(
n
−
2
)
−
2
x
(
n
−
1
)
]
(
t
−
n
)
(
t
−
n
+
1
)
\begin{aligned} x_1(t)=x(n)+\left[x(n)-x(n-1)\right](t-n)+\frac{1}{2}\left[ x(n)+x(n-2)-2x(n-1)\right](t-n)(t-n+1) \end{aligned}
x1(t)=x(n)+[x(n)−x(n−1)](t−n)+21[x(n)+x(n−2)−2x(n−1)](t−n)(t−n+1)
并且计算出
x
1
(
n
−
u
)
x_1(n-u)
x1(n−u),
x
1
(
n
−
u
)
=
(
1
2
u
2
−
3
2
u
+
1
)
x
(
n
)
+
(
−
u
2
+
2
u
)
x
(
n
−
1
)
+
(
1
2
u
2
−
1
2
u
)
x
(
n
−
2
)
\begin{aligned} x_1(n-u)=\left(\frac{1}{2}u^2-\frac{3}{2}u+1\right)x(n)+(-u^2+2u)x(n-1)+\left(\frac{1}{2}u^2-\frac{1}{2}u\right)x(n-2) \end{aligned}
x1(n−u)=(21u2−23u+1)x(n)+(−u2+2u)x(n−1)+(21u2−21u)x(n−2)
第2段利用
x
(
n
+
1
)
,
x
(
n
)
,
x
(
n
−
1
)
x(n+1),x(n),x(n-1)
x(n+1),x(n),x(n−1)三个点插值得到第2条二次曲线
x
2
(
t
)
x_2(t)
x2(t),
x
2
(
t
)
=
x
(
n
+
1
)
+
[
x
(
n
+
1
)
−
x
(
n
)
]
(
t
−
n
−
1
)
+
1
2
[
x
(
n
+
1
)
+
x
(
n
−
1
)
−
2
x
(
n
)
]
(
t
−
n
−
1
)
(
t
−
n
)
\begin{aligned} x_2(t)=x(n+1)+\left[x(n+1)-x(n)\right](t-n-1)+\frac{1}{2}\left[ x(n+1)+x(n-1)-2x(n)\right](t-n-1)(t-n) \end{aligned}
x2(t)=x(n+1)+[x(n+1)−x(n)](t−n−1)+21[x(n+1)+x(n−1)−2x(n)](t−n−1)(t−n)
并且计算出
x
2
(
n
−
u
)
x_2(n-u)
x2(n−u),
x
2
(
n
−
u
)
=
(
1
2
u
2
−
1
2
u
)
x
(
n
+
1
)
+
(
−
u
2
+
1
)
x
(
n
)
+
(
1
2
u
2
+
1
2
u
)
x
(
n
−
1
)
\begin{aligned} x_2(n-u)=\left(\frac{1}{2}u^2-\frac{1}{2}u\right)x(n+1)+(-u^2+1)x(n)+\left(\frac{1}{2}u^2+\frac{1}{2}u\right)x(n-1) \end{aligned}
x2(n−u)=(21u2−21u)x(n+1)+(−u2+1)x(n)+(21u2+21u)x(n−1)
第3段利用
x
(
n
)
,
x
(
n
−
1
)
x(n),x(n-1)
x(n),x(n−1)两个点线性插值得到第3条曲线
x
3
(
t
)
x_3(t)
x3(t),
x
3
(
t
)
=
(
t
−
n
+
1
)
x
(
n
)
+
(
−
t
+
n
)
x
(
n
−
1
)
x_3(t)=(t-n+1)x(n)+(-t+n)x(n-1)
x3(t)=(t−n+1)x(n)+(−t+n)x(n−1)
可以计算出
x
3
(
n
−
u
)
x_3(n-u)
x3(n−u),
x
3
(
n
−
u
)
=
(
1
−
u
)
x
(
n
)
+
u
x
(
n
−
1
)
x_3(n-u)=(1-u)x(n)+ux(n-1)
x3(n−u)=(1−u)x(n)+ux(n−1)
这里,定义一个变量
α
,
0
<
α
<
1
\alpha,0<\alpha<1
α,0<α<1,将三段插值结果一起来看,即
x
(
t
)
=
2
α
x
1
(
t
)
+
2
α
x
2
(
t
)
+
(
1
−
4
α
)
x
3
(
t
)
x(t)=2\alpha x_1(t)+2\alpha x_2(t)+(1-4\alpha) x_3(t)
x(t)=2αx1(t)+2αx2(t)+(1−4α)x3(t)
所以可以计算出
x
(
n
−
u
)
x(n-u)
x(n−u)的值
x
(
n
−
u
)
=
(
α
u
2
−
α
u
)
x
(
n
+
1
)
+
[
−
α
u
2
−
(
1
−
α
)
u
+
1
]
x
(
n
)
+
[
−
α
u
2
+
(
1
+
α
)
u
]
x
(
n
−
1
)
+
(
α
u
2
−
α
u
)
x
(
n
−
2
)
=
c
−
1
x
(
n
+
1
)
+
c
0
x
(
n
)
+
c
1
x
(
n
−
1
)
+
c
2
x
(
n
−
2
)
\begin{aligned} x(n-u)&=(\alpha u^2-\alpha u)x(n+1)+[-\alpha u^2-(1-\alpha)u+1]x(n)+[-\alpha u^2+(1+\alpha)u]x(n-1)+(\alpha u^2-\alpha u)x(n-2)\\ &=c_{-1}x(n+1)+c_0x(n)+c_{1}x(n-1)+c_2x(n-2) \end{aligned}
x(n−u)=(αu2−αu)x(n+1)+[−αu2−(1−α)u+1]x(n)+[−αu2+(1+α)u]x(n−1)+(αu2−αu)x(n−2)=c−1x(n+1)+c0x(n)+c1x(n−1)+c2x(n−2)
其中,
{
c
−
1
=
α
u
2
−
α
u
c
0
=
−
α
u
2
−
(
1
−
α
)
u
+
1
c
1
=
−
α
u
2
+
(
1
+
α
)
u
c
2
=
α
u
2
−
α
u
\begin{cases} c_{-1}&=\alpha u^2-\alpha u\\ c_0&=-\alpha u^2-(1-\alpha)u+1\\ c_1&=-\alpha u^2+(1+\alpha)u\\ c_2&=\alpha u^2-\alpha u \end{cases}
⎩
⎨
⎧c−1c0c1c2=αu2−αu=−αu2−(1−α)u+1=−αu2+(1+α)u=αu2−αu
这种结构的插值利用了三段插值的加权相加的结果,具有更好的稳定性,能更好的避免边缘点插值时的插值结果和真实值相差太大的现象(被称为龙格现象)。
接下来可以看看在u取不同值时的滤波器响应如何,如下的结果是在
α
=
0.5
\alpha=0.5
α=0.5的条件下仿真的。
幅度响应和群延迟如下所示。
我们希望滤波器的幅度响应为0dB,群延迟 d ϕ d ω = − u \frac{d\phi}{d\omega}=-u dωdϕ=−u,但是很显然,这种插值滤波器的响应和我们所期望的结果存在一定的误差。尤其是大约当 ω > 1.7 \omega>1.7 ω>1.7后,随着 ω \omega ω逐渐增大,误差也越来越大。如此看来这种滤波器适合工作在采样率和信号带宽比值较大的条件下。