|
特别说明:完整45期数字信号处理教程,原创高性能示波器代码全开源地址:链接
第12章 StatisticsMathFunctions的使用(二)
本期教程主要讲解统计函数中的标准偏差、均方根和方差的计算。
12.1 标准偏差 Standard deviation
12.2 均方差RMS
12.3 方差 Variance
12.4 总结
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 input vector
[in] blockSize length of the input vector
[out] *pResult standard deviation value returned here
12.1.2 arm_std_q31
此函数的使用比较简单,函数定义如下:
void arm_std_q31(q31_t * pSrc, uint32_t blockSize, q31_t * pResult)
参数定义:
[in] *pSrc points to the input vector
[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 input vector
[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 = %f\r\n", pResult);
-
- /*****************************************************************/
- for(pIndex = 0; pIndex < 10; pIndex++)
- {
- pSrc1[pIndex] = rand();
- }
- arm_std_q31(pSrc1, 10, &pResult1); (2)
- printf("arm_std_q31 : pResult = %d\r\n", pResult1);
- /*****************************************************************/
- for(pIndex = 0; pIndex < 10; pIndex++)
- {
- pSrc2[pIndex] = rand()%32768;
- }
- arm_std_q15(pSrc2, 10, &pResult2); (3)
- printf("arm_std_q15 : pResult = %d\r\n", pResult2);
- printf("******************************************************************\r\n");
- }
复制代码 1. 这个是浮点数标准偏差求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的标准偏差,然后再用此函数获取标准偏差作为对比。
在matlab的命令窗口输入如下命令:
rand(1,10) %1行10列
然后再通过命令std获得标准偏差:
std(ans)
matlab求得标准偏差数值是0.2935,而DSP函数求得结果是0.293485,基本是一致的。
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。 |
-
-
|