12.1 标准偏差Standard deviation 这部分函数用于计算标准偏差,公式描述如下: Result =sqrt((sumOfSquares - sum2 / blockSize) / (blockSize - 1)) 其中: sumOfSquares= pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] *pSrc[blockSize-1] sum = pSrc[0]+ pSrc[1] + pSrc[2] + ... + pSrc[blockSize-1]
12.1.1 arm_std_f32此函数的使用比较简单,函数定义如下: void arm_std_f32(float32_t * pSrc, uint32_t blockSize, float32_t* pResult) 参数定义: [in] *pSrc points to the inputvector [in] blockSize length of the input vector [out] *pResult standard deviation value returned here
12.1.2 arm_std_q31此函数的使用比较简单,函数定义如下: voidarm_std_q31(q31_t * pSrc, uint32_t blockSize, q31_t * pResult) 参数定义: [in] *pSrc points to the inputvector [in] blockSize length of the input vector [out] *pResult standard deviation value returned here 注意事项: 输入参数是1.31格式的,相乘后输出就是1.31*1.31 = 2.62格式,这种情况下,函数内部使用的64位累加器很容易溢出,并且这个函数不支持饱和运算,这个函数的使用还有一些问题,有待后面解决。
12.1.3 arm_std_q15此函数的使用比较简单,函数定义如下: void arm_std_q15(q15_t * pSrc, uint32_t blockSize, q15_t* pResult) 参数定义: [in] *pSrc points to the inputvector [in] blockSize length of the input vector [out] *pResult standard deviation value returned here 注意事项: 输入参数是1.15格式,相乘后的的结果就是1.15*1.15 = 2.30格式,这种情况下,内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据,然后通过饱和运算最终输出数据格式1.15。
12.1.4 实例讲解实验目的: 1. 学习StatisticsMathFunctions中标准偏差的求解 实验内容: 1. 按下按键K1, 串口打印函数DSP_Std的输出结果 实验现象: 通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
程序设计:
- /*
- *********************************************************************************************************
- * 函 数 名: DSP_Std
- * 功能说明: 求标准偏差
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void DSP_Std(void)
- {
- float32_t pSrc[10] = {0.6557, 0.0357, 0.8491, 0.9340, 0.6787, 0.7577, 0.7431, 0.3922, 0.6555, 0.1712};
- float32_t pResult;
- uint32_t pIndex;
-
- q31_t pSrc1[10];
- q31_t pResult1;
-
- q15_t pSrc2[10];
- q15_t pResult2;
-
-
- arm_std_f32(pSrc, 10, &pResult); (1)
- printf("arm_std_f32 : pResult = %frn", pResult);
-
- /*****************************************************************/
- for(pIndex = 0; pIndex < 10; pIndex++)
- {
- pSrc1[pIndex] = rand();
- }
- arm_std_q31(pSrc1, 10, &pResult1); (2)
- printf("arm_std_q31 : pResult = %drn", pResult1);
-
- /*****************************************************************/
- for(pIndex = 0; pIndex < 10; pIndex++)
- {
- pSrc2[pIndex] = rand()%32768;
- }
- arm_std_q15(pSrc2, 10, &pResult2); (3)
- printf("arm_std_q15 : pResult = %drn", pResult2);
-
- printf("******************************************************************rn");
- }
复制代码
1. 这个是浮点数标准偏差求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的标准偏差,然后再用此函数获取标准偏差作为对比。 在matlab的命令窗口输入如下命令: rand(1,10) %1行10列 然后再通过命令std获得标准偏差: std(ans)
matlab求得标准偏差数值是0.2935,而DSP函数求得结果是0.293485,基本是一致的。 2. 这个函数的使用还没有搞懂,有待后面解决。 3. 这个函数的使用还没有搞懂,有待后面解决。
|