完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
转dsp系列教程
本期教程主要讲解一维数据的线性插值和二维数据的双线性插值。 21.1 线性插补 Linear Interpolation 21.2 双线性插补 Bilinear Interpolation 21.3 总结 21.1 线性插值 Linear Interpolation 21.1.1 arm_linear_interp_f32 公式描述: 直线插补曲线可以通过线性多项式进行拟合。线性内插的工作原理有效地绘制两个相邻样本之间的直线和沿该线再返回相应的插补点。 如上图所示,确定了输入参数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] *S is an instance of the floating-point Linear Interpolation structure [in] x input sample to process return y processed output sample. 注意事项: 1. 结构arm_linear_interp_instance_f32的定义如下(在文件arm_math.h文件): typedef struct { uint32_t nValues; /**< nValues */ float32_t x1; /**< x1 */ float32_t xSpacing; /**< xSpacing */ float32_t *pYData; /**< pointer to the table of Y values */ } arm_linear_interp_instance_f32; 2. 如果输入参数x在输入范围之下返回第一个样本值,如果相爱输入范围之上,返回最后一个样本值。 |
|
|
相关推荐
|
|
|
21.1.2 arm_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] x input sample to process [in] nValues number of table values return y processed output sample. 注意事项: 1. 结构arm_linear_interp_instance_q31的定义如下(在文件arm_math.h文件): typedef struct { uint16_t numRows; /**< number of rows in the data table. */ uint16_t numCols; /**< number of columns in the data table. */ q31_t *pData; /**< points to the data table. */ } arm_bilinear_interp_instance_q31; 2. 如果输入参数x在输入范围之下返回第一个样本值,如果相爱输入范围之上,返回最后一个样本值。 3. 输入参数x的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。 |
|
|
|
|
|
|
|
|
21.1.3 arm_linear_interp_q15
函数定义如下: static __INLINE q15_t arm_linear_interp_q15( q15_t * pYData, q31_t x, uint32_t nValues) 参数定义: [in] *pYData pointer to Q15 Linear Interpolation table [in] x input sample to process [in] nValues number of table values return y processed output sample. 注意事项: 1. 结构arm_linear_interp_instance_q15的定义如下(在文件arm_math.h文件): typedef struct { uint16_t numRows; /**< number of rows in the data table. */ uint16_t numCols; /**< number of columns in the data table. */ q15_t *pData; /**< points to the data table. */ } arm_bilinear_interp_instance_q15; 2. 如果输入参数x在输入范围之下返回第一个样本值,如果相爱输入范围之上,返回最后一个样本值。 3. 输入参数x的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。 |
|
|
|
|
|
|
|
|
21.1.4 arm_linear_interp_q7
函数定义如下: static __INLINE q7_t arm_linear_interp_q7( q7_t * pYData, q31_t x, uint32_t nValues) 参数定义: [in] *pYData pointer to Q7 Linear Interpolation table [in] x input sample to process [in] nValues number of table values return y processed output sample. 注意事项: 1. 结构arm_linear_interp_instance_q7的定义如下(在文件arm_math.h文件): typedef struct { uint16_t numRows; /**< number of rows in the data table. */ uint16_t numCols; /**< number of columns in the data table. */ q7_t *pData; /**< points to the data table. */ } 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光盘里面有此软件)查看打印信息现象如下: |
|
|
|
|
|
|
|
|
程序设计:
复制代码 /* ---------------------------------------------------------------------- (1) * Test input data for F32 SIN function * Generated by the MATLAB rand() function * randn('state', 0) * xi = (((1/4.18318581819710)* randn(blockSize, 1) * 2* pi)); * --------------------------------------------------------------------*/ 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 }; /*------------------------------------------------------------------------------ * Reference out of SIN F32 function for Block Size = 10 * Calculated from sin(testInputSin_f32) *------------------------------------------------------------------------------*/ 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 }; /*------------------------------------------------------------------------------ * Method 1: Test out Buffer Calculated from Cubic Interpolation (2) *------------------------------------------------------------------------------*/ float32_t testOutput[TEST_LENGTH_SAMPLES]; /*------------------------------------------------------------------------------ * Method 2: Test out buffer Calculated from Linear Interpolation *------------------------------------------------------------------------------*/ float32_t testLinIntOutput[TEST_LENGTH_SAMPLES]; /*------------------------------------------------------------------------------ * External table used for linear interpolation *------------------------------------------------------------------------------*/ extern float arm_linear_interep_table[188495]; /* ---------------------------------------------------------------------- * Global Variables for caluclating SNR's for Method1 & Method 2 * ------------------------------------------------------------------- */ float32_t snr1; float32_t snr2; /* ********************************************************************************************************* * 函 数 名: DSP_MatLinearInterpolation * 功能说明: 线性插值 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void DSP_MatLinearInterpolation(void) { uint32_t i; arm_linear_interp_instance_f32 S = {188495, -3.141592653589793238, XSPACING, &arm_linear_interep_table[0]}; /*------------------------------------------------------------------------------ * Method 1: Test out Calculated from Cubic Interpolation *------------------------------------------------------------------------------*/ for(i=0; i< TEST_LENGTH_SAMPLES; i++) { testOutput[i] = arm_sin_f32(testInputSin_f32[i]); } /*------------------------------------------------------------------------------ * Method 2: Test out Calculated from Cubic Interpolation and Linear interpolation *------------------------------------------------------------------------------*/ for(i=0; i< TEST_LENGTH_SAMPLES; i++) { testLinIntOutput[i] = arm_linear_interp_f32(&S, testInputSin_f32[i]); } /*------------------------------------------------------------------------------ * SNR calculation for method 1 *------------------------------------------------------------------------------*/ snr1 = arm_snr_f32(testRefSinOutput32_f32, testOutput, 2); (3) printf("Cubic Interpolation snr1 = %frn", snr1); /*------------------------------------------------------------------------------ * SNR calculation for method 2 *------------------------------------------------------------------------------*/ snr2 = arm_snr_f32(testRefSinOutput32_f32, testLinIntOutput, 2); printf("Linear Interpolation snr2 = %frn", snr2); /*------------------------------------------------------------------------------ * Initialise status depending on SNR calculations *------------------------------------------------------------------------------*/ if( snr2 > snr1) { printf("ARM_MATH_SUCCESSrn"); } else { printf("ARM_MATH_TEST_FAILURErn"); } } |
|
|
|
|
|
|
|
|
1. 使用这个程序前需要通过Matlab获取如下的插值样本:
x = -pi: 0.00005 : (2*pi - 0.00005); y = sin(x); 这个插值样本已经放在在了如下文件中 2. 这个函数通过信噪比来对比了前面讲的三次插补和线性插补。最终结果是线性插补的结果要优于三次插补。 3. 关于信噪比的计算,我们会在下章做详细的讲解。 |
|
|
|
|
|
|
|
|
21.2 双线性插值 Bilinear Interpolation
21.2.1 arm_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] *S points to an instance of the interpolation structure. [in] X interpolation coordinate. [in] Y interpolation coordinate. return out interpolated value. 注意事项: 1. 结构arm_bilinear_interp_instance_f32的定义如下(在文件arm_math.h文件): typedef struct { uint16_t numRows; /**< number of rows in the data table. */ uint16_t numCols; /**< number of columns in the data table. */ float32_t *pData; /**< points to the data table. */ } arm_bilinear_interp_instance_f32; 2. 如果(x, y)数值在插补样值的范围之外,那么返回0。 |
|
|
|
|
|
|
|
|
21.2.2 arm_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; /**< number of rows in the data table. */ uint16_t numCols; /**< number of columns in the data table. */ q31_t *pData; /**< points to the data table. */ } arm_bilinear_interp_instance_q31; 2. 如果(x, y)数值在插补样值的范围之外,那么返回0。 3. 输入参数x和y的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。 |
|
|
|
|
|
|
|
|
21.2.3 arm_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; /**< number of rows in the data table. */ uint16_t numCols; /**< number of columns in the data table. */ q15_t *pData; /**< points to the data table. */ } arm_bilinear_interp_instance_q15; 2. 输入参数x和y的数据格式是12.20。这样32位数据的12位整数部分用于样本数据的检测,所以最大值就是2的12次方。后20位用于小数部分。 3. 如果(x, y)数值在插补样值的范围之外,那么返回0。 |
|
|
|
|
|
|
|
|
21.2.4 arm_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; /**< number of rows in the data table. */ uint16_t numCols; /**< number of columns in the data table. */ q7_t *pData; /**< points to the data table. */ } 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位用于小数部分。 |
|
|
|
|
|
|
|
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16902 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 10:56 , Processed in 1.017598 second(s), Total 89, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖