数据结构与算法

发布 2021-05-02 16:47:28 阅读 2280

插值(内插)

插值是确定某个函数在两个采样值之间的数值时采用的运算过程。插值通常是利用曲线拟合的方法,通过离散的输入采样点建立一个连续函数,用这个重建的函数便可以求出任意位置处的函数值。这样便可以不受仅在采样点处抽取输入信号值的限制。

我们知道,对有限带宽的信号采样会产生无限带宽信号,插值过程正好相反,它通过对离散信号作低通滤波处理,减少了信号的带宽。插值函数对采样数值的平滑作用,恢复了在采样过程中丢失的信息。因而插值可以看做是采样的逆过程。

对于等间隔采样数据,插值可以表示为:

其中h为插值核,ck为权系数,卷积对k个数据作处理。上面的方程将插值用卷积操作来表示,在实际应用中,h总是对称的,即有h(x)=h(-x),ck即为采样值。

插值核的性质可以通过其在频率域的特性来评估。理想的插值核在带通区具有单位增益,在带阻区具有0增益。因而可以有效地通过和抑制不同频率的信号成分。

理想滤波器在空间域中都具有很宽的拓区,故称为无限脉冲响应滤波器(iir),但这种滤波器在实际中是无法实现的。仅能在一定程度上近似实现这类滤波器。

另一类可实现的滤波器常称为有限脉冲响应滤波器(fir),fir滤波器的每一个输出值都是其邻域有限输入元素的加权和。fir滤波器在信号与图象处理中具有广泛应用。常用的fir滤波器有盒式、三角、三次卷积b样条及加窗sinc函数等。

它们都可以作为插值函数的插值核来使用。下面列举几种比较有效的插值核:

1、最近邻域法。

这是最简单的算法,每一个输出像素都赋给输入图象中与其最邻近的采样点的值。

2、线形插值。

3、sinc

在这里介绍的是hann/hamming窗:

其中n为窗口下的采样点数。当取0.5时,称hann窗,当取0.54时,称hamming窗。

这里没有介绍三次样条,是因为排版和理论上的原因,但是提供了一个三次样条的范例程序。程序可能有错,请勿见怪。

下面是程序

三次样条插值范例程序。

/ name : ispline-gen (

/ function: interpolating cubic spline function for irregularly-spaced poinis.

/ parametcrs: y1 : is a list of irregular data points (len1 entries).

/ x1 : x-coordinaies of the adta siored in y1.

/ y2 : cubic spline sampled according io x2 (len2 entries).

/ calls : getyd_gen (

void ispline_gen(double x x1 ,double x y1 ,int len1 ,doublc & x2 ,double x y2 ,int len2)

int i, j;

double * yd, a0, a1, a2, a3, x, dx, dy, p1, p2, p3;

yd = double x ) calloc (len1 , sizeof(double) )

getyd_ gen ( x1 , y1 , yd , len1 )

/ *error checking *

if (x2 [0]x1 [len1 - 1 ]

p3 = x2 [0]-1 ;

for (i = j = 0 ; i

x = p2-p1 ;

y2[i]= a3 * x+a2) *x+a1) *x+a0;

free( (char * yd) ;

/ name : getyd_ gen (

/ function : compute 1st derivaiives of data in x and y(len entries).

/ the not-a-knot boundary is used.

/ parameters : y : is a list of irregular data points (len1 entries).

/ x : x-coordinatcs of the adta stored in y1.

/ yd : output data (len entries) .

/ calls : tridiag_gen (

void getyd_gen (double * x ,doublc * y ,double * yd ,int len)

int i ;

double h0,h1 ,r0,r1 , a, *b, *c;

a =(double * calloc (len , sizeof (double )

b =(double x ) calloc (len , sizeof(double) )

c =(double x ) calloc (len , sizeof(double )

h0 =x [1 ]-x [0] ;

h1 =x [2]-x [1 ]

r0 =(y[1 ]-y[0] )h0 ;

r1 = y[2]-y[1] )h1 ;

b[0] =h1 * h0+h1 )

c[0]=(h0+h1 ) h0+h1 )

yd[0]=r0 * 3 * h0 * h1+2 * h1 * h1)+r1 * h0 * h0;

for (i = 1 ; i

a[i] =h0-h1 ) h0+h1 )

b[i] =h0 * h0+h1 )

c[i] =h0 ;

yd[i]=r0 * h1 * h1+r1 * 3 * h0 * h1+2 * h0 * h0) ;

/ *solve for the tridiagonal mairix. *

tridiag_gen ( a , b , c , yd , len )

free( (char * a) ;

free( (char * b) ;

free( (char * c) ;

/ name : tridiag_gen( )

/ function : solve for the tridiagonal matrix using gauss

/ backsubstitution method.

/ parameters: a ,b ,c, d : is a list of store data points (len entries).

void tridiag_gen (double * a , double * b , double * c ,double * d , int len )

int i ;

double b , f ;

f = double * calloc (len , sizeof(double )

b = b[0] /b ;

d[0]= d[0] /b ;

for ( i=1 ; i< len ; i ++

d[i]= d[i]-d[i-1]* a [i] )b ;

for ( i=len- 2 ; i >=0 ; i--

d[i]=(d[i+1]*f[i+1]);

free ( char * f) ;

数据结构与算法

本章知识要点 算法的基本概念 数据结构的定义 线性表的定义和存储 树 二叉树的定义和存储 查找与排序算法。算法 algorithm 是一组有穷的规则,规定了解决某一特定类型问题的一系列运算,是对解题方 与完整的描述。算法是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法。在计算机科学中...

算法与数据结构

学院专业姓名学号。实验1 线性表的操作 12学时 问题描述 假设一个班级内有n个学生,定义一个学生类和一个班级类。学生类中包括学号 姓名 性别 年龄 专业等属性 班级类包括一个学生对象链表。定义如下 class student class myclass student stu head 链表表头指...

算法与数据结构

1 简述算法的概念及其五个重要特性。2 下图是用邻接表存储的图,请画出此图,写出其邻接矩阵以及从c点开始分别按广度优先搜索和深度优先搜索遍历该图的结果。给定一棵用二叉链表表示的二叉树,其根指针为root,编写求此二叉树叶结点个数的算法,要求先写出二叉链表的类型定义。2.编写简单选择排序的算法。1 用...