电子发烧友网 > 人工智能 > 正文

基于STM32实现孤立词语音识别系统

2018年01月31日 19:23 次阅读

语音识别是机器通过识别和理解过程把人类的语音信号转变为相应文本或命令的技术,其根本目的是研究出一种具有听觉功能的机器。本设计研究孤立词语音识别系统及其在STM32嵌入式平台上的实现。识别流程是:预滤波、ADC、分帧、端点检测、预加重、加窗、特征提取、特征匹配。端点检测(VAD)采用短时幅度和短时过零率相结合。检测出有效语音后,根据人耳听觉感知特性,计算每帧语音的Mel频率倒谱系数(MFCC)。然后采用动态时间弯折(DTW)算法与特征模板相匹配,最终输出识别结果。先用Matlab对上述算法进行仿真,经多次试验得出算法中所需各系数的最优值。然后将算法移植到STM32嵌入式平台,移植过程中根据嵌入式平台存储空间相对较小、计算能力也相对较弱的实际情况,对算法进行优化。最终设计并制作出基于STM32的孤立词语音识别系统。

从技术上讲,语音识别属于多维模式识别和智能接口的范畴。它是一项集声学、语音学、计算机、信息处理、人工智能等于一身的综合技术,可广泛应用在信息处理、通信和电子系统、自动控制等领域。

国际上对语音识别的研究始于20世纪50年代。由于语音识别本身所固有的难度,人们提出了各种条件下的研究任务,并有此产生了不同的研究领域。这些领域包括:针对说话人,可分为特定说话人语音识别和非特定说话人语音识别;针对词汇量,可划分为小词汇量、中词汇量和大词汇量的识别,按说话方式,可分为孤立词识别和连续语音等。最简单的研究领域是特定说话人、小词汇量、孤立词的识别,而最难的研究领域是非特定人、大词汇量、连续语音识别。

在进入新世纪之前,语音识别技术大都只在特定行业或场所中使用或者仅仅停留在实验室,处于探索和试验中。最近十年由于消费电子行业的兴起和移动互联网技术的爆发。越来越多的自动化和自能化产品走进人们的日常生活。语音识别技术也随之进入大众的视线,并开始为更多人所了解和使用。例如语音门禁、智能电视上的语音换台、智能手机上的语音拨号、语音控制等等。语音识别技术正在由过去的实验探索迈入实用化阶段。我们有理由相信会有越来越多的产品用到语音识别技术,它与人工智能能技术的结合将会是一个重要的发展方向。语音识别技术最终会改变人与机器之间的交互方式,使之更加自然、便捷、轻松。

本设计的孤立词语音识别是语音识别技术中较为基本的,算法实现也较简单,适合于在嵌入式平台中实现一些简单的语音控制功能。以往类似系统大都基于ARM9、ARM11、DSP、SOC等。这些平台系统规模较大、开发和维护的难度较大、成本也相对较高。STM32是意法半导体(ST)公司推出的基于ARM Cortex-M3内核的高性能单片机。上市之后,由于其出色的性能、低廉的价格,很快被运用到众多产品中。经测试,STM32F103VET6单片机拥有能够满足本系统孤立词语音识别所需的运算和存储能力。所以在本系统中采用STM32F103VET6作为主控制器,采集并识别语音信号。以低廉的成本,高效的算法完成了孤立词语音识别的设计目标。本系统主要涉及的内容如下述:

语音信号的采集和前端放大、防混叠滤波、模数转换。

语音信号预处理,包括预加重、分帧、加窗。

语音信号端点检测,检测输入信号中有效语音的起始和结束点

语音信号特征提取。提取有效语音中每帧语音信号的Mel频率倒谱系数(MFCC)系数。

模板训练,对每个语音指令采集多个语音样本,根据语音样本获取每个语音指令的特征模板。

特征匹配,使用动态时间规整(DWT)算法计算输入语音信号与各模板的匹配距离。识别输入的语音信号。

系统硬件电路设计,人机界面设计。

第一章 方案论证及选择1.1系统设计任务要求本系统利用单片机设计了一个孤立词语音识别系统,能够识别0~9、 “上”、“下”、“左”、“右”14个汉语语音指令。系统通过触摸式LCD与用户交互。

本设计的主要要求如下:

1.采集外部声音信号,转换为数字信号并存储。

2.在采集到的声音信号中找出有效语音信号的开始和结束点。

3.分析检测到的有效语音,得出语音信号特征。

4.对每个待识别的语音指令,建立特征模版。

5.比较输入语音信号特征与特征模版,识别输入的语音信号

6.显示系统操作界面,并能够接受用户控制。

1.2硬件选择1.2.1 硬件方案总体介绍系统硬件由音频放大模块、MCU、触摸屏、电源四部分组成。音频放大模块完成对外部声音信号的采集和放大。将声音信号转化为电信号,并放大到0~3V。MCU的ADC参考电压为其电源电压3.3V。音频放大模块的输出信号不超出MCU ADC的电压范围,并且能够获得最大的量化精度。MCU对音频放大模块输入的声音信号进行AD转换。然后提取并识别信号特征。另外,MCU还控制触摸屏的显示和读取触摸屏点击位置。触摸屏负责显示操作界面,并接收用户操作。电源为电池供电。

系统硬件结构图如图1.1所示。

基于STM32实现孤立词语音识别系统

图1.1系统硬件总体结构图

1.2.2 MCU选择传统上孤立词语音识别多采用语音识别专用芯片,例如凌阳SPCE061A、LD3320等。此种方案设计简单,开发周期较短,但可拓展性较差,一般只能识别特定的语音,或者识别语音指令的个数有限制。且专用芯片价格一般相对较高,对系统成本控制不利。

STM32F103VET6是意法半导体(ST)推出的高性能32位Cortex-M3内核单片机,带有ADC、DAC、USB、CAN、SDIO、USART、SPI、IIC、FSMC、RTC、TIM、GPIO、DMA等大量片上外设。Cortex-M3内核属于ARM公司推出的最新架构ARMv7中的M系列,侧重于低成本、低功耗、高性能。其最高主频可达72MHz, 1.25 DMIPS/MHz的运算能力,三级流水线另加分支预测,并且还带有单周期乘法器和硬件除法器。相比较ARM7TDMI内核,Cortex-M3在性能上有较大的提升。

STM32F103VET6内置3个一共21通道的12位ADC,采样频率最高可达1MHz。12通道DMA控制器,可访问系统Flash、SRAM、片上外设,能够处理内存到外设、外设到内存的DMA请求。11个16位定时器,其中T1、T2、T3、T4、T5、T8可连接到ADC控制器,在每次定时器捕获/比较事件到来时自动触发ADC开始一次A/D转换。A/D转换完成后可自动触发DMA控制器将转换后的数据依次传送至SRAM的数据缓冲区。因此STM32F103VET6能够进行精确且高效的A/D转换。能够满足音频信号采集的需求。

STM32F103VET6的FSMC(Flexible StaTIc Memory Controller,可变静态存储控制器)能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度。FSMC连接至LCD控制器,可将LCD控制器配置为外部NOR Flash。在系统需要访问LCD时,自动生成满足LCD控制器要求的读写时序,能够精确、快速地完成对LCD界面显示的控制。内置3个最高可达18Mbit/s的SPI控制器,与触摸屏控制器相连能够实现触摸屏点击位置检测。

本系统中采集一个汉语语音指令。录音时间长度2s,以8KHz 16bit采样率对语音进行采集,所需存储空间为32KB,另外加上语音处理、特征提取及特征匹配等中间步骤所需RAM空间不会超过64KB。而STM32F103VET6带有512KB Flash和64KB RAM。所以STM32F103VET6在程序空间上能够满足。语音识别中最耗时的部分是特征提取中的快速傅立叶变换换。一般来说,孤立词语音识别中有效语音时间长度小于1s。语音信号一般10~30ms为一帧,本系统中按20ms一帧,帧移(相邻两帧的重叠部分)10ms,这样一个语音指令不超过100帧。在8KHz 16bit的采样率下,20ms为160采样点 。STM32固件库所提供的16位、1024点FFT,在内核以72MHz运行时每次运算仅需2.138ms。完成100帧数据的FFT所需时间为213.8ms,加上其他处理所需时间,识别一个语音指令耗时不会超过0.5s。所以在程序运行时间上STM32F103VET6也能够满足需要,能够进行实时的孤立词语音识别。

基于以上论证,本系统选用STM32F103VET6作为主控MCU。

1.2.3音频信号采集方案选择音频信号采集多采用音频编解码芯片,例如UDA1341、VS1003等。此类芯片能够提供丰富的功能,且系统一致性较好,但它们成本较高。本系统是一个低成本解决方案,并且只需要采集音频信号。因此不宜采用那些专用的音频编解码芯片。

在本系统的音频放大模块中使用小型话筒完成声电信号转换,两个9014三极管构成两级共基极放大电路。在每一级中加电压负反馈,稳定放大倍数。

语音信号的频带为300~3400Hz,根据抽样定理,抽样频率设为8000Hz就足以完成对语音信号的采集。在本系统中TIM1被设置为ADC触发信号源。TIM时钟源为系统时钟72MHz。经100分频,变为720KHz。计数模式为向上递增,自动重载值为90,即计数值从0递增到90再返回0。比较匹配值设为0~90间任意一个数值 ,则每秒可发出8000次比较匹配事件。ADC每秒完成8000次A/D转换,即抽样频率为8KHz。

1.2.4显示及操作界面选择触摸屏作为一种新的输入设备,它是目前最简单、方便、自然的一种人机交互方式。LCD触摸屏是一种可接收触摸点击输入信号的感应式液晶显示装置。当接触或点击屏幕时,触摸控制器可读取触摸点位置,如此可通过屏幕直接接受用户的操作。相比较机械式按钮,触摸屏在操作上更加直观生动。综合考虑,本设计中采用2.5寸240×320分辨率的LCD触摸屏实现界面显示和操作。

1.3算法选择1.3.1软件算法总体介绍对采集到的音频信号进行预处理、端点检测、特征提取、模板训练、特征匹配的一些列处理,最终识别输入语音。

系统软件流程图如下图所示。

基于STM32实现孤立词语音识别系统

1.3.2预处理算法选择语音信号的预处理主要包括: ADC、分帧、数据加窗、预加重。

语音信号的频率范围通常取100Hz~3400Hz,因为这个频段包含绝大部分的语音信息,对语音识别的意义最大。根据采样定律,要不失真地对3400Hz的信号进行采样,需要的最低采样率是6800Hz。为了提高精度,常用的A/D采样率在8kHz到12kHz。

语音信号有一个重要的特性:短时性。由于人在说话中,清音与浊音交替出现,并且每种音通常只延续很短的一段时间。因此,从波形上看,语音信号具有很强的“时变特性”。在浊音段落中它有很强的周期性,在清音段落中又具有噪声特性,而且浊音和清音的特征也在不断变化之中。如图1.4所示,其特性是随时间变化的,所以它是一个非稳态过程。但从另一方面看,由于语音的形成过程是与发音器官的运动密切相关的,这种物理性的运动比起声音振动速度来说是缓慢的(如图1.5所示)。因此在一个短时间范围内,其特性变化很小或保持不变,可以将其看做一个准稳态过程。我们可以用平稳过程的分析处理方法来分析处理语音信号。

7time-domain.jpg

图1.4 语音“7”的时域波形

Atonic-voicing-contrast.png

图1.5 语音“7”清音段和浊音段的20ms短时波形

基于以上考虑,对语音信号的分析处理必须采用短时分析法,也就是分帧。语音信号通常在10ms~30ms之间保持相对平稳。在本设计中,每帧取20ms。为了使前后帧之间保持平滑过渡,帧移10ms,即前后帧之间交叠10ms。

为了便于后续语音处理,需对分帧后的信号加窗。加窗方式如式(1-1)。

Add-window-method.png (1-1)

式中Y(n)是加窗后的信号,y(n)是输入信号,w(n)是窗函数,N是帧长。

窗函数可以选择矩形窗,即

Rectangular-window.png

(1-2)

rectangular-time-freq-domain.png

图1.6 矩形窗时域、频域示意图

或其他形式窗函数,如汉明窗

Hamming-window.png

(1-3)

Hamming-time-freq-domain.png

图1.7 汉明窗时域、频域示意图

这些窗函数的频率响应都具有低通特性,但不同的窗函数形状将影响分帧后短时特征的特性。图1.7和图1.8分别给出了160点矩形窗和汉明窗的时域和频域示意图。从图中可以看出汉明窗的带宽大约是同样宽度矩形窗带宽的两倍。同时,在通带外汉明窗的衰减比矩形窗大得多。矩形窗的主瓣较小,旁瓣较高;而汉明窗具有最宽的主瓣宽度和最低的旁瓣高度。

对语音信号分析来说,窗函数的形状是非常重要的,矩形窗的谱平滑性较好,但波形细节易丢失,并且矩形窗会产生泄露现象。而汉明窗可以有效地克服泄露现象,应用范围也最为广泛。基于以上论述,本设计选用汉明窗作为窗函数。图1.9和图1.10分别给出了一帧浊音加矩形窗和汉明窗后的时域和频域效果。

With-rectangular-window.png

图1.8 加矩形窗

Pre-emphasis-filter.png

图1.9 加汉明窗

由于人的发声器官的固有特性,语音从嘴唇辐射将有6dB/倍频的衰减。此种效应主要表现在高频信息的损失,对语音信号的特征提取会造成不利的影响。因此,必须对信号进行高频提升,即对信号进行高频的补偿,使得信号频谱平坦化,以便于进行频谱分析或声道参数分析。预加重可以用具有6dB/倍频提升高频特性的预加重数字滤波器实现。预加重滤波器一般是一阶的,其系统函数和差分方程如式(1-4)

Pre-emphasis-effect.png

(1-4)

其中y(n)为提升后的输出值,x(n)和x(n-1)分别为当前时刻和前一时刻的输入值。u接近于1,典型取值在0.94~0.97之间。本设计取0.95。预加重效果如图1.11所示。

Short-time-energy.png

图1.10 预加重效果图

1.3.3端点检测算法选择语音端点检测(VAD),也称为语音活动性检测,主要应用在语音处理中的语音编解码,语音识别及单信道语音增强等领域。语音端点检测的基本方法可以用一句话来表达:从输入信号中提取一个或一系列的对比特征参数,然后将其和一个或一系列的门限阀值进行比较(如图3-2)。如果超过门限则表示当前为有音段;否则表示当前为无音段。门限阀值通常是根据无音段时的特征确定的。但是由于语音和环境噪声的不断变化,使得这一判决过程变得非常复杂。通常语音端点检测是在语音帧的基础上进行的,语音帧的长度在10ms~30ms不等。一个好的语音端点检测算法必须具有对各种噪声的鲁棒性,同时要简单、适应性能好、时延小、且易于实时实现。

在高信噪比的情况下,常用的检测方法大体上有以下几种:短时能量、短时过零率。这些方法都是利用了语音和噪声的特征参数,因此判别效果较好。并且它们实现简单,计算量相对较小,因而得到广泛的应用。

短时能量定义如下式:

Short-time-average-magnitude.png (1-6)

式中N为帧长,E为一帧的短时能量值。

短时能量主要有以下几个方面的应用:首先短时能量可以区分清音和浊音,因为浊音的能量要比清音的大得多;其次可以用短时能量对有声段和无声段进行判定,以及连字分界等。短时能量由于是对信号进行平方运算,因而人为增加了高低信号之间的差距。更重要的的是平方运算的结果很大,容易产生数据溢出。解决这些问题的简单方法是采用短时平均幅度值来表示能量的变化。其定义如下:

Short-time-zero-crossing-rate.png

(1-7)

短时过零率是语音信号时域分析中最简单的一种特征,它指每帧内信号通过零值的次数,定义如下:

sign-function.png

(1-8)

式中,sgn(x)是符号函数,即

Short-time-threshold-rate.png

(1-9)

根据以上定义,清音由于类似于白噪声,所以过零率较高。浊音的能量集中于低频段,所以浊音信号的短时过零率较低。噪声的短时过零率较高,这主要是因为语音信号的能量主要集中在较低的频率范围内,而噪声信号的能量主要集中于较高的频段。这样计算的短时过零率容易受到噪声干扰。解决这个问题的方法是对上述定义稍作修改,即设置一个门限T,将过零率的含义修改为跨过正负门限的次数。修改后的定义如下式:

Endpoint-detection-General-SNR.png

(1-10)

这样计算的短时过零率就有一定的抗干扰能力,即使存在随机噪声,只要它不超过正负门限所构成的带,就不会产生虚假过零率。

综合考虑设计需要和系统处理能力,本设计采用短时幅度值和改进后的短时过零率判断语音起始和结束点。分别为短时幅度和短时过零率设置门限值。每次识别前,选定语音段前300ms作为背景噪声,用以确定这两个门限值,实现对背景噪声的自适应。具体的端点检测方法如下。

判断语音起始点,要求能够滤除突发性噪声。突发性噪声可以引起短时能量或过零率的数值很高,但是往往不能维持足够长的时间,如门窗的开关,物体的碰撞等引起的噪声,这些都可以通过设定最短时间门限来判别。超过两门限之一或全部,并且持续时间超过有效语音最短时间门限,返回最开始超过门限的时间点,将其标记为有效语音起始点。判断语音结束点,要求不能丢弃连词中间短暂的有可能被噪声淹没的“寂静段”。这可以通过设定无声段最长时间门限来判别。同时低于两门限,并且持续时间超过无声最长时间门限,返回最开始低于门限的时间点,将其标记为有效语音结束点。

图1.12和图1.13分别给出了上述算法在一般信噪比和低信噪比情况下的端点检测效果。从图中可以看出上述算法能够适应一般的背景噪声。在背景噪声较高时,上述算法无法准确判断语音起始结束点。但经过试验,当信噪比低至图1.13所示时时人耳也很难准确辨识语音。所以上述算法在实际使用中能够满足端点检测的需求。

Endpoint-detection-low-SNR.png

图1.11 一般信噪比下的端点检测效果

Mel-frequency.png

图1.12 低信噪比下的端点检测效果

1.3.4特征提取算法选择在语音识别系统中,模拟语音信号在完成A/D转换后成为数字信号。此时的语音信号为时域的信号,时域的信号难以进行分析和处理,而且数据量庞大。通常的做法是对时域信号进行变换,提取其中某种特定的参数,通过一些更加能反映语音本质特征的参数来进行语音识别。特征提取是识别过程中一个非常重要的环节,选取的特征直接影响到识别的结果。不同的特征对不同语音的敏感度也不一样,优秀的语音特征应该对不同字音距离较大,而相同字音距离较小。

另外,特征值的数目也是一个重要的问题。在满足使用要求的情况下,所使用的特征数应该尽量减少,以减少所涉及的计算量。但是过少的特征有可能无法恰当的描述原始语音,以致识别率下降。语音特征的提取方法是整个语音识别的基础,因此受到了广泛的重视。通过近几十年的发展,目前语音特征的提取方法主要有以下三类:

1.基于线性预测分析的提取方法。这一类的典型代表是线性预测倒谱系数LPCC。

2.基于频谱分析的提取方法。这一类的典型代表是Mel频率倒谱系数MFCC。

3.基于其它数字信号处理技术的特征分析方法。如小波分析、时频分析、人工神经网络分析等。

目前的孤立词语音识别系统大多采用前两种语音特征提取方法。在本文中,借鉴前人对LPCC系数和MFCC系数的总结对比,采用Mel频标倒谱系数MFCC。

人类的耳蜗实质上相当于一个滤波器组,耳蜗的滤波作用在1000Hz以下为线性尺度,而1000Hz以上为对数尺度,这就使得人耳对低频信号的分辨率高于对高频信号的分辨率。根据这一特性,研究者根据心理学实验得到了类似于耳蜗作用的一组滤波器组,这就是Mel频率滤波器组。Mel频率可以用如下公式表示:

Mel-frq-machup.png

(1-11)

Inverse-discrete-cosine-transform.png

图1.13 Mel频率与实际频率的对应关系

对频率轴的不均匀划分是MFCC特征区别于普通倒谱特征的最重要特点。将频率按照式(1-11)和图1.13变换到Mel域后,Mel带通滤波器组的中心频率是按照Mel频率刻度均匀排列的。在本设计中,MFCC倒谱系数的计算过程如下述。

1.对语音信号预加重、分帧、加汉明窗处理,然后进行短时傅里叶变换,得出频谱。

2.取频谱平方,得能量谱。并用24个Mel三角带通滤波器进行滤波;由于每个频带的分量在人耳中是叠加的,因此将每个滤波器频带内的能量进行叠加,输出Mel功率谱。

3.对每个滤波器的输出值取对数,得到相应频带的对数功率谱。然后对24个对数功率进行反离散余弦变换得到12个MFCC系数,反离散余弦变换如式(1-12),式中M=24,L=12。

基于STM32实现孤立词语音识别系统

(1-12)

在本设计中采集语音信号的抽样频率是8000Hz,频率范围是0Hz~4000Hz。在此频率范围内的Mel三角带通滤波器组如下图所示:

Characteristic-vector-sequence.png

图1.14 Mel三角滤波器组

与LPCC参数相比,MFCC参数具有以下优点:

1.语音的信息大多集中在低频部分,而高频部分易受环境噪声干扰。MFCC参数将线性频标转化为Mel频标。强调语音的低频信息,从而突出了有利于识别的信息,屏蔽了噪声的干扰。

2.MFCC参数没有任何前提假设,在各种情况下均可使用。而LPCC参数需要假定所处理的信号为AR信号,对于动态特性较强的辅音,这个假设并不是严格成立的。

因此,MFCC参数的抗噪声特性是优于LPCC参数的。在本设计中,采用的语音特征参数均为MFCC参数。

1.3.5特征匹配算法选择要建立一个性能良好的语音识别系统仅有好的语音特征还不够,还要有适当的语音识别的模型和算法。在现阶段,语音识别的过程是根据模式匹配的原则,计算未知语音模式与语音模板库中的每一个模板的距离测度,从而得到最佳的匹配模式。目前,语音识别所应用的模型匹配方法主要有动态时间弯折(DTW:Dynamic Time Warping)、隐马尔可夫模型(HMM:Hidden Markov Model)和人工神经网络(ANN:Artificial Neural Networks)等。当今孤立词识别领域最常用的识别算法是DTW和HMM。

DTW算法是较早的一种模式匹配和模型训练技术,它应用动态规划的方法成功解决了语音信号特征参数序列比较时时长不等的难题,在孤立词语音识别中获得了良好的性能。DTW算法是建立在动态规划(DP:Dynamic Programming)的理论基础上的。动态规划是一个很有效的方法来求取一个问题的最佳解。其中心思想简单的说可以描述为:在一条最佳的路径上,其中任意一条子路径也都必须是相关子问题的最佳路径,否则原路径就不是最佳路径。

HMM算法是数学上一类重要的双重随机模型,用概率统计的方法描述时变语音信号,很好的描述了语音信号的整体非平稳性和局部平稳性。HMM的各状态对应语音信号的各平稳段,各状态之间以一定转移概率相联系,是一种较为理想的语音模型。HMM模型属于统计语音识别,适用于大词汇量、非特定人的语音识别系统。随着现代计算机技术的迅猛发展,计算机的运算速度迅速提高,隐马尔科夫模型分析方法也得到了广泛利用。该算法在识别阶段计算量较少,适应性强,但是需要大量的前期训练工作,对系统资源的要求较多。

用于孤立词识别,DTW算法与HMM算法在相同的环境条件下,识别效果相差不大,但是HMM算法要复杂得多,这主要体现在HMM算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而DTW算法的训练中几乎不需要额外的计算。所以在孤立词语音识别中,DTW算法得到更广泛的应用。

综合比较DTW算法的工作量小,不需要大量的语音数据,而且DTW算法适合孤立词语音识别,且容易实现,节省系统资源,比较方便移植到嵌入式系统中。所以本系统选择DTW算法作为语音识别的核心算法。下面介绍DTW算法及其实现方法。

假设参考模板的特征矢量序列为,输入语音特征矢量序列为 Characteristic-vector-sequence-2.png ,输入语音特征矢量序列为Time-neat-function.png 。DTW算法就是要寻找一个最佳的时间规整函数,使待测语音的时间轴j非线性地映射到参考模板的时间轴i上,使总的累积失真量最小。

设时间规整函数为

a-match-point.png (1-13)

式中N为匹配路径长度, Local-matching-distance.png 表示第n个匹配点是参考模板的第i(n)个特征矢量与待测模板的第j(n)个特征矢量构成。两者之间的距离 The-measure-of-the-neat.png 称为局部匹配距离。DTW算法就是通过局部优化的方法实现匹配距离总和最小。

一般时间规整函数满足一下约束:

1.单调性,规整函数单调增加。

2.起点终点约束,起点对起点,终点对终点。

3.连续性,不允许跳过任何一点。

4.最大规整量不超过某一极限值。

DTW-Neat-area.png


M为窗宽。规整函数所处的区域位于平行四边形内,本设计中将平行四边形的约束区域端点放宽3点。局部路径约束,用于限制当第n步时,后几步存在几种可能的路径。本设计中DTW规整区域和局部路径如图1.16、图1.17所示。

DTW-route.png

图1.15 放宽端点限制的DTW规整区域

The-cumulative-matching-distance.png

图1.16 DTW局部路径

本设计中DTW算法计算步骤:

1.初始化。令i(0)=j(0)=0,i(N)=I,j(N)=J,确定一个如图1.16所示的规整约束区域Reg。它由一平行四边形变化而来。此平行四边形有两个位于(1,1)和(I,J)的顶点,相邻两条边的斜率分别为2和1/2。

2.按照如图1.17所示的路径递推求累计匹配距离。第n步匹配距离如下式

基于STM32实现孤立词语音识别系统

(1-14)

3.累计匹配距离除匹配步数,得归一化匹配距离。即输入特征与特征模板之间的匹配距离。计算输入特征与每一特征模板的匹配距离,匹配距离最小的特征模板与输入特征有最大的相似性。

第二章 系统设计2.1硬件设计2.1.1 MCU及其最小系统电路设计经过第一章的论证,选用意法半导体公司的STM32F103VET6单片机。

MCU输入时钟由8MHz晶振提供,经MCU内部PLL倍频至72MHz。在每一个电源引脚上并接0.1uF去耦电容,以提高MCU电源稳定性和抗干扰性。

2.1.2 音频信号采集电路设计音频信号采集电路原理图如下

基于STM32实现孤立词语音识别系统

图2.6 音频信号采集原理图

2.1.3 LCD接口电路设计本设计中显示器件选用2.4英寸TFT LCD显示屏,LCD驱动器是ILI9325 。

Thin Film Transistor (薄膜场效应晶体管),是指液晶显示器上的每一液晶象素点都是由集成在其后的薄膜晶体管来驱动。从而可以做到高速度高亮度高对比度显示屏幕信息。

ILI9325 是一个262144色的单芯片TFT LCD SoC 驱动。 它提供240×320的分辨率, 172,800字节的图形数据RAM ,并且带有内部电源电路。它与控制器的接口可设置为16位并口、8位并口、SPI接口。在本设计中为了提高显示数据的传输速率,采用了STM32F103VET6的FSMC(可变静态存储控制器)的16位并口作为MCU和ILI9325的接口。将ILI9325的数据和控制接口映射为外部存储器。MCU传送控制命令或显示数据时,自动生成相应的时序,避免了传统上采用IO口模拟时序,提高了数据传输效率。

2.2软件设计2.2.1 语音预处理算法设计语音信号预处理包括: 语音信号采集、分帧、数据加窗、预加重。

语音信号采集就是将外部模拟的语音信号,转换为MCU可处理和识别的数字信号的过程。在本设计中,通过MCU内部的定时器、模数转换器以及DMA控制器实现了对音频信号采集模块输入语音信号的数字化。其处理流程如下图所示。

noise-parameter-extraction.png

图2.9 语音信号数字化流程图

在程序中,控制语音信号采集的函数如下。

1void record(void)

2{

3 delay_ms(atap_len_t); //延时,规避点击屏幕发出的噪声

4 TIM_Cmd(TIM1, ENABLE); //开启定时器,开始信号采集

5 GUI_ClrArea(&(Label[G_ctrl])); //显示操作提示

6

7 GUI_DispStr(&(Label[G_ctrl]),“录音中”);

8 delay_ms(atap_len_t); //开始说话之前,录制一小段背景声音,用以实现背景噪声自适应

9 //提示开始说话

10 set_label_backclor(&(Label[G_spk]), spk_clor);

11 //等待缓冲区数据更新完毕

12 while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);

13 TIM_Cmd(TIM1, DISABLE); //数据采集结束,关闭定时器

14 DMA_ClearFlag(DMA1_FLAG_TC1); //清数据传输完成标志,以备下次使用

15 //提示开始处理采集到的数据

16 set_label_backclor(&(Label[G_spk]), prc_clor);

17}

分帧就是将采集到的语音数据分割成相同长度的片段,以用于短时分析。本设计中取20ms即160点为一帧,帧移10ms即80点。为了适应MCU存储空间有限的实际情况,分帧并没有被单独设计和占用单独的空间,而是在读语音数据缓冲区的时候按照帧长帧移的顺序依次读取。

由于端点检测属于时域分析,并不需要加窗和预加重,所以本设计中,分帧和预加重都加在端点检测之后提取MFCC之前。

2.2.2 端点检测算法设计本设计采用短时幅度和短时过零率相结合的端点检测算法。

首先去缓冲区前300ms作为背景噪声,提取背景噪声参数。用于后续端点检测。背景噪声参数由以下结构体定义。

1typedef struct

2{

3 u32 mid_val; //语音段中值 相当于有符号的0值 用于短时过零率计算

4 u16 n_thl; //噪声阈值,用于短时过零率计算

5 u16 z_thl; //短时过零率阈值,超过此阈值,视为进入过渡段。

6 u32 s_thl; //短时累加和阈值,超过此阈值,视为进入过渡段。

7}atap_tag; //自适应参数

提取函数为void noise_atap(const u16* noise,u16 n_len,atap_tag* atap),其提取过程如下。

Endpoint-detection-process.png

图2.10 背景噪声参数提取流程

然后根据提取到的短时过零率和短时幅度计算有效语音起始和结束点。有效语音端点由以下结构体定义。

1typedef struct

2{

3 u16 *start; //起始点

4 u16 *end; //结束点

5}valid_tag; //有效语音段

端点检测函数为void VAD(const u16 *vc, u16 buf_len, valid_tag *valid_voice, atap_tag *atap_arg)。其流程图如下。

Feature-extraction-process.png

图2.11 端点检测流程

2.2.3 特征提取算法设计及优化本设计选用12阶MFCC作为语音特征。此步是整个算法流程中最耗时也是优化空间最大的部分。因此,在程序设计中,沿用经典算法的同时做了大量的针对STM32嵌入式平台的优化工作。优化的中心思想是:尽量少使用或不使用浮点运算;使用整型数,其运算结果应尽量大以减少舍入噪声,但必须保证数据不会溢出;空间换时间。

FFT函数是u32* fft(s16* dat_buf, u16 buf_len)。它封装了了ST提供的STM32固件库里的void cr4_fft_1024_stm32(void *pssOUT, void *pssIN, u16 Nbin)函数。cr4_fft_1024_stm32()输入参数是有符号数,包括实数和虚数,但语音数据只包括实数部分,虚数用0填充,fft点数超出输入数据长度时,超过部分用0填充。cr4_fft_1024_stm32()输出数据包括实数和虚数,应该取其绝对值,即平方和的根。

语音特征用如下结构体定义。

1typedef struct

2{

3 u16 save_sign; //存储标记 用于判断flash中特征模板是否有效

4 u16 frm_num; //帧数

5 s16 mfcc_dat[vv_frm_max*mfcc_num]; //MFCC转换结果

6}v_ftr_tag;

获取MFCC的函数是void get_mfcc(valid_tag *valid, v_ftr_tag *v_ftr, atap_tag *atap_arg)。获取MFCC的一般步骤在上一章已有论述,在此介绍移植到MCU上需做的优化。

预加重的高通滤波系数为0.95,如果直接使用,则需要进行浮点运算,尽量避免,故使用y(n)=x(n)-x(n-1)×95/100。加汉明窗窗函数值如果每次都要重新计算,则需要进行三角函数运算,耗时严重,效率低下。但其数值是一定的,因此事先计算好160点的汉明窗值。存于数组中const u16 hamm[],使用时直接读取。FFT函数直接输入ADC转换过的值-2048~2047,其输出频谱幅值过小,舍入误差较大。数据输入前需作放大处理。vc_temp[ i]=(s16)(temp*hamm[ i]/(hamm_top/10));此句代码在实现加窗的同时,将语音数据放大10倍。Mel三角滤波器的中心频率和数值的计算涉及到对数运算,不宜直接计算,也实现计算好的数值存于Flash中,使用时直接读取。还有其他的优化措施,详见附件代码。

void get_mfcc(valid_tag *valid, v_ftr_tag *v_ftr, atap_tag *atap_arg)函数流程如下。

Feature-matching-process.png

图2.12 特征提取流程

2.2.4模板训练算法设计

本设计模板训练采用冗余模板算法,即每个语音指令存储4个特征模板,识别时输入特征分别与每个特征模板相比较,匹配距离最小的,就是识别结果。这4个特征模板存储于MCU Flash后端,模板训练时,将模板存于指定的Flash地址。为了保证保存的特征模板不被擦除或被其他代码或数据占用,需设置编译器的地址范围。

2.2.5特征匹配算法设计

本设计特征匹配算法采用 DTW(动态时间弯折)。其原理在上一章已有论述,在此不再赘述。其流程如下。

main-process.png

图2.13 特征匹配流程

2.2.6显示界面设计本设计在触摸式LCD上实现了简单的GUI操作界面。能够显示中英文文本框、按钮。

最基本元素为GUI_Area,定义如下。

1typedef struct

2{

3 u16 Left; //区域离屏幕左边界的距离 像素

4 u16 Top; //区域离屏幕上边界的距离 像素

5 u16 Width; //区域宽度 像素

6 u16 Height; //区域高度 像素

7 u16 BackColor; //区域背景色

8 u16 ForeColor; //区域前景色

9}GUI_Area;

在此基础上实现了以下函数。

1void wait_touch(void); //等待屏幕点击

2u8 touch_area(GUI_Area *area); //判断是否点击指定区域

3void GUI_HideArea(GUI_Area *Area); //隐藏区域 显示屏幕前景色

4void GUI_ClrArea(GUI_Area *Area); //清除区域 显示区域背景色

5void GUI_DispStr(GUI_Area *Area,const u8 *str); //在区域内显示字符串

6void GUI_printf(GUI_Area *Area,char *fmt, 。。。); //printf函数在区域内的实现

配合显示界面,主函数流程如下。

基于STM32实现孤立词语音识别系统

图2.14 主程序流程

第三章 系统制作及调试结果3.1系统制作与调试本系统的制作调试主要分为Matlab仿真、硬件调试、软件调试。

经过初步的分析设计后,Matlab中仿真算法。调节算法细节,直至能够较好地实现所需功能,再将其移植到MCU平台上。在设计制作硬件电路的同时,调试穿插进行,应用系统的硬件调试和软件调试是分不开的,许多硬件故障是在调试软件时才发现的。但通常是先排除系统中明显的硬件故障后才和软件结合起来调试,如此有利于问题的分析和解决,不会造成问题的积累,从而可以节约大量的调试时间。软件编程中,首先完成单元功能模块的调试,然后进行系统调试,整体上采用硬件调试的调试方法。

3.2制作与调试结果经过制作与调试,实现了系统预设功能。实物图如下。

Template-training-UI.jpg

图3.1 实物图 欢迎界面

Speech-recognition-UI.jpg

图3.2 实物图 模板训练界面

图3.3 实物图 语音识别界面

结 论原理样机经过设计方案论证,设计了相应的硬件电路和系统软件,制作了电路原理样机并进行单机调试,结果表明,所设计的电路和软件能完成基本的测试功能。

采用STM32F103VET6单片机构建语音识别系统,通过此系统对语音信号进行采集、前端放大、AD转换、预处理、MFCC特征提取、模板训练、DTW特征匹配的一系列步骤,完成孤立词语音识别的预期目标。

本设计目前也存在一些不足,例如语音信号采集模块的动态范围不足,当说话声音较大或较小时,会出现无法识别的现象,需加上自动增益控制功能。语音识别时,录音控制不方便,最好能够改进为完全通过语音控制。特征模板仅仅用12阶MFCC略显不足,可添加MFCC一阶差分。

参考文献[1] 韩纪庆、张磊、郑铁然。 语音信号处理。 北京:清华大学出版社[M],2004年9月

[2] 董辰辉、彭雪峰。 MATLAB 2008 全程指南。 北京:电子工业出版社[M],2009年3月

[3] 张雪英。 数字语音处理及MATLAB仿真。 北京:电子工业出版社[M],2011年7月

[4] 赵力。 语音信号处理 第2版。 北京:机械工业出版社[M],2011年6月

[5] 陈程。 机载环境下的语音识别技术及实现[J]。电子科技大学硕士学位论文,2008年5月

[6] 蒋子云。 基于ARM嵌入式孤立词语音识别系统研究与实现[J]。 中南大学硕士学位论文, 2009年5月

[7] 白顺先。 汉语孤立字语音识别技术的研究[J]。 西南交通大学硕士学位论文, 2009年6月

[8] 童红。 孤立词语音识别系统的技术研究[J]。 江苏大学硕士学位论文, 2009年6月

[9] 汪冰。 小词汇非特定人的孤立词语音识别系统的研究与设计[J]。 广东工业大学硕士学位论文, 2008年5月

[10] 黄振华。 孤立词识别中的说话人归一化技术[J]。 上海大学硕士学位论文, 2009年1月

开源

/********* main.C **********/

#include “includes.h”

#include “VAD.H”

#include “MFCC.H”

#include “DTW.H”

#include “GUI.H”

#include “flash.h”

#include “delay.h”

u16 VcBuf[VcBuf_Len];

atap_tag atap_arg;

valid_tag valid_voice[max_vc_con];

v_ftr_tag ftr;

typedef struct

{

u8 str[3];

}comm_tag;

comm_tag commstr[]={“0 ”,“1 ”,“2 ”,“3 ”,“4 ”,“5 ”,“6 ”,“7 ”,“8 ”,“9 ”,“上”,“下”,“前”,“后”,“左”,“右”,“大”,“小”};

#define sel_clor BRED

#define dis_sel_clor GRED

#define spk_clor BRED

#define prc_clor GRED

#define save_ok 0

#define VAD_fail 1

#define MFCC_fail 2

#define Flash_fail 3

void disp_comm(u8 comm)

{

GUI_ClrArea(&(Label[comm]));

GUI_DispStr(&(Label[comm]),(u8 *)(commstr[comm-G_comm_fst].str));

}

void set_comm_backclor(u8 comm, u16 backclor)

{

Label[comm].BackColor=backclor;

disp_comm(comm);

}

void set_label_backclor(GUI_Area *Label, u16 backclor)

{

Label-》BackColor=backclor;

GUI_ClrArea(Label);

}

void disp_home(void)

{

GUI_ClrArea(&Screen);

GUI_ClrArea(&(Label[G_wel]));

GUI_DispStr(&(Label[G_wel]),“欢迎使用”);

GUI_ClrArea(&(Label[G_neme]));

GUI_DispStr(&(Label[G_neme]),“孤立词语音识别测试系统”);

GUI_ClrArea(&(Label[G_prc]));

GUI_DispStr(&(Label[G_prc]),“模板训练”);

GUI_ClrArea(&(Label[G_recg]));

GUI_DispStr(&(Label[G_recg]),“语音识别”);

GUI_ClrArea(&(Label[G_designer]));

GUI_DispStr(&(Label[G_designer]),“设计者:宋健”);

}

void record(void)

{

delay_ms(atap_len_t); //延时,避免点击屏幕发出的噪声

TIM_Cmd(TIM1, ENABLE); //开启定时器,开始信号采集

GUI_ClrArea(&(Label[G_ctrl])); //显示操作提示

GUI_DispStr(&(Label[G_ctrl]),“录音中”);

//开始说话之前,录制一小段背景声音,用以实现背景噪声自适应

delay_ms(atap_len_t);

//提示开始说话

set_label_backclor(&(Label[G_spk]), spk_clor);

//等待缓冲区数据更新完毕

while(DMA_GetFlagStatus(DMA1_FLAG_TC1)==RESET);

//数据采集结束,关闭定时器

TIM_Cmd(TIM1, DISABLE);

//清数据传输完成标志,以备下次使用

DMA_ClearFlag(DMA1_FLAG_TC1);

//提示开始处理采集到的数据

set_label_backclor(&(Label[G_spk]), prc_clor);

}

void disp_mdl_prc(void)

{

u16 i;

GUI_ClrArea(&Screen);

set_label_backclor(&(Label[G_cap]), BRED);

GUI_DispStr(&(Label[G_cap]),“开始训练”);

for(i=G_comm_fst;i《=G_comm_lst;i++)

{

disp_comm(i);

}

GUI_ClrArea(&(Label[G_return]));

GUI_DispStr(&(Label[G_return]),“返回”);

}

u8 save_mdl(u16 *v_dat, u32 addr)

{

noise_atap(v_dat,atap_len,&atap_arg);

VAD(v_dat, VcBuf_Len, valid_voice, &atap_arg);

if(valid_voice[0].end==((void *)0))

{

return VAD_fail;

}

get_mfcc(&(valid_voice[0]),&ftr,&atap_arg);

if(ftr.frm_num==0)

{

return MFCC_fail;

}

return save_ftr_mdl(&ftr, addr);

}

void prc(void)

{

u32 i;

u8 prc_start=0;

u8 comm=G_comm_fst;

u8 prc_count=0;

u32 addr;

//v_ftr_tag *sav_ftr;

disp_mdl_prc();

set_comm_backclor(comm,sel_clor);

while(1)

{

wait_touch();

if(touch_area(&(Label[G_return])))

{

Label[G_cap].BackColor=GREEN;

Label[comm].BackColor=dis_sel_clor;

disp_home();

return;

}

else if(touch_area(&(Label[G_cap])))

{

delay_ms(150);

if(prc_start==0)

{

GUI_ClrArea(&(Label[G_cap]));

GUI_DispStr(&(Label[G_cap]),“停止训练”);

prc_start=1;

GUI_ClrArea(&(Label[G_ctrl]));

GUI_DispStr(&(Label[G_ctrl]),“开始”);

GUI_ClrArea(&(Label[G_spk]));

GUI_ClrArea(&(Label[G_count]));

GUI_DispStr(&(Label[G_count]),“已训练0次”);

}

else

{

GUI_ClrArea(&(Label[G_cap]));

GUI_DispStr(&(Label[G_cap]),“开始训练”);

prc_start=0;

prc_count=0;

GUI_HideArea(&(Label[G_ctrl]));

GUI_HideArea(&(Label[G_spk]));

GUI_HideArea(&(Label[G_stus]));

GUI_HideArea(&(Label[G_count]));

}

}

else if((touch_area(&(Label[G_ctrl])))&&(prc_start==1))

{

record();

GUI_ClrArea(&(Label[G_ctrl]));

GUI_DispStr(&(Label[G_ctrl]),“提取中”);

addr=ftr_start_addr+(comm-G_comm_fst)*size_per_comm+prc_count*size_per_ftr;

if(save_mdl(VcBuf, addr)==save_ok)

{

prc_count++;

GUI_ClrArea(&(Label[G_count]));

GUI_printf(&(Label[G_count]),“已训练%d次”,prc_count);

if(prc_count==ftr_per_comm)

{

prc_count=0;

}

GUI_ClrArea(&(Label[G_stus]));

GUI_DispStr(&(Label[G_stus]),“语音有效”);

/*

sav_ftr=(v_ftr_tag *)addr;

USART1_printf(“mask=%d ”,sav_ftr-》save_sign);

USART1_printf(“frm_num=%d”,sav_ftr-》frm_num);

for(i=0;i《((sav_ftr-》frm_num)*mfcc_num);i++)

{

USART1_printf(“%d,”,sav_ftr-》mfcc_dat[i]);

}

*/

}

else

{

GUI_ClrArea(&(Label[G_stus]));

GUI_DispStr(&(Label[G_stus]),“语音无效”);

}

GUI_ClrArea(&(Label[G_ctrl]));

GUI_DispStr(&(Label[G_ctrl]),“开始”);

}

else if(prc_start==0)

{

for(i=G_comm_fst;i《=G_comm_lst;i++)

{

if(touch_area(&(Label[i])))

{

set_comm_backclor(comm,dis_sel_clor);

comm=i;

set_comm_backclor(comm,sel_clor);

break;

}

}

}

}

}

u8* spch_recg(u16 *v_dat, u32 *mtch_dis)

{

u16 i;

u32 ftr_addr;

u32 min_dis;

u16 min_comm;

u32 cur_dis;

v_ftr_tag *ftr_mdl;

noise_atap(v_dat, atap_len, &atap_arg);

VAD(v_dat, VcBuf_Len, valid_voice, &atap_arg);

if(valid_voice[0].end==((void *)0))

{

*mtch_dis=dis_err;

USART1_printf(“VAD fail ”);

return (void *)0;

}

get_mfcc(&(valid_voice[0]),&ftr,&atap_arg);

if(ftr.frm_num==0)

{

*mtch_dis=dis_err;

USART1_printf(“MFCC fail ”);

return (void *)0;

}

i=0;

min_comm=0;

min_dis=dis_max;

for(ftr_addr=ftr_start_addr; ftr_addr《ftr_end_addr; ftr_addr+=“size_per_ftr)

{

ftr_mdl=(v_ftr_tag*)ftr_addr;

//USART1_printf(”save_mask=%d “,ftr_mdl-》save_sign);

cur_dis=((ftr_mdl-》save_sign)==save_mask)?dtw(&ftr,ftr_mdl):dis_err;

//USART1_printf(”cur_dis=%d “,cur_dis);

if(cur_dis《min_dis)

{

min_dis=cur_dis;

min_comm=i;

}

i++;

}

min_comm/=ftr_per_comm;

//USART1_printf(”recg end “);

*mtch_dis=min_dis;

return (commstr[min_comm].str);

}

void disp_recg(void)

{

GUI_ClrArea(&Screen);

GUI_ClrArea(&(Label[G_cap]));

GUI_DispStr(&(Label[G_cap]),”语音识别“);

GUI_ClrArea(&(Label[G_ctrl]));

GUI_DispStr(&(Label[G_ctrl]),”开始“);

GUI_ClrArea(&(Label[G_spk]));

GUI_ClrArea(&(Label[G_return]));

GUI_DispStr(&(Label[G_return]),”返回“);

}

void recg(void)

{

u8 *res;

u32 dis;

u32 recg_count=0;

disp_recg();

while(1)

{

wait_touch();

if(touch_area(&(Label[G_return])))

{

disp_home();

return;

}

else if(touch_area(&(Label[G_ctrl])))

{

record();

GUI_ClrArea(&(Label[G_ctrl]));

GUI_DispStr(&(Label[G_ctrl]),”识别中“);

res=spch_recg(VcBuf, &dis);

if(dis!=dis_err)

{

recg_count++;

GUI_ClrArea(&(Label[G_recg_res]));

GUI_printf(&(Label[G_recg_res]),”识别结果:%s“,(s8 *)res);

GUI_ClrArea(&(Label[G_mtch_dis]));

GUI_printf(&(Label[G_mtch_dis]),”匹配距离:%d“,dis);

GUI_ClrArea(&(Label[G_stus]));

GUI_DispStr(&(Label[G_stus]),”语音有效“);

GUI_ClrArea(&(Label[G_count]));

GUI_printf(&(Label[G_count]),”已识别%d次“,recg_count);

}

else

{

GUI_HideArea(&(Label[G_recg_res]));

GUI_HideArea(&(Label[G_mtch_dis]));

GUI_ClrArea(&(Label[G_stus]));

GUI_DispStr(&(Label[G_stus]),”语音无效“);

}

GUI_ClrArea(&(Label[G_ctrl]));

GUI_DispStr(&(Label[G_ctrl]),”开始“);

}

}

}

int main(void)

{

BSP_Init();

USART1_printf(”SYS Init OK!“);

USART1_printf(”CPU Speed:%ld MHz“, BSP_CPU_ClkFreq() / 1000000L);

disp_home();

while(1)

{

wait_touch();

if(touch_area(&(Label[G_prc])))

{

prc();

}

else if(touch_area(&(Label[G_recg])))

{

recg();

}

}

}

技术专区

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

R-Car H2主要特性和系统框图_汽车ADAS...

Renesas公司的R-Car H2是基于ARM® Cortex™A-15四核配置和big.LITT...

发表于 2018-04-14 17:24 37次阅读
R-Car H2主要特性和系统框图_汽车ADAS...

接入stm32的io口后电平不能翻转了,求各位大佬帮助

发表于 2018-04-14 14:20 29次阅读
接入stm32的io口后电平不能翻转了,求各位大佬帮助

一文看懂STM32单片机和51单片机区别

单片微型计算机简称单片机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序...

发表于 2018-04-13 17:47 669次阅读
一文看懂STM32单片机和51单片机区别

stm32与pic单片机比较_哪个好

本文首先介绍了stm32单片机的特性及优缺点,其次介绍了pic单片机的特点及不足,最后阐述了stm3...

发表于 2018-04-13 16:52 63次阅读
stm32与pic单片机比较_哪个好

如何集成图灵机器人,简单实现语音聊天

图灵机器人有三个基本功能: (1)语音识别:将语音识别成相应的文本。 (2)语义理解:将文本识别成领...

发表于 2018-04-13 09:49 148次阅读
如何集成图灵机器人,简单实现语音聊天

自动驾驶、语音识别、晋升为热度最高职位

人工智能在经历了迅速发展之后,AI 领域的人才需求也发生调整。近日,猎聘联合 GMIC 发布了《 2...

发表于 2018-04-12 15:38 258次阅读
自动驾驶、语音识别、晋升为热度最高职位

STM32L496AGI6及P-L496G-CE...

ST公司的STM32L496AGI6是基于高性能Arm® Cortex®-M4 32-位RISC核的...

发表于 2018-04-12 05:07 34次阅读
STM32L496AGI6及P-L496G-CE...

成熟的设计还在用三极管是原因!

这周检查水泵变频器的电路,定稿用,发现数码管的控制三极管,基极竟然没有串联电阻,这会导致单片机的IO...

发表于 2018-04-11 17:21 561次阅读
成熟的设计还在用三极管是原因!

深度解读STM32数据保存与毁灭

单通道选择:有16个多路通道。可以把转换分成两组:规则的和注入的。在任意多个通道上以任意顺序进行的一...

发表于 2018-04-10 09:15 43次阅读
深度解读STM32数据保存与毁灭

需要做一套水质监测系统,想请问一下各位大神有研究得能提供一下方案不

发表于 2018-04-08 17:03 198次阅读
需要做一套水质监测系统,想请问一下各位大神有研究得能提供一下方案不

STM32Note初识单片机

本连载将以STM32F103为例为学习嵌入式系统开发搭建一个基础知识框架。 初识单片机系列将会介绍单...

发表于 2018-04-08 10:00 48次阅读
STM32Note初识单片机

基于STM32芯片的一款智能台灯

随着现代科学技术的不断发展,生活用品的智能化程度也越来越普及,人们对一些家居物品的人性化、智能化设计...

发表于 2018-04-08 08:48 810次阅读
基于STM32芯片的一款智能台灯

基于STM32的家庭服务机器人系统工作原理及设计

为解决当前大部分家庭服务机器人不具备行走功能或只具有简单的避障能力等问题,本文设计一种基于STM32...

发表于 2018-04-06 08:26 525次阅读
基于STM32的家庭服务机器人系统工作原理及设计

基于STM32的伺服压力机控制系统设计

伺服压力机的基本结构及对控制系统的要求与传统压力机比较,伺服压力机取消了原有压力机的飞轮和离合器,保...

发表于 2018-04-06 08:07 402次阅读
基于STM32的伺服压力机控制系统设计

STM32的串口中断配置

STM32的串口中断配置,也是很简单的. 首先是配置UART的GPIO口 首先是配置UART的GPI...

发表于 2018-04-06 07:24 299次阅读
STM32的串口中断配置

基于STM32单片机的DLP1700显示电路、光...

传统的数字微镜显示技术的信号输入端是由DVI接口提供图像信号和行场同步信号,由MSP430单片机对D...

发表于 2018-04-06 02:58 337次阅读
基于STM32单片机的DLP1700显示电路、光...

这样做为什么会导致占空比改变?

发表于 2018-04-05 17:28 190次阅读
这样做为什么会导致占空比改变?

深度学习如何确定最佳深度?

确定最佳深度可以降低运算成本,同时可以进一步提高精度。针对深度置信网络深度选择的问题,文章分析了通过...

发表于 2018-04-04 15:46 136次阅读
深度学习如何确定最佳深度?

Keil MDK3.20的stm32调试方法

要点: (1)程序的下载地址改到RAM空间中 (2)程序的debug之前要设定SP,PC指针到R...

发表于 2018-04-04 11:49 99次阅读
Keil MDK3.20的stm32调试方法

基于STM32的数字PDA系统软件系统设计

数字PDA系统整体由硬件电路和软件系统2部分组成,硬件电路由低功耗ARM微控制器STM32ZET6控...

发表于 2018-04-04 11:25 109次阅读
基于STM32的数字PDA系统软件系统设计

stm32 LCD12864 串口无显示

发表于 2018-04-03 23:41 378次阅读
stm32   LCD12864 串口无显示

请问像4054那样的充电ic,如何用单片机读取chrg端口充电状态

发表于 2018-04-03 15:57 321次阅读
请问像4054那样的充电ic,如何用单片机读取chrg端口充电状态

Alexa语音服务软件扩展STM32Cube

X-CUBE-AVS扩展套件包含一组用于STM32F7系列微控制器的库和应用示例,充当支持Alexa...

发表于 2018-04-03 13:41 1725次阅读
Alexa语音服务软件扩展STM32Cube

STM32进入和退出睡眠模式

要求系统按如下方式进入和退出睡眠模式:在系统启动2秒后,将RTC在3秒钟之后配置为产生一个报警事件,...

发表于 2018-04-03 11:43 106次阅读
STM32进入和退出睡眠模式

STM32开放式开发环境手册

发表于 2018-04-03 10:50 246次阅读
STM32开放式开发环境手册

用于STM32Cube的Alexa语音服务软件扩展

发表于 2018-04-03 10:44 554次阅读
用于STM32Cube的Alexa语音服务软件扩展

开始使用STM32Cube的Alexa语音服务软件扩展

发表于 2018-04-03 10:43 538次阅读
开始使用STM32Cube的Alexa语音服务软件扩展

STM32单片机--PWM输出

采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指...

发表于 2018-04-03 08:54 252次阅读
STM32单片机--PWM输出

单片机STM32时钟图文理解

如输出到称为HCLK、FCLK的时钟,还直接输出到SDIO外设的SDIOCLK时钟、存储器控制器FS...

发表于 2018-04-03 08:45 326次阅读
单片机STM32时钟图文理解

RT-Thread Nano 3.0.3 的基本...

RT-Thread是一个高度可配置的嵌入式实时操作系统,配置文件是rtconfig.h。Nano就是...

发表于 2018-04-02 15:58 236次阅读
RT-Thread Nano 3.0.3 的基本...

求Labview开发STM32的工具包和licence

发表于 2018-04-01 11:29 187次阅读
求Labview开发STM32的工具包和licence

适配Nano-PCB的 便携式口袋ARM开发板 3D打印数据及机加工数据

发表于 2018-03-30 16:21 353次阅读
适配Nano-PCB的 便携式口袋ARM开发板 3D打印数据及机加工数据

STM32三种BOOT模式介绍

内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了...

发表于 2018-03-30 16:09 473次阅读
STM32三种BOOT模式介绍

STM32_IAP详解(有代码,有上位机)

 和app中分别放置两套中断向量表,当iap代码中将app烧写到flash中之后,跳转到app的中断...

发表于 2018-03-30 15:58 235次阅读
STM32_IAP详解(有代码,有上位机)

STM32内存管理以及STM32中的堆栈

这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两...

发表于 2018-03-29 13:45 437次阅读
STM32内存管理以及STM32中的堆栈

基于stm32的PWM输出呼吸灯(包括stm32...

本文主要介绍了基于stm32的pwm呼吸灯设计与实现。使用定时器来控制I/O口输出PWM波形,从而驱...

发表于 2018-03-28 16:23 455次阅读
基于stm32的PWM输出呼吸灯(包括stm32...

语音识别在中国成身份认证的新方式

中国已使用面部识别技术来防止卫生纸被偷盗和乱穿马路行为。但很多业内表示,语音识别是更好、更便宜的身份...

发表于 2018-03-27 23:52 67次阅读
语音识别在中国成身份认证的新方式

STM32学习—如何选择各个电路部分的主要芯片

最小系统:考虑到小车的主控板可以作为今后做四轴或其他更高级的机器人的基础电路,所以主控选择了STM3...

发表于 2018-03-27 09:59 506次阅读
STM32学习—如何选择各个电路部分的主要芯片

Lumin OS、SDK和开发者端口的解读

在某一时刻,我们现在知道的Windows计算机是由MS-DOS操作系统组成的,Windows是一个在...

发表于 2018-03-26 16:58 540次阅读
Lumin OS、SDK和开发者端口的解读

STM32片内FLASH被异常改写的问题分享

到此问题毫无进展,只好求助ST芯片设计人员做进一步确认,看看芯片是否真的坏了。同时,又请客户的硬件工...

发表于 2018-03-26 11:24 419次阅读
STM32片内FLASH被异常改写的问题分享

深度学习如何在物联网领域大展身手

智能城市服务跨越多个物联网领域,如交通、能源、农业等。智慧城市的一个重要问题是预测群体移动模式,So...

发表于 2018-03-26 11:20 117次阅读
深度学习如何在物联网领域大展身手

人工智能操作系统和自动驾驶:AI就是最核心的目标

随着美国总统特朗普在白宫签署备忘录,将对600亿美元的中国进口商品征收大规模关税,中国商务部同样给出...

发表于 2018-03-25 07:19 749次阅读
人工智能操作系统和自动驾驶:AI就是最核心的目标

STM32的存储器映射详解

存储器映射是指把芯片中或芯片外的FLASH,RAM,外设,BOOT,BLOCK等进行统一编址。

发表于 2018-03-23 15:24 404次阅读
STM32的存储器映射详解

中兴通讯推出AI机顶盒

中兴通讯股份有限公司,推出其首款智能AI机顶盒S100。该机顶盒不仅能为用户打造极致的视听盛宴,还可...

发表于 2018-03-22 15:08 642次阅读
中兴通讯推出AI机顶盒

亚马逊Alexa的深度学习与语音识别的核心技术原...

亚马逊Alexa首席科学家Nikko Strom博士是语音识别领域级别最高的牛人。1997 年从瑞典...

发表于 2018-03-21 15:46 732次阅读
亚马逊Alexa的深度学习与语音识别的核心技术原...

人工智能就在你身边_你发现了吗

这是最好的AI时代。它潜伏在我们周围,为现代生活提供便利。语音识别、刷脸解锁、私人助手、图像美化、推...

发表于 2018-03-21 07:19 65次阅读
人工智能就在你身边_你发现了吗

极限元语音导航引领企业呼叫中心更加智能化

随着社会经济的发展,客户对企业服务也提出了更高的要求,传统的呼叫中心电话导航已经不能满足客户需求,企...

发表于 2018-03-20 17:21 620次阅读
极限元语音导航引领企业呼叫中心更加智能化

IAR在STM32的配置方法

FWLib-用来存放所需固件库的头文件;2).StartUp-用来存放STM32的启动代码,添加co...

发表于 2018-03-20 15:52 413次阅读
IAR在STM32的配置方法

人工智能正在成为新的时代动力_未来100年改变世...

微软首席科学家黄学东(Xuedong Huang)表示,实际上,深度学习(即电脑从数据集学习到执行功...

发表于 2018-03-20 03:24 337次阅读
人工智能正在成为新的时代动力_未来100年改变世...

专家认为有意识的人工智能兴起还需要几十年

人们经常用与人工智能相关的术语来表示真正的人工智能。在讨论人工智能时,新闻报道会将机器学习或深度学习...

发表于 2018-03-20 01:59 101次阅读
专家认为有意识的人工智能兴起还需要几十年

一种改进的前馈序列记忆神经网络结构

最早提出的FSMN的模型结构如图1(a)所示,其本质上是一个前馈全连接神经网络,通过在隐层旁添加一些...

发表于 2018-03-19 16:26 806次阅读
一种改进的前馈序列记忆神经网络结构

这50家投资机构是人工智能领域最活跃的份子

近年来,国家鼓励股权投资助力实体经济发展,创新创业发展新经济,再加之二级市场震荡,高净值客户纷纷涌现...

发表于 2018-03-16 07:18 228次阅读
这50家投资机构是人工智能领域最活跃的份子

智能家居崛起是因为人工智能吗?智能家居的核心是什...

人工智能技术赋予了家用电器更多的功能与活力,人脸识别语音识别等技术的植入,让智能电视有了更多锦上添花...

发表于 2018-03-14 16:25 3116次阅读
智能家居崛起是因为人工智能吗?智能家居的核心是什...

谷歌前工程师开发实时AI语音APP

在2018年移动世界大会上拥有三层展台的数十亿美元技术巨头中,有一对企业家在谈论人工智能方面的突破,...

发表于 2018-03-13 18:30 123次阅读
谷歌前工程师开发实时AI语音APP

(纯干货)使用STM32测量频率和占空比的几种方...

本文详细介绍了使用STM32测量频率和占空比的几种方法。

发表于 2018-03-13 15:43 933次阅读
(纯干货)使用STM32测量频率和占空比的几种方...

用STM32测量频率和占空比的几种方法

在内存复制过程中,面对大数据量的转移时利用DMA。所以,我们使用输入捕获事件触发DMA来搬运寄存器而...

发表于 2018-03-13 10:02 1639次阅读
用STM32测量频率和占空比的几种方法

全新奥迪A6的七大核心技术解析

透过全新奥迪A6技术盘点,我想我应该解答了不少你心中的疑问。没错,它更轻、更运动,也更有科技感,甚至...

发表于 2018-03-11 01:44 396次阅读
全新奥迪A6的七大核心技术解析

stm32使用中出现的警告

发表于 2018-03-09 09:45 91次阅读
stm32使用中出现的警告

分析一个案例:MSP432 MCU语音识别器库

感应应用的物理体积越来越小。无论您是设计出需要在工厂中收集的远程工业传感器节点(图1),抑或是下一个...

发表于 2018-03-08 09:18 1885次阅读
分析一个案例:MSP432 MCU语音识别器库

基于STM32的三轴数字罗盘HMC5883L模块...

最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内。连续测量模式下,最快测...

发表于 2018-03-08 08:40 299次阅读
基于STM32的三轴数字罗盘HMC5883L模块...

一个改变人机交互方式的全新切入点:语音接口

发表于 2018-03-06 18:25 594次阅读
一个改变人机交互方式的全新切入点:语音接口

为什么不看好科大讯飞

从2013年来,资本市场对于科大讯飞未来的发展前景充满了期待,特别是在“中国移动”入股以后,普遍认为...

发表于 2018-03-05 14:16 1065次阅读
为什么不看好科大讯飞

意法半导体的新STM32让物联网设备快速连接云服...

意法半导体的新STM32探索套件简化移动网至云端连接,并提供免费试用的第三方服务,让物联网设备能够通...

发表于 2018-03-02 16:44 390次阅读
意法半导体的新STM32让物联网设备快速连接云服...

语音市场正在迅猛成长 正在改变旅游产业

EyeforTravel最新报告《Can Voice Change the Way We Trave...

发表于 2018-03-01 08:41 95次阅读
语音市场正在迅猛成长 正在改变旅游产业

一文了解人机交互中语音识别技术

语音控制和操作的游戏和玩具、帮助残疾人的语音识别系统、车辆行驶中一些非关键功能的语音控制,如车载交通...

发表于 2018-02-28 08:54 1549次阅读
一文了解人机交互中语音识别技术

一文了解stm32使用DMA模块的相关操作

CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CPU...

发表于 2018-02-27 11:18 3428次阅读
一文了解stm32使用DMA模块的相关操作

关于STM32的 一个TIM1 的PWM程序和P...

高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定...

发表于 2018-02-24 14:39 598次阅读
关于STM32的 一个TIM1 的PWM程序和P...

未来智能家居的“Dreaam House”

而能让整个家庭都实现智能化,每样东西都能与你的各种终端设备紧密相连,这就依靠了英特尔® 物联网技术开...

发表于 2018-02-23 10:54 1176次阅读
未来智能家居的“Dreaam House”

生活中的七个语音识别经典应用

随着物联网的发展,对家庭电器的控制将会有更多的发展,而语音作为一种自然简单的方法将是一种有效便捷的控...

发表于 2018-02-19 05:10 45次阅读
生活中的七个语音识别经典应用

STM32定时器产生PWM彻底应用

这次学习STM32花了很长时间,一个礼拜多,也有颇多收获,学习过程也有颇多曲折。这次的任务是:用ST...

发表于 2018-02-11 11:26 435次阅读
STM32定时器产生PWM彻底应用

STM32基础PWM输出

目的:基础PWM输出,以及中断配合应用。输出选用PB1,配置为TIM3_CH4,是目标板的LED6控...

发表于 2018-02-10 16:47 207次阅读
STM32基础PWM输出

STM32的GPIO输入编程实例之读取按键状态

按键的一端与STM32的GPIO(PH15)相连,另外一端接地,且PH15外接一个1K电流大小的上拉...

发表于 2018-02-10 11:08 1064次阅读
STM32的GPIO输入编程实例之读取按键状态

stm32寄存器版矩阵键盘库函数(附详细注释)

新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合...

发表于 2018-02-09 11:48 219次阅读
stm32寄存器版矩阵键盘库函数(附详细注释)

stm32矩阵键盘原理图及程序介绍

STM32F0 系列产品基于超低功耗的 ARM Cortex-M0 处理器内核,整合增强的技术和功能...

发表于 2018-02-09 11:30 1251次阅读
stm32矩阵键盘原理图及程序介绍

STM32的GPIO输出编程实例之点亮三色LED

本实验通过STM32的三个GPIO口驱动三色LED的三个通道,将GPIO设置为推挽输出模式,采用灌电...

发表于 2018-02-07 11:14 2125次阅读
STM32的GPIO输出编程实例之点亮三色LED

人工智能已在身边并渗透到生产和生活的各个领域,不...

早上,被智能音箱叫醒,同时还提醒你上午要给朋友回电话;去上班,用导航地图走了避免拥堵的路线;路上,拍...

发表于 2018-02-06 10:46 1622次阅读
人工智能已在身边并渗透到生产和生活的各个领域,不...

关于多语言及跨语言的语音识别技术叙述

在大多数传统的自动语音识别(automatic speech recognition,ASR)系统中...

发表于 2018-02-04 10:19 223次阅读
关于多语言及跨语言的语音识别技术叙述

2017年终解读:语音识别技术今年只走了一半的路

这一年的人工智能大潮,无疑让更多人关注科大讯飞,关心在这样的潮流里,一家深耕语音识别的公司如何能获得...

发表于 2018-02-04 10:10 578次阅读
2017年终解读:语音识别技术今年只走了一半的路

解析ARM语音识别系统

语音辨认单元担任辨认操作人员的操作口令;声强检测单元担任检测声强巨细并以此作为判别是哪台从设备操作人...

发表于 2018-02-02 20:30 479次阅读
解析ARM语音识别系统

小米电视4A核心技术之语音识别浅析

大屏电视成流量入口,语音识别成核心竞争力。近年来,大屏智能电视市场销量持续走俏,基于语音识别功能的互...

发表于 2018-02-02 20:27 718次阅读
小米电视4A核心技术之语音识别浅析

互联网电视约架“语音识别” 技术端实测谁更靠谱

2017年还没有过半,互联网品牌电视纷纷召开发布会,推广新品。这一年,他们都围绕了一个共同点去推广—...

发表于 2018-02-02 20:25 234次阅读
互联网电视约架“语音识别” 技术端实测谁更靠谱

智能家居可借语音识别技术打开壁垒

在新一代的消费者看来,除去环保和生活方式等的重点,家居中的“科技感”已经成为新的关注点,在家庭生活中...

发表于 2018-02-01 18:23 192次阅读
智能家居可借语音识别技术打开壁垒

国内智能语音识别产业的增长,可能源于三大技术突破

据行业预测,中国智能语音产业规模将达到101.4亿元。而智能语音产业的快速发展,将带动智能家居、智能...

发表于 2018-02-01 18:19 227次阅读
国内智能语音识别产业的增长,可能源于三大技术突破

从图像理解到语音识别 是如何研究和量化机器学习的

深度学习需要经过多层甚至数百层的处理过程,机器学习也会在不同的GPU,进行跨机器、跨设备处理,这就需...

发表于 2018-02-01 18:09 174次阅读
从图像理解到语音识别 是如何研究和量化机器学习的

串口通信协议stm32

串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用...

发表于 2018-02-01 16:22 348次阅读
串口通信协议stm32

基于AVR的语音识别助老助残室内行走服务系统设计...

全世界60岁以上的老年人口已达到6亿左右,人口老龄化已成为世界范围的重大社会问题。我国60岁及以上老...

发表于 2018-02-01 01:04 207次阅读
基于AVR的语音识别助老助残室内行走服务系统设计...

全球语音识别技术发展有四大问题待解决

语音识别的意思是将人说话的内容和意思转换为计算机可读的输入,例如按键、二进制编码或者字符序列等。与说...

发表于 2018-01-31 19:31 205次阅读
全球语音识别技术发展有四大问题待解决

10种常见的软件体系架构模式分析以及它们的用法、...

架构模式是一个通用的、可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题。架构模式与...

发表于 2018-01-31 12:39 868次阅读
10种常见的软件体系架构模式分析以及它们的用法、...

2018年电子展望浓缩的十大关键词

2018年已经到来,在新的一年里科技圈又将从何处去发展成为各大企业关注的目标,通过市场的调查和企业的...

发表于 2018-01-31 11:28 215次阅读
2018年电子展望浓缩的十大关键词

简要介绍语音识别技术在各领域的应用

语音识别作为信息技术中一种人机接口的关键技术,具有重要的研究意义和广泛的应用价值。介绍了语音识别技术...

发表于 2018-01-31 05:25 603次阅读
简要介绍语音识别技术在各领域的应用

美高森美推出大幅提升语音识别率的AcuEdge开...

语音识别服务需求水涨船高。 随着亚马逊(Amazon)Alexa,以及谷歌(Google)所推出的O...

发表于 2018-01-30 10:18 144次阅读
美高森美推出大幅提升语音识别率的AcuEdge开...

大联大品佳推出基于新唐科技ISD9160+Cyb...

致力于亚太地区市场的领先半导体元器件分销商---大联大控股宣布,其旗下品佳推出基于新唐科技(Nuvo...

发表于 2018-01-30 10:09 336次阅读
大联大品佳推出基于新唐科技ISD9160+Cyb...

基于Cortex-M处理器上实现高精度关键词语音...

我们可以对神经网络架构进行优化,使之适配微控制器的内存和计算限制范围,并且不会影响精度。我们将在本文...

发表于 2018-01-30 10:01 252次阅读
基于Cortex-M处理器上实现高精度关键词语音...

一款基于stm32的毕业设计方案

设计选用STM32单片机作控制器,设计温度单反馈的控制系统,对电加热水器内水的温度进行控制。通过PT...

发表于 2018-01-29 14:22 1244次阅读
一款基于stm32的毕业设计方案

基于stm32的电子秤方案大全(二款stm32的...

 电子秤(英文名:electronic balance)是衡器的一种,是利用胡克定律或力的杠杆平衡原...

发表于 2018-01-29 12:05 867次阅读
基于stm32的电子秤方案大全(二款stm32的...

基于stm32的8m晶振不起振的原因解析

晶振不起振原因分析: (1) PCB板布线错误; (2) 单片机质量有问题; (3...

发表于 2018-01-26 15:41 1874次阅读
基于stm32的8m晶振不起振的原因解析

我们所说的“语音”是什么意思?一文读懂语音识别技...

基于语音的技术将对许多行业产生巨大影响,在短短两年内,预计50%的搜索将基于语音技术。 该项技术的普...

发表于 2018-01-26 11:16 596次阅读
我们所说的“语音”是什么意思?一文读懂语音识别技...

提供多主机功能,STM32的I2C通信简析

在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL 线的时...

发表于 2018-01-26 09:37 3353次阅读
提供多主机功能,STM32的I2C通信简析

基于STM32的高性能低功耗的中文人机界面系统

本文选用了意法半导体公司基于ARM最新Cortex—M3内核的STM32F103RB作为主控芯片,通...

发表于 2018-01-25 22:53 413次阅读
基于STM32的高性能低功耗的中文人机界面系统

每一个GPIO如何配置成一个外部中断触发源

1STM32中断分组STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 ...

发表于 2018-01-25 08:44 2172次阅读
每一个GPIO如何配置成一个外部中断触发源