骑着蜗牛狂奔O 发表于 2022-8-16 19:45

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

原文地址https://mp.weixin.qq.com/s/cu2Fs8stKb3DQFbUZZkn4A
概述
AT32F4xx使用的是ARM Cortex®-M4F内核。ARM Cortex®-M4F是带有FPU内核处理器是一款32位的RISC处理器,具有优异的代码效率,采用通常8位和16位器件的存储器空间即可发挥ARM内核的高性能。该处理器支持一组DSP指令,能够实现有效的信号处理和复杂的算法执行。其单精度FPU(浮点单元)通过使用元语言开发工具,可加速开发,防止饱和。本文重点介绍基于AT32 MCU的DSP指令相关库函数及其简单应用示例,主要内容有:
[*]ARM Cortex®-M4F内核
[*]ARM官方CMSIS DSP库概述
[*]CMSIS DSP库移植到AT32
[*]常用示例展示
[*]CMSIS NN with DSP
注意:本文是基于AT32F403A的硬件条件,若使用者需要在AT32其他型号上使用,请修改相应配置即可。
AT32 MCU与M4F内核
AT32F403A系列与所有的ARM工具和软件兼容。这些丰富的外设配置,使得AT32系列微控制器适合于多种应用场合:
[*]消费类产品
− 手持云台− 微型打印机− 条形码扫描枪− 读卡器− 灯光控制
[*]物联网应用
− 智能家居应用− 物联网传感器节点
[*]工业应用
− 双CAN应用(OBD-II)− 光电编码器− 充电桩/BMS− 机器人控制− 电力控制
[*]电机控制
− BLDC/PMSM电机控制− 变频器− 伺服电机控制
系统架构
AT32F403A系列微控制器包括ARM® CortexTM-M4F处理器内核、总线架构、外设以及存储器构成。CortexTM-M4F处理器是一种新时代的内核,拥有许多先进功能。对比于CortexTM-M3,CortexTM-M4F处理器支持增强的高效DSP指令集,包含扩展的单周期16/32位乘法累加器MAC、双16位MAC指令、优化的8/16位SIMD运算及饱和运算指令,并且具有单精度IEEE-754浮点运算单元FPU。当设计中使用带DSP功能的CortexTM-M4F时就能格外节能,比软件解决方案更快,使CortexTM-M4F适用于那些要求微控制器提供高效能与低功耗的产品市场。1) Cortex-M4内核架构2) Cortex-M4与Cortex-M3的区别3) 部分DSP指令的介绍注意:上面所有的指令操作在CM4处理器上都只需一个指令周期。4) Cortex-M4 DSP指令比较5) 编译器对DSP指令的支持6) AT32F403A系统架构注意:AT32F403A不支持EMAC,AT32F407/407A支持EMAC
ARM官方CMSIS DSP库概述
CMSIS DSP库说明
CMSIS DSP软件库,是针对使用Cortex-M内核芯片提供一套数字信号处理函数。CMSIS DSP库大部分函数都是支持f32,Q31,Q15和Q7四种格式的。该库分为以下几个功能:
[*]基本数学函数Basic math functions
[*]快速数学函数Fast math functions
[*]复数型数学函数Complex math functions
[*]滤波器函数Filters
[*]矩阵型函数Matrix functions
[*]数学变换型函数Transform functions
[*]电机控制函数Motor control functions
[*]统计型数学函数Statistical functions
[*]支持型数学Support functions
[*]插补型数学函数Interpolation functions
针对以上每一种类型的库函数,下文会有详细介绍其使用方法和使用示例。
CMSIS DSP库文件
考虑到方便用户使用,ARM官方已编译好Cortex-M各型号的.lib库文件,并放置于Lib文件夹。与AT32F4xx相关的.Lib库文件主要有以下两种
[*]arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit) for AT32F403 and AT32F413
[*]arm_cortexM4l_math.lib (Cortex-M4, Little endian) for AT32F415
DSP库函数的声明位域头文件arm_math.h中,用户只要简单地将该头文件和.lib文件添加到自己的工程中,即可呼叫DSP库函数。该头文件对于浮点运算单元(FPU)的变量同样适用。
CMSIS DSP库示例
该CMSIS DSP库中的多个示例可以很好地展现DSP库函数的使用。
CMSIS DSP库的工具链支持
该DSP库已经可以在5.14版本MDK上开发和测试过。另外针对GCC编译器和IAR IDE,已经支持。
编译生成DSP的.lib库文件
该DSP安装包中已包含一个基于MDK的工程,通过编译该工程可生成需要的.lib库文件。该MDK工程位于CMSIS\DSP\Projects\ARM文件夹中。工程名为
[*]arm_cortexM_math.uvprojx
通过打开并编译该arm_cortexM_math.uvprojx MDK工程,可以生成该DSP的.lib库文件。这样用户就可以根据特定的内核,特定的优化选择去编译特定DSP的.lib库文件。同时,通过该MDK工程,用户也可以查看与修改指定的库函数原型,便于了解库函数的实现原理。
CMSIS-DSP文件夹结构
以下表格展现了CMSIS-DSP文件夹结构
CMSIS DSP库移植到AT32
本文主要介绍DSP库在MDK上的移植方法。
ARM官方CMSIS DSP函数详解

[*]基本数学函数Basic math functions
[*]快速数学函数Fast math functions
[*]复数型数学函数Complex math functions
[*]滤波器函数Filters
[*]矩阵型函数Matrix functions
[*]数学变换型函数Transform functions
[*]电机控制函数Motor control functions
[*]统计型数学函数Statistical functions
[*]支持型数学Support functions
[*]插补型数学函数Interpolation functions
详细使用方法和使用案例请参考1) ARM官网DSP培训资料地址:http://www.keil.com/pack/doc/CMSIS_Dev/DSP/html/index.html
AT32 DSP库快速使用
硬件资源1) 指示灯LED2/LED3/LED42) USART1(PA9/PA10)3) AT-START-F403A V1.0实验板

注:该DSP demo是基于AT32F403A的硬件条件,若使用者需要在AT32其他型号上使用,请修改相应配置即可。
软件资源1) Libraries
[*]drivers AT32底层驱动库
[*]cmsis CMSIS DSP库和CMSIS NN库
2) Project\AT_START_F403A
[*]examples,本文使用到的示例,如5_1_arm_class_marks_example,“5_1”表示章节,“arm_class_marks_example”表示示例名称
[*]templates,基于.lib建立的DSP template工程
3) Doca) AN0036_DSP_Instruction_and_Library_on_AT32_ZH_V2.x.x.pdf
DSP demo使用1) 打开AT32_DSP_DEMO_2.x.x\project\at_start_xxx\templates,编译后下载到实验板2) 观察LED2/LED3/LED4,若依次翻转则表明程序有正确执行DSP函数。
常用示例展示
本节主要通过使用前面介绍的DSP库函数进行案列展示,展示的示例如下:
[*]班级成绩统计示例
[*]卷积示例
[*]点积示例
[*]频率仓示例
[*]低通滤波示例
[*]图形音频均衡器示例
[*]线性插值示例
[*]矩阵示例
[*]信号收敛示例
[*]正弦余弦示例
[*]方差示例
[*]卷积网络神经示例

班级成绩统计示例
描述:演示使用最大,最小,均值,标准差,方差和矩阵函数来统计一个班级的成绩。注意:此示例还演示了静态初始化的用法。变量说明:
[*]testMarks_f32:指向20名学生在4门学科中获得的分数
[*]max_marks:最高分成绩
[*]min_marks:最低分成绩
[*]mean:所有成绩的平均分
[*]var:所有成绩的方差
[*]std:标准差
[*]numStudents:学生总数
使用到DSP软件库的函数有:
[*]arm_mat_init_f32()
[*]arm_mat_mult_f32()
[*]arm_max_f32()
[*]arm_min_f32()
[*]arm_mean_f32()
[*]arm_std_f32()
[*]arm_var_f32()
参考AT32_DSP_DEMO\project\at_start_f403a\examples\5_1_arm_class_marks_example
卷积示例
描述:本示例主要展示基于复数 FFT、复数乘法与支持函数的卷积理论。算法:卷积理论指出,时域中的卷积对应频域中的乘法。因此,两个信号的卷积后的傅里叶变换等于他们各自的傅里叶变换的乘积。使用快速傅里叶变换(FFT)可以有效的评估信号的傅里叶变换。两个输入信号a和b填充为零,n1和n2分别对应其信号长度。因此他们的长度将变为N,N大于或等于n1+n2-1。由于采用基4变换,因此基数为4。a和b的卷积是通过对输入信号进行FFT变换,对联更新好进行傅里叶变换。并对相乘后的结果进行逆FFT变换来获得的。由以下公式表示:A=FFT(a,N)B=FFT(b,N)conv(a, b)=IFFT(A*B, N)其中A和B分别是信号a和b的N点FFT。卷积长度为n1+n2-1框图: 变量说明
[*]testInputA_f32:指向第一个输入序列
[*]srcALen: 第一个输入时序的长度
[*]testInputB_f32:指向第二个输入序列
[*]srcBLen:第二个输入时序的长度
[*]outLen:卷积输出序列的长度,(srcALen+srcBLen-1)
[*]AxB:指向FFT乘积后输出数组地址
使用到DSP软件库的函数有:
[*]arm_fill_f32()
[*]arm_copy_f32()
[*]arm_cfft_radix4_init_f32()
[*]arm_cfft_radix4_f32()
[*]arm_cmplx_mult_cmplx_f32()
参考AT32_DSP_DEMO\project\at_start_f403a\examples\5_2_arm_convolution_example
点积示例
描述:本示例主要展示如何使用相乘和相加来实现点积。两个向量的点积是通过将对应元素相乘并相加来获得的。算法:将长度为n的两个输入向量A和B诸个元素相乘,然后相加以获得点积。由以下公式表示:dotProduct=A*B+A*B+...+A*B框图:变量描述:
[*]srcA_buf_f32:指向第一个输入向量
[*]srcB_buf_f32:指向第二个输入向量
[*]testOutput:存储两个向量的点积
使用到DSP软件库的函数有:
[*]arm_mult_f32()
[*]arm_add_f32()
参考AT32_DSP_DEMO\project\at_start_f403a\examples\5_3_arm_dotproduct_example
频率仓示例
描述:该示例主要展示使用复数FFT,复数幅值和最大值函数在输入信号的频域中计算最大能量仓。算法:输入测试信号为一个10 kHz信号,该信号具有均匀分布的白噪声。通过计算输入信号的FFT计算可以得到与10 kHz输入频率相对应的最大能量仓。框图:图8展示了具有均匀分布白噪声的10 kHz信号的时域信号,图9展示了这个输入信号的对应的频域信号,其中出现最高点的数对应的频率即为10 kHz信号能量仓。图8. 输入信号的频域 输入信号的频域变量描述
[*]testInput_f32_10khz:指向输入数据
[*]testOutput:指向输出数据
[*]fftSize l:FFT的长度
[*]ifftFlag flag:用于选择 CFFT/CIFFT
[*]doBitReverse Flag:用于选择是顺序还是逆序
[*]refIndex:参考索引值,在该值处能量最大
[*]testIndex:计算出的索引值,在该值处能量最大
使用到DSP软件库的函数有:
[*]arm_cfft_f32()
[*]arm_cmplx_mag_f32()
[*]arm_max_f32()
参考AT32_DSP_DEMO\project\at_start_f403a\examples\5_4_arm_fft_bin_example
FIR低通滤波示例
描述:使用FIR低通滤波器从输入中去除高频信号部分。本示例展示了如何配置FIR滤波,然后以块方式传递数据
算法:输入信号时两个正弦波的叠加:1 kHz and 15 kHz.该信号将被截止频率为6 kHz的进行低通滤波。低通滤波器滤掉了15 kHz信号,仅留下1 kHz信号输出。低通滤波器采用MATLAB设计,采样率为48 kHz,长度为29点。生成滤波器的MATLAB代码如下:h=fir1(28, 6/24);第一个参数是过滤器的“顺序”,并且总是比所需长度小1,。第二个参数是归一化截止频率。范围是0(DC)到1.0(Nyquist)。24 kHz奈奎斯特频率的6kHz截止频率为6/24=0.25归一化频率。CMSIS FIR滤波器函数要求系数按时间倒序排列。所得滤波器系数如下图所示。需要注意的是,该滤波器是对称的(线性相位FIR滤波器的属性)。对称点是样本14,对于所有频率,该滤波器具有14个样本的延迟
接下来显示滤波器的响应。滤波器的带通增益为1.0,截止频率为6kHz时达到0.5。输入信号如下所示。左侧显示时域信号,右侧显示频域。可以清楚的看到两个正弦波分量。滤波器输出如下所示,15kHz分量已被消除。变量描述:
[*]testInput_f32_1kHz_15kHz:指向输入数据
[*]refOutput points to the reference output data:指向参考输出数据
[*]testOutput points to the test output data:指向测试输出数据
[*]firStateF32 points to state buffer:指向状态缓冲区
[*]firCoeffs32 points to coefficient buffer:指向系数缓冲区
[*]blockSize number of samples processed at a time:一次处理的样本数
[*]numBlocks number of frames:帧数
使用到DSP软件库的函数有:
[*]arm_fir_init_f32()
[*]arm_fir_f32()
参考AT32_DSP_DEMO\project\at_start_f403a\examples\5_5_arm_fir_example
图形音频均衡器示例
描述:本示例展示了如何使用Biquad级联函数构造5频段图形均衡器。在音频应用中使用图形均衡器来改变音频的音质。框图:该设计是基于五级滤波器的级
每个滤波器部分均为40阶,由两个Biquad级联组成。每个滤波器的标称为0 dB(线性单位为1.0)并对特定频率范围内的信号进行增强或截止。5个频率段之间的边缘频率为100、500、2000和6000 Hz。每个频段都有一个可调的增强或消减范围,范围为+/- 9 dB。列如,从500到2000 Hz的频宽具有如下所示响应:图15. 从200Hz到2KHz的频宽响应以1 dB为步长,每个滤波器共有19种不同的设置。在MATLAB中预先计算了所有19中可能设置的频率器系数,并将其存储在表格中。使用5个不同表格,总共有5x19=95个不同的4阶过滤器。所有95个响应如下所示:图16. 19X5频率系数的过滤器响应每个4阶滤波器具有10个系数,意味着排列成950个不同滤波器系数。输入和输出数据为Q31模式。为了获得更好的噪声性能,两个低频算使用高精度 32x64 位双二阶滤波器。本示例中的输入信号使用对数线性调频。图17. 输入信号对数线性调频数组bandGains指定以dB为单位的增益应用于每个带宽。例如,如果bandGains={0, -3, 6, 4, -6};那么输出信号将是:图18. bandGains调频输出信号注意:输出线性调频信号跟随着每个带宽的增益或增强而变化。变量描述:
[*]testInput_f32:指向输入数据
[*]testRefOutput_f32:指向参考输出数据
[*]testOutput:指向测试输出数据
[*]inputQ31:临时输入缓冲区
[*]outputQ31:临时输出缓冲区
[*]biquadStateBand1Q31:指向band1的状态缓冲区
[*]biquadStateBand2Q31:指向band2的状态缓冲区
[*]biquadStateBand3Q31:指向band3的状态缓冲区
[*]biquadStateBand4Q31:指向band4的状态缓冲区
[*]biquadStateBand5Q31:指向band5的状态缓冲区
[*]coeffTable:指向所有频段的系数缓冲区
[*]gainDB:增益缓冲器,其增益适用于所有频段
使用到DSP软件库的函数有:
[*]arm_biquad_cas_df1_32x64_init_q31()
[*]arm_biquad_cas_df1_32x64_q31()
[*]arm_biquad_cascade_df1_init_q31()
[*]arm_biquad_cascade_df1_q31()
[*]arm_scale_q31()
[*]arm_scale_f32()
[*]arm_float_to_q31()
[*]arm_q31_to_float()
参考AT32_DSP_DEMO\project\at_start_f403a\examples\5_6_arm_graphic_equalizer_example


tpgf 发表于 2022-9-7 12:07

网络神经算法复杂不复杂啊

qcliu 发表于 2022-9-7 12:21

这些图谱代表什么呀

drer 发表于 2022-9-7 13:25

带宽的范围是多少

coshi 发表于 2022-9-7 13:40

这些状态缓冲区的大小都是多大的呢

kxsi 发表于 2022-9-7 13:47

这些波形是怎么得到的呢

wiba 发表于 2022-9-7 14:12

调频信号只能是线性的吗
页: [1]
查看完整版本: AT32 MCU DSP使用案例和网络神经算法CMSIS-NN案例(一)