STM32单片机基本原理与应用(十一)

语音识别实验

此实验采用STM32核心板+ LD3320模块,通过初始化LD3320并写入待识别关键词,对麦克风说出相应关键词,实现实训平台上的流水灯相应变化的效果。
LD3320 是一颗基于非特定人语音识别 (SI-ASR:Speaker-Independent Automatic Speech Recognition)技术的语音识别/声控芯片。提供了真正的单芯片语音识别解决方案。
LD3320 芯片上集成了高精度的 A/D 和 D/A 接口,不再需要外接辅助的Flash 和 RAM,即可以实现语音识别/声控/人机对话功能。并且,识别的关键词语列表是可以动态编辑的。
主要特色功能:
在这里插入图片描述

  • 非特定人语音识别技术:不需要用户进行录音训练。
  • 可动态编辑的识别关键词语列表:只需要把识别的关键词语以字符串的形式传送进芯片,即可以在下次识别中立即生效。
  • 真正单芯片解决方案:不需要任何外接的辅助 Flash 和 RAM,真正降低系统成本。
  • 内置高精度 A/D和D/A通道:不需要外接 AD 芯片,只需要把麦克风接在芯片的AD 引脚上;可以播放声音文件,并提供 550mW 的内置放大器。
  • 高准确度和实用的语音识别效果。
  • 支持用户自由编辑 50 条关键词语条:在同一时刻,最多在 50 条关键词语中进行识别,终端用户可以根据场景需要,随时编辑和更新这 50 条关键词语的内容。

程序代码

1、 LD3320创建语音识别任务,完成关键词的设置。

void   LD3320_Task(void)
{uint8_t   i=0;uint8_t  LD_ASR_Candi_Num,LD_ASR_EXTI_IFO; //从中断代码拿过来的char buf[20];uint8_t   j=1;	//测试读取寄存器	printf("LD3320_Task...\r\n");ETH_CS_H();VS_CS_H();LD_CS_K_H()	; //关掉底板上的LD3320  实训平台对比测试LD_WriteReg(0x29,0) ;   /*关闭中断*/LD_WriteReg(0x02,0) ;   //1 空闲状态;2 识别成功状态;3 识别失败状态。while(1){    switch(process){ case  0:         /*ld3320处于空闲状态*/i++;process=LD_Run();  if(i==4){printf("语音识别模块内部故障,请检查硬件连接 \r\n");return;}break;case  1:          /*ld3320语音准备OK*/if(flag)          /*中断判断*/  //判断识别是否成功{          switch(direct)  /*对结果执行相关操作*/         {case 1:       /*命令“流水灯”*/printf(" 流水灯 指令识别成功\r\n");break;case 2:	      /*命令“闪烁”*/printf(" 闪烁 指令识别成功\r\n"); break;case 3:	      /*命令“按键触发”*/printf(" 开灯/点灯  指令识别成功\r\n"); break;case 4:		    /*命令“全灭”*/printf(" 全灭 指令识别成功\r\n");break;default:     break;} process=flag=0;        }break;case  2:         /*ld3320语音识别失败*/i=0;if(flag)         /*中断判断*/{printf("未识别到有效信息或没有声音\r\n");process=flag=0;            } break;      default:break;  }if((process==1)&&(LD_ReadReg(0xB2)==0x21) && (LD_ReadReg(0xbf)==0x35))	{printf("进入判断 原中断处理 \r\n");	flag=1;     //!!!!!!LD_ASR_Candi_Num = LD_ReadReg(0xba); if(LD_ASR_Candi_Num>0 && LD_ASR_Candi_Num<=4) { direct = LD_ReadReg(0xc5);					process=1;    //识别成功    printf("接收到的语音信息 %d \r\n",direct );  }elseprocess=2;  //识别失败/*完成一次语音识别后重新配置寄存器*/LD_WriteReg(0x2b,0);LD_WriteReg(0x1C,0);//写0:ADC不可用LD_WriteReg(0x29,0);LD_WriteReg(0x02,0);LD_WriteReg(0x2B,0);LD_WriteReg(0xBA,0);	LD_WriteReg(0xBC,0);	LD_WriteReg(0x08,1);//清除FIFO_DATALD_WriteReg(0x08,0);//清除FIFO_DATA后 再次写0   	}LD_Test();}
}

音乐播放器实验

单片机首先挂载FATS文件系统,接着在加载指定路径下的音频文件,最终通过VS1053解码并输出音频。VS1053采用SPI协议传输音频数据。但其还有两种不同的工作模式一种是串行数据接口的串行协议(SDI),一种是串行命令接口的串行协议(SCI)。所以片选有两个XCS and XDCS。
SCI 串行总线命令接口包含了一个指字节、一个地址字节和一个 16 位的数据字。读写操作可以读写单个寄存器,在 SCK 的上升沿读出数据位,所以主机必须在下降沿刷新数据SCI 的字节数据总是高位在前低位在后的。第一个字节指令字节, 只有 2 个指令,也就是读和写,读为0X03,写为 0X02。
在这里插入图片描述

对于SCI的读时序,是向 VS1053 读取数据,通过先拉低 XCS,然后发送读指令(0X03),再发送一个地址,最后,我们在 SO 线(VS_MISO)上就可以读到输出的数据了。而同时SI(VS_MOSI)上的数据将被忽略。
在这里插入图片描述
对于SCI的写时序,与读时序一样都是先发指令,再发地址。不过写时序中,我们的指令是写指令(0X02),并且数据是通过 SI 写入 VS1053的, SO 则一直维持低电平。在这两个图中,DREQ 信号上都产生了一个短暂的低脉冲,也就是执行时间。我们在写入和读出 VS1053 的数据之后,它需要一些时间来处理内部的事情,这段时间,是不允许外部打断的,所以,我们在 SCI 操作之前,最好判断一下DREQ 是否为高电平,如果不是,则等待 DREQ 变为高。

程序代码

这里我们仅对主函数进行展示:

int main(void){	 delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);	 	//串口初始化为115200LED_Init();		  			//初始化与LED连接的硬件接口
//	 KEY_Init();					//初始化按键LCD_Init();			   		//初始化LCD     
//	W25QXX_Init();				//初始化W25Q128VS_Init();	  				//初始化VS1053 my_mem_init(SRAMIN);		//初始化内部内存池exfuns_init();				//为fatfs相关变量申请内存  
// 	f_mount(fs[0],"0:",1); 		//挂载SD卡 
// 	f_mount(fs[1],"1:",1); 		//挂载FLASH.POINT_COLOR=RED;       
// 	while(font_init()) 				//检查字库
//	{	    
//		LCD_ShowString(30,50,200,16,16,"Font Error!");
//		delay_ms(200);				  
//		LCD_Fill(30,50,240,66,WHITE);//清除显示	     
//	}while(SD_Init())			//检测SD卡{LCD_ShowString(30,70,200,16,16,"SD Card Failed!");delay_ms(200);LCD_Fill(30,70,200+30,70+16,WHITE);delay_ms(200);		    }								 						    LCD_ShowString(30,70,200,16,16,"SD Card OK");Show_Str(30,50,200,16,"战舰 STM32实训平台",16,0);				    	 Show_Str(30,70,200,16,"音乐播放器实验",16,0);				    	 Show_Str(30,90,200,16,"正点原子@ALIENTEK",16,0);				    	 Show_Str(30,110,200,16,"2015年1月20日",16,0);Show_Str(30,130,200,16,"KEY0:NEXT   KEY2:PREV",16,0);Show_Str(30,150,200,16,"KEY_UP:VOL+ KEY1:VOL-",16,0);while(1){LED1=0; 	  Show_Str(30,170,200,16,"存储器测试...",16,0);printf("Ram Test:0X%04X\r\n",VS_Ram_Test());//打印RAM测试结果	    Show_Str(30,170,200,16,"正弦波测试...",16,0); 	 	 VS_Sine_Test();	 Show_Str(30,170,200,16,"<<音乐播放器>>",16,0); 		 LED1=1;mp3_play();} 	   										    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI训练数据处理和读取

AI训练数据处理和读取 AI数据处理 AI数据处理概述 AI数据处理是指对原始数据进行一系列的操作&#xff0c;以便机器学习算法能够从中提取有用的信息&#xff0c;进而进行模型的训练、验证和部署。数据处理是机器学习流程中的关键步骤&#xff0c;其质量直接影响到模型的性能…

手把手一起开发SV4E-I3C设备(四)

JEDEC DDR5 SPD Hub Devices例程 所有例程&#xff0c;SV4E-I3C设备连接器件均为SPD5芯片&#xff0c;Reg表示MR寄存器&#xff0c;Mem表示NVM存储器 1、ENEC CCC ENEC 启用事件中断&#xff0c;ENEC CCC 仅在设备置于 I3C 基本模式后才受支持。当 SPD5 注册 ENEC CCC 时&am…

【CSS面试题】高度塌陷问题及解决

什么情况下产生 (when 父盒子没有定义高度&#xff0c;但是子元素有高度&#xff0c;希望用子盒子撑起父盒子的高度&#xff0c;但是子盒子添加了浮动属性之后&#xff0c;父盒子高度为0 <template><div class"father"><div class"son"&…

算法第二十六天-删除有序数组中的重复项Ⅱ

删除有序数组中的重复项 题目要求 解题思路 题目要求中提到原地修改&#xff0c;那么肯定需要一个指针指向当前即将放置元素的位置&#xff0c;需要另外一个指针向后遍历所有元素&#xff0c;所以[双指针]解法呼之欲出。 慢指针slow&#xff1a;指向当前元素放置的位置&…

F - Earn to Advance

解题思路 由于对于一点不知道后面得花费&#xff0c;所以无法决策当前是否要停下赚钱或要停下多久考虑一点&#xff0c;可以由其左上方的所有点到达所以从往前推&#xff0c;得出到的总花费然后考虑从之后不赚钱直接到最终所用次数和剩余钱若存在&#xff0c;在后面点赚钱更优…

Python错题集-8:AttributeError(找不到对应的对象的属性)

1问题描述 AttributeError: AxesSubplot object has no attribute arc 2代码详情 import matplotlib.pyplot as plt# 创建一个新的图形和坐标轴 fig, ax plt.subplots()# 定义弧线的参数 center (0.5, 0.5) # 圆心坐标 (x, y) width 1.0 # 半径 height 0.5 # 半径 ang…

沁恒CH32V307VCT6开发板记录---kalrry

沁恒CH32V307VCT6开发板记录---kalrry 一、官网申请开发板二、环境准备图一 一、官网申请开发板 1.沁恒官网 二、环境准备 1.数据手册&#xff1a;CH32V307DS0.PDF&#xff0c;CH32FV2x_V3xRM.PDF 2.CH32V307评估板说明及参考应用例程&#xff1a;CH32V307EVT_ZIP 3.集成开…

腾讯云拼了99元服务器老用户能买,续费不涨价!

良心腾讯云推出99元一年服务器&#xff0c;新用户和老用户均可以购买&#xff0c;续费不涨价&#xff0c;续费也是99元&#xff0c;配置为轻量2核2G4M、50GB SSD盘、300GB月流量、4M带宽&#xff1a;优惠价格99元一年&#xff0c;续费99元&#xff0c;官方活动页面 txybk.com/g…

C++类和对象(中篇)

目录 1. 类的6个默认成员函数 2. 构造函数 3.析构函数 4.拷贝构造函数 5.赋值运算符重载 6.const成员 7.取地址及const取地址操作符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#…

OpenMP

介绍 OpenMP 是一个应用程序接口 &#xff08;API&#xff09;&#xff0c;由一组主要的计算机硬件和软件供应商共同定义。OpenMP 为共享内存并行应用程序的开发人员提供了一个可移植、可扩展的模型。该 API 支持各种架构上的 C/C 和 Fortran。 OpenMP是&#xff1a; 一个可…

python学习笔记------字典

字典的定义 字典的定义&#xff0c;同样是使用{}&#xff0c;不过存储的元素是一个个的键值对 基本语法&#xff1a; #定义字典字面量 {key:value,key:value,key:value,......key:value} #定义字典变量 my_dict{key:value,key:value,key:value,......key:value} #定义空…

elasticsearch篇:RestClient操作

1. RestClient ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。官方文档地址&#xff1a;Elasticsearch Clients | Elastic 其中的Java Rest Client又包括两种&#xff1a; Java Low Level Res…

windows10+cpu+pycharm跑yolov5

1、安装anaconda和pycharm&#xff0c;安装方法参考&#xff1a; anaconda和pycharm安装&#xff08;windows10 &#xff09;-CSDN博客 2、创建yolov5环境&#xff0c;打开Anaconda Prompt命令打开cmd命令行窗口&#xff0c;如下所示&#xff1a; 输入&#xff1a;conda crea…

【大模型】Hugging Face下载大模型的相关文件说明

Hugging Face下载大模型文件说明 1.前言 ​ 上图是毛毛张在HuggingFace的官网上的ChatGLM-6B大模型的所有文件,对于初学者来说,对于上面的文件是干什么的很多小伙伴是很迷糊的,根本不知道是干什么的,毛毛张接下来将简单讲述一下上面的每个文件的作用。 2.文件说明 在Hug…

FL Studio21最新官方完整免费版水果音乐制作软件下载

作为音乐制作软件专家&#xff0c;对于FL Studio21这款功能强大的音乐制作软件有着深入的了解&#xff0c;它为用户提供了从创作到后期制作的完整工作流程。以下是对其各项功能的全面、准确且详细的介绍&#xff1a; FL Studio 21 Win-安装包下载如下: https://wm.makeding.c…

vue项目部署服务器,因为跨域设置nginx.config要修改的配置

下面是我在vue项目中vite.config.js设置的配置代理 对于部署项目需要使用nginx进行vue项目的话&#xff0c;需要对nginx的配置文件进行如下修改即可

linux操作系统虚拟机的环境配置

目录 一、虚拟机安装&#xff08;类似硬件的安装&#xff09; &#xff08;1&#xff09;创建虚拟机 &#xff08;2&#xff09;创建虚拟机 二、IP和主机名称配置 1、设置VM上的IP 2、设置我们电脑上VMnet8的IP 3、设置虚拟机上的IP 主机名称映射 以下是设置主机名映射…

linux系统adb调试工具

adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序&#xff0c;说白了就是调试工具。 adb的工作方式比较特殊&#xff0c;采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯&#xff0c;默认情况下adb会…

实时工业控制系统的创新整合:PLC4X与CnosDB的高效数据采集与存储

在当代工业自动化系统中&#xff0c;实时监测和数据分析变得至关重要。本文将介绍如何通过集成Apache PLC4X与CnosDB&#xff0c;实现对工业控制系统中的PLC设备进行高效数据采集和存储&#xff0c;为工程师们提供更强大的数据分析和监测工具。 PLC的定义 PLC是可编程逻辑控制…

哈希表|242.有效的字母异位词

力扣题目链接 bool isAnagram(char* s, char* t) {int len_s strlen(s), len_t strlen(t);if(len_s ! len_t) {return false;}int table[26];memset(table, 0, sizeof(table));for(int i 0; i < len_s; i) {table[s[i] - a];}for(int i 0; i < len_t; i) {table[t[i…