第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 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光盘里面有此软件)查看打印信息现象如下:
程序设计:
- <font color="#000000">/*
- *********************************************************************************************************
- * 函 数 名: 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");
- }</font>
1. 这个是浮点数标准偏差求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的标准偏差,然后再用此函数获取标准偏差作为对比。
在matlab的命令窗口输入如下命令:
rand(1,10) %1行10列
然后再通过命令std获得标准偏差:
std(ans)
matlab求得标准偏差数值是0.2935,而DSP函数求得结果是0.293485,基本是一致的。
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。
12.2 均方根RMS
这部分函数用于计算标准偏差,公式描述如下:
Result =sqrt(((pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] *pSrc[blockSize-1]) / blockSize));
12.2.1 arm_rms_f32
函数定义如下:
voidarm_rms_f32(float32_t * pSrc, uint32_t blockSize, float32_t * pResult)
参数定义:
[in] *pSrc points to the input vector
[in]blockSize length of the inputvector
[out] *pResult rms value returned here
12.2.2 arm_rms_q31
函数定义如下:
void arm_rms_q31(q31_t * pSrc, uint32_t blockSize, q31_t* pResult)
参数定义:
[in] *pSrc points to the input vector
[in]blockSize length of the inputvector
[out] *pResult rms value returned here
注意事项:
输入参数是1.31格式的,相乘后输出就是1.31*1.31 = 2.62格式,这种情况下,函数内部使用的64位累加器很容易溢出,并且这个函数不支持饱和运算。
12.2.3 arm_rms_q15
函数定义如下:
void arm_rms_q15(q15_t * pSrc, uint32_t blockSize, q15_t* pResult)
参数定义:
[in] *pSrc points to the input vector
[in]blockSize length of the inputvector
[out] *pResult rms value returned here
注意事项:
输入参数是1.15格式,相乘后的的结果就是1.15*1.15 = 2.30格式,这种情况下,内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据,然后通过饱和运算最终输出数据格式1.15。
12.2.4 实例讲解
实验目的:
1. 学习StatisticsMathFunctions中均方根的求解
实验内容:
1. 按下按键K2, 串口打印函数DSP_RMS的输出结果
实验现象:
通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
程序设计:
1. 这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
在matlab的命令窗口输入如下命令:
a =rand(1,10) %1行10列
然后再通过命令std获得标准偏差:
rms(a)
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。
谢谢分享!
12.3 方差Variance
这部分函数用于计算标准偏差,公式描述如下:
Result =sqrt(((pSrc[0] * pSrc[0] + pSrc[1] * pSrc[1] + ... + pSrc[blockSize-1] *pSrc[blockSize-1]) / blockSize));
12.3.1 arm_var_f32
函数定义如下:
voidarm_var_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 variance value returnedhere
12.3.2 arm_var_q31
函数定义如下:
void arm_var_q31(q31_t * pSrc, uint32_t blockSize, q63_t* pResult)
参数定义:
[in] *pSrc points to the input vector
[in]blockSize length of the inputvector
[out] *pResult rms value returned here
12.3.3 arm_var_q15
函数定义如下:
void arm_var_q15(q15_t * pSrc, uint32_t blockSize, q31_t* pResult)
参数定义:
[in] *pSrc points to the input vector
[in]blockSize length of the inputvector
[out] *pResult rms value returned here
注意事项:
输入参数是1.15格式,相乘后的的结果就是1.15*1.15 = 2.30格式,这种情况下,内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据,然后通过饱和运算最终输出数据格式1.15。
12.3.4 实例讲解
实验目的:
1. 学习StatisticsMathFunctions中方差的求解
实验内容:
1. 按下按键K3, 串口打印函数DSP_Var的输出结果
实验现象:
通过窗口上位机软件SecureCRT(V5光盘里面有此软件)查看打印信息现象如下:
程序设计:
1. 这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
在matlab的命令窗口输入如下命令:
a =rand(1,10) %1行10列
然后再通过命令var获得标准偏差:
var(a)
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。
12.4 总结
本期教程就跟大家讲这么多,有兴趣的可以深入研究这些函数源码的实现。