bilinear interpolation matlab,【安富莱DSP教程】第21章 InterpolationFunctions的使用

第21章

InterpolationFunctions的使用

本期教程主要讲解一维数据的线性插值和二维数据的双线性插值。

21.1 线性插补 Linear Interpolation

21.2 双线性插补 Bilinear Interpolation

21.3 总结

21.1

线性插值Linear Interpolation

21.1.1arm_linear_interp_f32

公式描述:

a4c26d1e5885305701be709a3d33442f.png

直线插补曲线可以通过线性多项式进行拟合。线性内插的工作原理有效地绘制两个相邻样本之间的直线和沿该线再返回相应的插补点。

如上图所示,确定了输入参数x在样本数据中的位置后,就可以绘制这两个样本值之间的直线。然后返回X值对应的Y值。返回方法就是下面的直线公式:

y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))

其中x0和x1是输入值x最近的两个数据,y0和y1是输出值y最近的两个值。

函数定义如下:

static __INLINE float32_t arm_linear_interp_f32(

arm_linear_interp_instance_f32 * S,

float32_t x)

参数定义:

[in,out] *Sis an instance of the floating-point Linear Interpolation structure

[in]xinput sample to process

return yprocessed output sample.

注意事项:

1.结构arm_linear_interp_instance_f32的定义如下(在文件arm_math.h文件):

typedef struct

{

uint32_t nValues;

float32_t x1;

float32_t xSpacing;

float32_t *pYData;

} arm_linear_interp_instance_f32;

2.如果输入参数x在输入范围之下返回第一个样本值,如果相爱输入范围之上,返回最后一个样本值。

21.1.2arm_linear_interp_q31

函数定义如下:

static __INLINE q31_t arm_linear_interp_q31(

q31_t * pYData,

q31_t x,

uint32_t nValues)

参数定义:

[in] *pYData pointer to Q31 Linear Interpolation table

[in] xinput sample to process

[in] nValuesnumber of table values

return yprocessed output sample.

注意事项:

1.结构arm_linear_interp_instance_q31的定义如下(在文件arm_math.h文件):

typedef struct

{

uint16_t numRows;

uint16_t numCols;

q31_t *pData;

} arm_bilinear_interp_instance_q31;

2.如果输入参数x在输入范围之下返回第一个样本值,如果相爱输入范围之上,返回最后一个样本值。

3.输入参数x的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。

21.1.3arm_linear_interp_q15

函数定义如下:

static __INLINE q15_t arm_linear_interp_q15(

q15_t * pYData,

q31_t x,

uint32_t nValues)

参数定义:

[in] *pYData pointer to Q15Linear Interpolation table

[in] xinput sample to process

[in] nValuesnumber of table values

return yprocessed output sample.

注意事项:

1.结构arm_linear_interp_instance_q15的定义如下(在文件arm_math.h文件):

typedef struct

{

uint16_t numRows;

uint16_t numCols;

q15_t *pData;

} arm_bilinear_interp_instance_q15;

2.如果输入参数x在输入范围之下返回第一个样本值,如果相爱输入范围之上,返回最后一个样本值。

3.输入参数x的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。

21.1.4arm_linear_interp_q7

函数定义如下:

static __INLINE q7_t arm_linear_interp_q7(

q7_t * pYData,

q31_t x,

uint32_t nValues)

参数定义:

[in] *pYData pointer to Q7Linear Interpolation table

[in] xinput sample to process

[in] nValuesnumber of table values

return yprocessed output sample.

注意事项:

1.结构arm_linear_interp_instance_q7的定义如下(在文件arm_math.h文件):

typedef struct

{

uint16_t numRows;

uint16_t numCols;

q7_t *pData;

} arm_bilinear_interp_instance_q7;

2.如果输入参数x在输入范围之下返回第一个样本值,如果相爱输入范围之上,返回最后一个样本值。

3.输入参数x的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。

21.1.5实例讲解

实验目的:

1. 学习InterpolationFunctions中线性插补的实现

实验内容:

1. 按下按键K1, 串口打印函数DSP_MatLinearInterpolation的输出结果

实验现象:

通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:

a4c26d1e5885305701be709a3d33442f.png

程序设计:

float32_t testInputSin_f32[TEST_LENGTH_SAMPLES] =

{

-0.649716504673081170, -2.501723745497831200,

0.188250329003310100, 0.432092748487532540,

-1.722010988459680800, 1.788766476323060600,

1.786136060975809500, -0.056525543169408797,

0.491596272728153760, 0.262309671126153390

};

float32_t testRefSinOutput32_f32[TEST_LENGTH_SAMPLES] =

{

-0.604960695383043530, -0.597090287967934840,

0.187140422442966500, 0.418772124875992690,

-0.988588831792106880, 0.976338412038794010,

0.976903856413481100, -0.056495446835214236,

0.472033731854734240, 0.259311907228582830

};

float32_t testOutput[TEST_LENGTH_SAMPLES];

float32_t testLinIntOutput[TEST_LENGTH_SAMPLES];

extern float arm_linear_interep_table[188495];

float32_t snr1;

float32_t snr2;

static void DSP_MatLinearInterpolation(void)

{

uint32_t i;

arm_linear_interp_instance_f32 S = {188495, -3.141592653589793238, XSPACING,

&arm_linear_interep_table[0]};

for(i=0; i

{

testOutput[i] = arm_sin_f32(testInputSin_f32[i]);

}

for(i=0; i

{

testLinIntOutput[i] = arm_linear_interp_f32(&S, testInputSin_f32[i]);

}

snr1 = arm_snr_f32(testRefSinOutput32_f32, testOutput, 2);(3)

printf("Cubic Interpolation snr1 = %f\r\n", snr1);

snr2 = arm_snr_f32(testRefSinOutput32_f32, testLinIntOutput, 2);

printf("Linear Interpolation snr2 = %f\r\n", snr2);

if( snr2 > snr1)

{

printf("ARM_MATH_SUCCESS\r\n");

}

else

{

printf("ARM_MATH_TEST_FAILURE\r\n");

}

}

1.使用这个程序前需要通过Matlab获取如下的插值样本:

x = -pi: 0.00005 : (2*pi - 0.00005);

y = sin(x);

这个插值样本已经放在在了如下文件中

a4c26d1e5885305701be709a3d33442f.png

2.这个函数通过信噪比来对比了前面讲的三次插补和线性插补。最终结果是线性插补的结果要优于三次插补。

3.关于信噪比的计算,我们会在下章做详细的讲解。

21.2

双线性插值Bilinear Interpolation

21.2.1arm_bilinear_interp_f32

公式描述:

双线性插值要麻烦些,不过同线性插值的原理是一样的,公式如下:

其中由x,y来指定插补点,那么做如下定义

XF = floor(x)

YF = floor(y)

插补值的输出结果计算如下:

f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))

+ f(XF+1, YF) * (x-XF)*(1-(y-YF))

+ f(XF, YF+1) * (1-(x-XF))*(y-YF)

+ f(XF+1, YF+1) * (x-XF)*(y-YF)

(x,y)数据是由整数和小数两部分组成,整数部分用来获取所在的插补样值的位置,小数部分用于

实际数据的处理。如果(x, y)数值在插补样值的范围之外,那么返回0。

函数定义如下:

static __INLINE float32_t arm_bilinear_interp_f32(

const arm_bilinear_interp_instance_f32 * S,

float32_t X,

float32_t Y)

参数定义:

[in,out] *Spoints to an instance of the interpolation structure.

[in] Xinterpolation coordinate.

[in] Yinterpolation coordinate.

return out interpolated value.

注意事项:

1.结构arm_bilinear_interp_instance_f32的定义如下(在文件arm_math.h文件):

typedef struct

{

uint16_t numRows;

uint16_t numCols;

float32_t *pData;

} arm_bilinear_interp_instance_f32;

2.

如果(x, y)数值在插补样值的范围之外,那么返回0。

21.2.2arm_bilinear_interp_q31

函数定义如下:

static __INLINE q31_t arm_bilinear_interp_q31(

arm_bilinear_interp_instance_q31 * S,

q31_t X,

q31_t Y)

参数定义:

[in,out] *S points to an instance of the interpolation structure.

[in] X interpolation coordinate in 12.20 format.

[in] Y interpolation coordinate in 12.20 format.

return out interpolated value.

注意事项:

1.结构arm_bilinear_interp_instance_q31的定义如下(在文件arm_math.h文件):

typedef struct

{

uint16_t numRows;

uint16_t numCols;

q31_t *pData;

} arm_bilinear_interp_instance_q31;

2.

如果(x, y)数值在插补样值的范围之外,那么返回0。

3.输入参数x和y的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。

21.2.3arm_bilinear_interp_q15

函数定义如下:

static __INLINE q15_t arm_bilinear_interp_q15(

arm_bilinear_interp_instance_q15 * S,

q31_t X,

q31_t Y)

参数定义:

[in,out] *S points to an instance of the interpolation structure.

[in] X interpolation coordinate in 12.20 format.

[in] Y interpolation coordinate in 12.20 format.

return out interpolated value.

注意事项:

1.结构arm_bilinear_interp_instance_q15的定义如下(在文件arm_math.h文件):

typedef struct

{

uint16_t numRows;

uint16_t numCols;

q15_t *pData;

} arm_bilinear_interp_instance_q15;

2.输入参数x和y的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。

3.

如果(x, y)数值在插补样值的范围之外,那么返回0。

21.2.4arm_linear_interp_q7

函数定义如下:

static __INLINE q7_t arm_bilinear_interp_q7(

arm_bilinear_interp_instance_q7 * S,

q31_t X,

q31_t Y)

参数定义:

[in,out] *S points to an instance of the interpolation structure.

[in] X interpolation coordinate in 12.20 format.

[in] Y interpolation coordinate in 12.20 format.

return out interpolated value.

注意事项:

1.结构arm_bilinear_interp_instance_q7的定义如下(在文件arm_math.h文件):

typedef struct

{

uint16_t numRows;

uint16_t numCols;

q7_t *pData;

} arm_bilinear_interp_instance_q7;

2.输入参数x的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。

3.

如果(x, y)数值在插补样值的范围之外,那么返回0。

4.输入参数x和y的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。

21.3

总结

本期教程就跟大家讲这么多,有兴趣的可以深入研究下算法的具体实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值