席萌0209 发表于 2015-3-23 10:59:02

【安富莱DSP教程】第12章 StatisticsMathFunctions的使用(二)

特别说明:完整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 * pSrc + pSrc * pSrc + ... + pSrc * pSrc
      sum = pSrc + pSrc + pSrc + ... + pSrc

12.1.1 arm_std_f32

此函数的使用比较简单,函数定义如下:
       void arm_std_f32(float32_t * pSrc, uint32_t blockSize, float32_t * pResult)
参数定义:
           *pSrc     points to the input vector   
           blockSize length of the input vector   
       *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)
参数定义:
           *pSrc     points to the input vector   
       blockSize length of the input vector   
       *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)
参数定义:
           *pSrc     points to the input vector   
       blockSize length of the input vector   
       *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 = {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;
q31_t pResult1;
q15_t pSrc2;
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 = rand();
}
arm_std_q31(pSrc1, 10, &pResult1);                                                             (2)
printf("arm_std_q31 : pResult = %d\r\n", pResult1);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc2 = 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. 这个函数的使用还没有搞懂,有待后面解决。

席萌0209 发表于 2015-3-23 11:03:27

12.2 均方根RMS

这部分函数用于计算标准偏差,公式描述如下:
      Result = sqrt(((pSrc * pSrc + pSrc * pSrc + ... + pSrc * pSrc) / blockSize));

12.2.1 arm_rms_f32

函数定义如下:
      void arm_rms_f32(float32_t * pSrc, uint32_t blockSize, float32_t * pResult)
参数定义:
       *pSrc    points to the input vector   
       blockSize length of the input vector   
       *pResult rms value returned here

12.2.2 arm_rms_q31

函数定义如下:
      void arm_rms_q31(q31_t * pSrc, uint32_t blockSize, q31_t * pResult)
参数定义:
       *pSrc    points to the input vector   
       blockSize length of the input vector   
       *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)
参数定义:
       *pSrc    points to the input vector   
       blockSize length of the input vector   
       *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光盘里面有此软件)查看打印信息现象如下:
程序设计:
/*
*********************************************************************************************************
*    函 数 名: DSP_RMS
*    功能说明: 求均方值
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
static void DSP_RMS(void)
{
float32_t pSrc = {0.7060,    0.0318,    0.2769,    0.0462,    0.0971,    0.8235,    0.6948,    0.3171,    0.9502,    0.0344};
float32_t pResult;
uint32_t pIndex;
q31_t pSrc1;
q31_t pResult1;
q15_t pSrc2;
q15_t pResult2;
arm_rms_f32(pSrc, 10, &pResult);
printf("arm_rms_f32 : pResult = %frn", pResult);                                              (1)

/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc1 = rand();
}
arm_rms_q31(pSrc1, 10, &pResult1);                                                            (2)
printf("arm_rms_q31 : pResult = %drn", pResult1);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc2 = rand()%32768;
}
arm_rms_q15(pSrc2, 10, &pResult2);                                                                (3)
printf("arm_rms_q15 : pResult = %drn", pResult2);
printf("******************************************************************rn");
}
1. 这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      a = rand(1,10)%1行10列
    然后再通过命令std获得标准偏差:
      rms(a)   

2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。

席萌0209 发表于 2015-3-23 11:15:05

12.3 方差Variance

这部分函数用于计算标准偏差,公式描述如下:
      Result = sqrt(((pSrc * pSrc + pSrc * pSrc + ... + pSrc * pSrc) / blockSize));

12.3.1 arm_var_f32

函数定义如下:
   void arm_var_f32(float32_t * pSrc, uint32_t blockSize, float32_t * pResult)
参数定义:
    *pSrc    points to the input vector      
    blockSize length of the input vector      
    *pResult variance value returned here   

12.3.2 arm_var_q31

函数定义如下:
   void arm_var_q31(q31_t * pSrc, uint32_t blockSize, q63_t * pResult)
参数定义:
    *pSrc    points to the input vector   
    blockSize length of the input vector   
    *pResult rms value returned here   

12.3.3 arm_var_q15

函数定义如下:
    void arm_var_q15(q15_t * pSrc, uint32_t blockSize, q31_t * pResult)
参数定义:
    *pSrc    points to the input vector   
    blockSize length of the input vector   
    *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光盘里面有此软件)查看打印信息现象如下:
程序设计:
/*
*********************************************************************************************************
*    函 数 名: DSP_RMS
*    功能说明: 求最小值
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
static void DSP_Var(void)
{
float32_t pSrc = { 0.4387, 0.3816, 0.7655, 0.7952, 0.1869, 0.4898, 0.4456, 0.6463, 0.7094, 0.7547};
float32_t pResult;
uint32_t pIndex;
q31_t pSrc1;
q63_t pResult1;
q15_t pSrc2;
q31_t pResult2;
arm_var_f32(pSrc, 10, &pResult);
printf("arm_var_f32 : pResult = %frn", pResult);

/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc1 = rand();
}
arm_var_q31(pSrc1, 10, &pResult1);
printf("arm_var_q31 : pResult = %lldrn", pResult1);
/*****************************************************************/
for(pIndex = 0; pIndex < 10; pIndex++)
{
pSrc2 = rand()%32768;
}
arm_var_q15(pSrc2, 10, &pResult2);
printf("arm_var_q15 : pResult = %drn", pResult2);
printf("******************************************************************rn");
}
1. 这个是浮点数均方根求解,这里我们先用matlab生成一组随机的浮点数,并求解其对应的均方根,然后再用此函数获取标准偏差作为对比。
    在matlab的命令窗口输入如下命令:
      a = rand(1,10)%1行10列
    然后再通过命令var获得标准偏差:
         var(a)
   
2. 这个函数的使用还没有搞懂,有待后面解决。
3. 这个函数的使用还没有搞懂,有待后面解决。

12.4 总结

    本期教程就跟大家讲这么多,有兴趣的可以深入研究这些函数源码的实现。
页: [1]
查看完整版本: 【安富莱DSP教程】第12章 StatisticsMathFunctions的使用(二)