[应用相关]

AT32 MCU DSP使用案例和网络神经算法CMSIS-NN案例(二)

[复制链接]
407|11
手机看帖
扫描二维码
随时随地手机跟帖
骑着蜗牛狂奔O|  楼主 | 2022-8-16 19:45 | 显示全部楼层 |阅读模式
原文地址https://mp.weixin.qq.com/s/cu2Fs8stKb3DQFbUZZkn4A


线性插值示例

描述:本案示例展示了线性插值模型和快速数学模型的用法。方法1使用快速数学正弦函数通过三次插值计算正弦值。方法2使用线性插值函数并将结果与参考输出进行比较。示例显示,与快速数学正弦计算相比,线性插值函数可用于获得更高的精度。
算法1:使用快速数学函数进行正弦计算
图19. 快速数学函数算法框图
191817er6racu99avaoypn.png
算法2:使用插值函数进行正弦计算
图20. 插值函数算法框图
191817mi6p79zvi2c8ccic.png
变量描述:
  • testInputSin_f32指向用于正弦计算的输入值
  • testRefSinOutput32_f32指向由matlab计算得到输出参考值p
  • testOutput指向由三次插值计算得到的输出缓冲
  • testLinIntOutput指向由线性插值计算得到的输出缓冲
  • snr1参考输出和三次插值输出的信噪比
  • snr2参考输出和线性插值输出的信噪比
使用到DSP软件库的函数有:
  • arm_sin_f32()
  • arm_linear_interp_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_7_arm_linear_interp_example
矩阵示例

描述:该示例展示了使用矩阵转置、矩阵乘法和矩阵求逆函数应用于最小二乘法处理的输入数据。最小二乘法是用于查找最佳拟合曲线,该曲线可使给定数据及的偏移平方和(最小方差)最小化。
算法:
做考虑参数的线性组合如下:The linear combination of parameters considered is as follows:A*X=B, where X is the unknown value and can be estimated from A & B.其中X表示未知值,可以根据AB进行估算。最小二乘法估算值X由以下公式算出X=Inverse(AT*A)*AT*B
框图:
图21. 矩阵算法框图
191817kfbvx2ew0b0zasom.png
变量描述:
A_f32 input matrix:线性组合方程的输入矩阵B_f32 output matrix:线性组合方程的输出矩阵X_f32 unknown matrix:矩阵A_f32B_f32估计而得到的未知矩阵
使用到DSP软件库的函数有:
arm_mat_init_f32()arm_mat_trans_f32()arm_mat_mult_f32()arm_mat_inverse_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_8_arm_matrix_example
信号收敛示例

描述:演示了展示了FIR低通滤波传递函数的自适应滤波器“学习能力,使用到的函数有归一化LMS滤波器,有限冲击相应(FIR)滤波器和基本数学函数来。
算法:
下图说明了此示例的信号流。均匀分布的白噪声通过FIR低通滤波器进行滤波。FIR滤波器的输出为自适应滤波器(标准化LMS滤波器)的提供参考输入。白噪声是自适应滤波器的输入。自适应滤波器学习FIR滤波器的传递函数。该滤波器输出两个信号:(1)内部自适应FIR滤波器的输出(2)自适应滤波器与FIR的参考输出之间的误差信号。随着自适应的滤波器不断学习学习FIR滤波器的传递函数,第一个输出将会接近于FIR滤波器的参考输出,误差信号也会不断接近于零。即使输入信号具有大的变化范围(即,从小到大变化),自适应滤波器也能正确收敛。自适应滤波器的系数初始化为零,在1536个样本上,内部函数test_signal_converge()找到停止条件。该功能检查误差信息的所有值是否都低于阈值DELTA的幅度。
框图:
图22. 信号收敛算法框图
191817z9brb5cv80vibb9s.png
变量描述:
testInput_f32:指向输入数据firStateF32:指向FIR状态缓冲区lmsStateF32:指向归一化最小方差FIRFIRCoeff_f32:指向系数缓冲区lmsNormCoeff_f32:指向归一化最小方差FIR滤波器系数缓冲区wire1, wir2, wire3:临时缓冲区errOutput, err_signal:临时错误缓冲区
使用到DSP软件库的函数有:
arm_lms_norm_init_f32()arm_fir_init_f32()arm_fir_f32()arm_lms_norm_f32()arm_scale_f32()arm_abs_f32()arm_sub_f32()arm_min_f32()arm_copy_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_9_arm_signal_converge_example
正弦余弦示例

描述:Demonstrates the Pythagorean trignometric identity with the use of Cosine, Sine, Vector Multiplication, and Vector Addition functions.通过使用正弦,余弦,向量乘法和向量加法函数演示三角学的勾股定理
算法:
数学上,勾股三角学恒等式由以下方程式定义:sin(x)*sin(x)+cos(x)*cos(x)=1其中x为弧度值
框图:
图23. 使用正弦余弦演示勾股定理算法框图
191817s9omqhkhzu6ckvmm.png
变量描述:
testInput_f32:以弧度为单位的角度输入数组testOutput stores:正弦值和余弦值的平方和
使用到 DSP 软件库的函数有:
arm_cos_f32()arm_sin_f32()arm_mult_f32()arm_add_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_10_arm_sin_cos_example
方差示例描述:演示如何使用基本函数和支持函数来计算 N 个样本的输入序列的方差,将均匀分布的白噪声作为输入。
算法:
序列的方差是各序列与序列平均值的平方差的平均值。
这有以下等式表示:
variance=((x[0]-x')*(x[0]-x')+(x[1]-x')*(x[1]-x')+...+*(x[n-1]-x')*(x[n-1]-x'))/(N-1)其中,x[n]是输入序列,N输入样本数,x是输入序列x[n]的平均值。
平均值x的定义如下:
x'=(x[0]+x[1]+...+x[n-1])/N
框图:
图24. 方差算法框图
191817cmiaii45ia44igr4.png
变量描述:
testInput_f32:指向输入数据wire1, wir2, wire3 :临时数据缓冲区blockSize:一次处理的样本数refVarianceOut:参考方差值
使用到DSP软件库的函数有:
arm_dot_prod_f32()arm_mult_f32()arm_sub_f32()arm_fill_f32()arm_copy_f32()
参考
AT32_DSP_DEMO\project\at_start_f403a\examples\5_11_arm_variance_example

CMSIS NN with DSP

介绍本用户手册介绍了CMSIS NN软件库,这是一个有效的神经网络内核的集合,这些内核的开发旨在最大程度地提高性能,并最大程度地减少神经网络在Cortex-M处理器内核上的存储空间。该库分为多个函数,每个函数涵盖特定类别:神经网络卷积函数神经网络激活功能全连接层功能神经网络池功能Softmax函数神经网络支持功能
该库具有用于对不同的权重和激活数据类型进行操作的单独函数,包括8位整数(q7_t)和16位整数(q15_t)。功能说明中包含内核的描述。本文[1]中也描述了实现细节。
图25. CMSIS NN程序架构
191818ips66fkrfg2prpgp.png
例子
该库附带了许多示例,这些示例演示了如何使用库函数。
预处理器宏
每个库项目都有不同的预处理器宏。
ARM_MATH_DSP:
如果芯片支持DSP指令,则定义宏ARM_MATH_DSP
ARM_MATH_BIG_ENDIAN:
定义宏ARM_MATH_BIG_ENDIAN来为大型字节序目标构建库。默认情况下,为小端目标建立库。
ARM_NN_TRUNCATE:
定义宏ARM_NN_TRUNCATE以使用floor而不是round-to-the-nearest-int进行计算
卷积神经网络示例

描述:演示了使用卷积,ReLU激活,池化和全连接功能的卷积神经网络(CNN)示例。
型号定义:
本示例中使用的CNN基于Caffe [1]CIFAR-10示例。该神经网络由3个卷积层组成,其中散布有ReLU激活层和最大池化层,最后是一个完全连接的层。网络的输入是32x32像素的彩色图像,它将被分类为10个输出类别之一。此示例模型实现需要32.3 KB的存储权重,40 KB的激活权和3.1 KB的存储im2col数据。图26. CIFAR10 CN算法框图
191818lce7imkgb5fxgd0b.png
神经网络模型定义
变量说明:conv1_wt,conv2_wtconv3_wt是卷积层权重矩阵conv1_biasconv2_biasconv3_bias是卷积层偏置数组ip1_wtip1_bias指向完全连接的图层权重和偏差input_data指向输入图像数据output_data指向分类输出col_buffer是用于存储im2col输出的缓冲区scratch_buffer用于存储激活数据(中间层输出)
CMSIS DSP软件库使用的功能:
arm_convolve_HWC_q7_RGB()arm_convolve_HWC_q7_fast()arm_relu_q7()arm_maxpool_q7_HWC()arm_avepool_q7_HWC()arm_fully_connected_q7_opt()arm_fully_connected_q7()
请参阅
AT32_DSP_DEMO\project\at_start_f403a\examples\6_1_arm_nnexamples_cifar10
门控循环单元示例

描述:使用完全连接的 Tanh / Sigmoid 激活功能演示门控循环单元(GRU)示例。
型号定义:
GRU是一种递归神经网络(RNN)。它包含两个S型门和一个隐藏状态。
计算可以总结为:
z[t]=SigmoidW_z⋅{h[t-1]x[t]}r[t]=sigmoidW_r{h[t-1]x[t]}n[t]=tanhW_n[r[t]×{h[t-1]x[t]}h[t]=1-z[t])×h[t-1]+z[t]×n[t]
图27. 门极递归单元图
191818z8i4phwerwh94r8p.png
变量说明:update_gate_weightsreset_gate_weightshidden_state_weights 是与更新门(W_z),重置门(W_r)和隐藏状态(W_n)对应的权重。update_gate_biasreset_gate_biashidden_state_bias是图层偏置数组test_input1test_input2test_history 是输入和初始历史记录
缓冲区分配为:
|重置|输入|历史|更新| hidden_state |这样,由于(复位,输入)和(输入,历史记录)在存储器中被物理地隐含,所以自动完成隐含。权重矩阵的顺序应相应调整。
CMSIS DSP 软件库使用的功能:
arm_fully_connected_mat_q7_vec_q15_opt()arm_nn_activations_direct_q15()arm_mult_q15()arm_offset_q15()arm_sub_q15()arm_copy_q15()
请参阅
AT32_DSP_DEMO\project\at_start_f403a\examples\6_2_arm_nnexamples_gru
DSP Lib的生成和使用

本节主要讲解如何将DSP源码打包为不同内核MCU所使用的lib文件。在Artery所提供的DSP包中没有包含官方所提供的lib文件,但包含了可生成lib文件的ARMGCCIAR三种编译环境的工程,用户可根据自己的需要选择适用的lib文件来进行生成。亦可将生成的lib文件替换掉工程中的DSP源码。下面分为两个部分来讲解lib文件的生成和使用。
DSP Lib生成

下面以ARM编译环境为例,展示如何生成所需的lib文件:1) 打开SourceCode\libraries\cmsis\DSP\Projects\ARM中的Keil工程;2) 在①处select target下拉框选择所需生成的lib文件;3) 点击②处进行编译;4) 待③处显示lib文件生成信息;5) SourceCode\libraries\cmsis\DSP\Lib\ARM中查看生成的lib文件。
图28. DSP Lib生成
191818owq6wcqfwfvgtu6u.png
DSP Lib使用

下面以5_1_arm_class_marks_example为例,展示如何使用lib文件:1) 点击①处打开manage project items界面;2) 点击②处,将③处内容全部删除;3) 点击④处找到SourceCode\libraries\cmsis\DSP\Lib\ARM路径下的lib文件进行添加;4) 点击OK,编译工程。
图29. DSP Lib使用
191818hmwgekjawqw91cw5.png

使用特权

评论回复
mnynt121| | 2022-8-20 14:12 | 显示全部楼层
有图像识别的算法吗  

使用特权

评论回复
ulystronglll| | 2022-8-20 15:05 | 显示全部楼层
网络神经算法对单片机有什么要求呢   

使用特权

评论回复
fengm| | 2022-8-20 15:48 | 显示全部楼层
需要对数据做缓冲处理吗  

使用特权

评论回复
saservice| | 2022-8-20 16:58 | 显示全部楼层
有完整的代码吗   

使用特权

评论回复
muyichuan2012| | 2022-8-20 19:46 | 显示全部楼层
有源码的 ,雅特力官网下载地址:  https://www.arterytek.com/cn/support/index.jsp?index=1   Apnote    AN0036

使用特权

评论回复
tpgf| | 2022-9-7 14:21 | 显示全部楼层
这种算法复杂的是不是就得用dsp啊

使用特权

评论回复
nawu| | 2022-9-7 14:37 | 显示全部楼层
如何建立快速数学模型呢

使用特权

评论回复
aoyi| | 2022-9-7 14:44 | 显示全部楼层
ulystronglll 发表于 2022-8-20 15:05
网络神经算法对单片机有什么要求呢

只能用dsp不能用单片机吧

使用特权

评论回复
zljiu| | 2022-9-7 14:50 | 显示全部楼层
请问lib文件可以通用吗

使用特权

评论回复
gwsan| | 2022-9-7 14:57 | 显示全部楼层
缓冲区可以自行分配吗

使用特权

评论回复
tfqi| | 2022-9-7 15:07 | 显示全部楼层
这些模型都是拿来免费使用的是吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则