经营地址怎么在国税网站做更改,怎样开通微信小商店,室内设计公司有哪些,来个网站好人有好报完整版教程下载地址#xff1a;http://www.armbbs.cn/forum.php?modviewthreadtid94547
第15章 DSP统计函数-标准偏差、均方根和方差
本期教程主要讲解统计函数中的标准偏差#xff0c;均方根和方差的计算。
目录
第15章 DSP统计函数-标准偏差、均方根…完整版教程下载地址http://www.armbbs.cn/forum.php?modviewthreadtid94547
第15章 DSP统计函数-标准偏差、均方根和方差
本期教程主要讲解统计函数中的标准偏差均方根和方差的计算。
目录
第15章 DSP统计函数-标准偏差、均方根和方差
15.1 初学者重要提示
15.2 DSP基础运算指令
15.3 标准偏差Standard deviation
15.3.1 函数arm_std_f32
15.3.2 函数arm_std_q31
15.3.3 函数arm_std_q15
15.3.4 使用举例
15.4 均方根RMS
15.4.1 函数arm_rms_f32
15.4.2 函数arm_rms_q31
15.4.3 函数arm_rms_q15
15.4.4 使用举例
15.5 方差Variance
15.5.1 函数arm_var_f32
15.5.2 函数arm_var_q31
15.5.3 函数arm_var_q15
15.5.4 使用举例
15.6 Matlab求标准偏差均方差和方差
15.6.1 Matlab求标准偏差
15.6.2 Matlab求均方根
15.6.3 Matlab求方差
15.7 实验例程说明MDK
15.8 实验例程说明IAR
15.9 总结 15.1 初学者重要提示 特别注意本章13.5.2小节的问题定点数求解平方根本章节几个函数的源码都有调用到求平方根。 正确理解RMS均方根重要推荐必读http://www.armbbs.cn/forum.php?modviewthreadtid95470 。
15.2 DSP基础运算指令
本章用到的DSP指令在前面章节都已经讲解过。
15.3 标准偏差Standard deviation
这部分函数用于计算标准偏差公式描述如下
Result sqrt((sumOfSquares – sum^2 / 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] 15.3.1 函数arm_std_f32
函数原型
void arm_std_f32(const float32_t * pSrc,uint32_t blockSize,float32_t * pResult)
函数描述
这个函数用于求32位浮点数的标准偏差。
函数参数 第1个参数源数据地址。 第2个参数是源数据个数。 第3个参数是求解出的标准偏差。
15.3.2 函数arm_std_q31
函数原型
void arm_std_q31( const q31_t * pSrc, uint32_t blockSize, q31_t * pResult)
函数描述
这个函数用于求32位定点数的标准偏差。
函数参数 第1个参数源数据地址。 第2个参数是源数据个数。 第3个参数是求解出的标准偏差。
注意事项
输入参数是1.31格式的相乘后输出就是1.31*1.31 2.62格式这种情况下函数内部使用的64位累加器很容易溢出并且这个函数不支持饱和运算。
15.3.3 函数arm_std_q15
函数原型
void arm_std_q31( const q31_t * pSrc, uint32_t blockSize, q31_t * pResult)
函数描述
这个函数用于求15位定点数的标准偏差。
函数参数 第1个参数源数据地址。 第2个参数是源数据个数。 第3个参数是求解出的标准偏差。
注意事项
输入参数是1.15格式相乘后的的结果就是1.15*1.15 2.30格式这种情况下内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据然后通过饱和运算最终输出数据格式1.15。
15.3.4 使用举例
程序设计
/*
*********************************************************************************************************
* 函 数 名: DSP_Std
* 功能说明: 求标准偏差
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void DSP_Std(void)
{float32_t pSrc[10] {0.6557f, 0.0357f, 0.8491f, 0.9340f, 0.6787f, 0.7577f, 0.7431f, 0.3922f,
0.6555f, 0.1712f};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);printf(arm_std_f32 : pResult %f\r\n, pResult);/*****************************************************************/for(pIndex 0; pIndex 10; pIndex){pSrc1[pIndex] rand();}arm_std_q31(pSrc1, 10, pResult1);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);printf(arm_std_q15 : pResult %d\r\n, pResult2);printf(******************************************************************\r\n);
} 实验现象 15.4 均方根RMS
这部分函数用于计算标准偏差公式描述如下
Result sqrt(((pSrc[0] * pSrc[0] pSrc[1] * pSrc[1] ... pSrc[blockSize-1] * pSrc[blockSize-1]) / blockSize));
15.4.1 函数arm_rms_f32
函数原型
void arm_rms_f32( const float32_t * pSrc, uint32_t blockSize, float32_t * pResult)
函数描述
这个函数用于求32位浮点数的均方根。
函数参数 第1个参数源数据地址。 第2个参数是源数据个数。 第3个参数是求解出来的均方根。
15.4.2 函数arm_rms_q31
函数原型
void arm_rms_q31( const q31_t * pSrc, uint32_t blockSize, q31_t * pResult)
函数描述
这个函数用于求32位定点数的均方根。
函数参数 第1个参数源数据地址。 第2个参数是源数据个数。 第3个参数是求解出来的均方根。
注意事项
输入参数是1.31格式的相乘后输出就是1.31*1.31 2.62格式这种情况下函数内部使用的64位累加器很容易溢出并且这个函数不支持饱和运算。
15.4.3 函数arm_rms_q15
函数原型
void arm_rms_q15( const q15_t * pSrc, uint32_t blockSize, q15_t * pResult)
函数描述
这个函数用于求16位定点数的均方根。
函数参数 第1个参数源数据地址。 第2个参数是源数据个数。 第3个参数是求解出来的均方根。
注意事项
输入参数是1.15格式相乘后的的结果就是1.15*1.15 2.30格式这种情况下内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据然后通过饱和运算最终输出数据格式1.15。
15.4.4 使用举例
程序设计
/*
*********************************************************************************************************
* 函 数 名: DSP_RMS
* 功能说明: 求均方根
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void DSP_RMS(void)
{float32_t pSrc[10] {0.7060f, 0.0318f, 0.2769f, 0.0462f, 0.0971f, 0.8235f, 0.6948f, 0.3171f,
0.9502f, 0.0344f};float32_t pResult;uint32_t pIndex;q31_t pSrc1[10];q31_t pResult1;q15_t pSrc2[10];q15_t pResult2;arm_rms_f32(pSrc, 10, pResult);printf(arm_rms_f32 : pResult %f\r\n, pResult);/*****************************************************************/for(pIndex 0; pIndex 10; pIndex){pSrc1[pIndex] rand();}arm_rms_q31(pSrc1, 10, pResult1);printf(arm_rms_q31 : pResult %d\r\n, pResult1);/*****************************************************************/for(pIndex 0; pIndex 10; pIndex){pSrc2[pIndex] rand()%32768;}arm_rms_q15(pSrc2, 10, pResult2);printf(arm_rms_q15 : pResult %d\r\n, pResult2);printf(******************************************************************\r\n);
} 实验现象 15.5 方差Variance
这部分函数用于计算标准偏差公式描述如下
Result sqrt(((pSrc[0] * pSrc[0] pSrc[1] * pSrc[1] ... pSrc[blockSize-1] *
pSrc[blockSize-1]) / blockSize));
15.5.1 函数arm_var_f32
函数原型
void arm_var_f32( const float32_t * pSrc, uint32_t blockSize, float32_t * pResult)
函数描述
这个函数用于求32位浮点数的方差。
函数参数 第1个参数源数据地址。 第2个参数是源数据个数。 第3个参数是求解出来的方差。
15.5.2 函数arm_var_q31
函数原型
void arm_var_q31( const q31_t * pSrc, uint32_t blockSize, q31_t * pResult)
函数描述
用于求32位定点数的。
函数参数 第1个参数是源数据地址。 第2个参数是源数据个数。 第3个参数是计算出来的方差。
注意事项
输入参数是1.31格式的相乘后输出就是1.31*1.31 2.62格式这种情况下函数内部使用的64位累加器很容易溢出并且这个函数不支持饱和运算
15.5.3 函数arm_var_q15
函数原型
void arm_var_q15( const q15_t * pSrc, uint32_t blockSize, q15_t * pResult)
函数描述
用于求16位定点数的方差。
函数参数 第1个参数是源数据地址。 第2个参数是源数据个数。 第3个参数是计算出来的方差结果。
注意事项
输入参数是1.15格式相乘后的的结果就是1.15*1.15 2.30格式这种情况下内部64位累加器的的格式就是34.30。最终的输出结果要截取到低15位数据然后通过饱和运算最终输出数据格式1.15。
15.5.4 使用举例
程序设计
/*
*********************************************************************************************************
* 函 数 名: DSP_Var
* 功能说明: 求方差
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void DSP_Var(void)
{float32_t pSrc[10] {0.4387f, 0.3816f, 0.7655f, 0.7952f, 0.1869f, 0.4898f, 0.4456f, 0.6463f,
0.7094f, 0.7547f};float32_t pResult;uint32_t pIndex;q31_t pSrc1[10];q31_t pResult1;q15_t pSrc2[10];q15_t pResult2;arm_var_f32(pSrc, 10, pResult);printf(arm_var_f32 : pResult %f\r\n, pResult);/*****************************************************************/for(pIndex 0; pIndex 10; pIndex){pSrc1[pIndex] rand();}arm_var_q31(pSrc1, 10, pResult1);printf(arm_var_q31 : pResult %d\r\n, pResult1);/*****************************************************************/for(pIndex 0; pIndex 10; pIndex){pSrc2[pIndex] rand()%32768;}arm_var_q15(pSrc2, 10, pResult2);printf(arm_var_q15 : pResult %d\r\n, pResult2);printf(******************************************************************\r\n);
} 实验现象 15.6 Matlab求标准偏差均方差和方差
15.6.1 Matlab求标准偏差
在matlab的命令窗口输入如下命令:
a rand(1,10) %1行10列
然后再通过命令std获得标准偏差:
std(a) 15.6.2 Matlab求均方根
在matlab的命令窗口输入如下命令:
a rand(1,10) %1行10列
然后再通过命令rms获得均方根。
rms(a) 15.6.3 Matlab求方差
在matlab的命令窗口输入如下命令:
a rand(1,10) %1行10列
然后再通过命令var获得方差。
var(a) 15.7 实验例程说明MDK
配套例子
V5-210_DSP统计运算标准偏差均方根和方差
实验目的
学习统计运算标准偏差均方根和方差
实验内容
启动一个自动重装软件定时器每100ms翻转一次LED2。按下按键K1, DSP求标准偏差。按下按键K2, DSP求均方根。按下按键K3, DSP求方差。
使用AC6注意事项
特别注意附件章节C的问题
上电后串口打印的信息
波特率 115200数据位 8奇偶校验位无停止位 1。
详见本章的3.4 4.45.4小节。
程序设计 系统栈大小分配 硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现
/*
*********************************************************************************************************
* 函 数 名: bsp_Init
* 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
* 形 参无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{/* STM32F407 HAL 库初始化此时系统用的还是F407自带的16MHzHSI时钟:- 调用函数HAL_InitTick初始化滴答时钟中断1ms。- 设置NVIV优先级分组为4。*/HAL_Init();/* 配置系统时钟到168MHz- 切换使用HSE。- 此函数会更新全局变量SystemCoreClock并重新配置HAL_InitTick。*/SystemClock_Config();/* Event Recorder- 可用于代码执行时间测量MDK5.25及其以上版本才支持IAR不支持。- 默认不开启如果要使能此选项务必看V5开发板用户手册第8章*/
#if Enable_EventRecorder 1 /* 初始化EventRecorder并开启 */EventRecorderInitialize(EventRecordAll, 1U);EventRecorderStart();
#endifbsp_InitKey(); /* 按键初始化要放在滴答定时器之前因为按钮检测是通过滴答定时器扫描 */bsp_InitTimer(); /* 初始化滴答定时器 */bsp_InitUart(); /* 初始化串口 */bsp_InitExtIO(); /* 初始化扩展IO */bsp_InitLed(); /* 初始化LED */
} 主功能
主程序实现如下操作 启动一个自动重装软件定时器每100ms翻转一次LED2。 按下按键K1, DSP求标准偏差。 按下按键K2, DSP求均方根。 按下按键K3, DSP求方差。
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{uint8_t ucKeyCode; /* 按键代码 */bsp_Init(); /* 硬件初始化 */PrintfLogo(); /* 打印例程信息到串口1 */PrintfHelp(); /* 打印操作提示信息 */bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 *//* 进入主程序循环体 */while (1){bsp_Idle(); /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 *//* 判断定时器超时时间 */if (bsp_CheckTimer(0)) {/* 每隔100ms 进来一次 */ bsp_LedToggle(2);}ucKeyCode bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE 0 */if (ucKeyCode ! KEY_NONE){switch (ucKeyCode){case KEY_DOWN_K1: /* K1键按下求标准偏差 */DSP_Std();break;case KEY_DOWN_K2: /* K2键按下求均方根 */DSP_RMS();break;case KEY_DOWN_K3: /* K3键按下求方差 */DSP_Var();break;default:/* 其他的键值不处理 */break;}}}
} 15.8 实验例程说明IAR
配套例子
V5-210_DSP统计运算标准偏差均方根和方差
实验目的
学习统计运算标准偏差均方根和方差
实验内容
启动一个自动重装软件定时器每100ms翻转一次LED2。按下按键K1, DSP求标准偏差。按下按键K2, DSP求均方根。按下按键K3, DSP求方差。
上电后串口打印的信息
波特率 115200数据位 8奇偶校验位无停止位 1。
详见本章的3.5 4.55.5小节。
程序设计 系统栈大小分配 硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现
/*
*********************************************************************************************************
* 函 数 名: bsp_Init
* 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
* 形 参无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{/* STM32F407 HAL 库初始化此时系统用的还是F407自带的16MHzHSI时钟:- 调用函数HAL_InitTick初始化滴答时钟中断1ms。- 设置NVIV优先级分组为4。*/HAL_Init();/* 配置系统时钟到168MHz- 切换使用HSE。- 此函数会更新全局变量SystemCoreClock并重新配置HAL_InitTick。*/SystemClock_Config();/* Event Recorder- 可用于代码执行时间测量MDK5.25及其以上版本才支持IAR不支持。- 默认不开启如果要使能此选项务必看V5开发板用户手册第8章*/
#if Enable_EventRecorder 1 /* 初始化EventRecorder并开启 */EventRecorderInitialize(EventRecordAll, 1U);EventRecorderStart();
#endifbsp_InitKey(); /* 按键初始化要放在滴答定时器之前因为按钮检测是通过滴答定时器扫描 */bsp_InitTimer(); /* 初始化滴答定时器 */bsp_InitUart(); /* 初始化串口 */bsp_InitExtIO(); /* 初始化扩展IO */bsp_InitLed(); /* 初始化LED */
} 主功能
主程序实现如下操作 启动一个自动重装软件定时器每100ms翻转一次LED2。 按下按键K1, DSP求标准偏差。 按下按键K2, DSP求均方根。 按下按键K3, DSP求方差。
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{uint8_t ucKeyCode; /* 按键代码 */bsp_Init(); /* 硬件初始化 */PrintfLogo(); /* 打印例程信息到串口1 */PrintfHelp(); /* 打印操作提示信息 */bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 *//* 进入主程序循环体 */while (1){bsp_Idle(); /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 *//* 判断定时器超时时间 */if (bsp_CheckTimer(0)) {/* 每隔100ms 进来一次 */ bsp_LedToggle(2);}ucKeyCode bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE 0 */if (ucKeyCode ! KEY_NONE){switch (ucKeyCode){case KEY_DOWN_K1: /* K1键按下求标准偏差 */DSP_Std();break;case KEY_DOWN_K2: /* K2键按下求均方根 */DSP_RMS();break;case KEY_DOWN_K3: /* K3键按下求方差 */DSP_Var();break;default:/* 其他的键值不处理 */break;}}}
} 15.9 总结
本期教程就跟大家讲这么多有兴趣的可以深入研究这些函数源码的实现。