您的位置:首页 >iEAS系统 >

我叫mtmp3(脉歌MT-70上手体验:重新定义耳机,让声音更动听)

导读 我叫mtmp3文章列表:1、脉歌MT-70上手体验:重新定义耳机,让声音更动听2、老兵精讲:基于MM32实现音频播放系统的应用实例3、可能是当前最小的安卓智能手机?天语I9上手体验

我叫mtmp3文章列表:

我叫mtmp3(脉歌MT-70上手体验:重新定义耳机,让声音更动听)

脉歌MT-70上手体验:重新定义耳机,让声音更动听

耳机,是近年来非常具有热度的一个领域,在近一段时间内,毫无疑问占据了市场配件榜的热度,生活方式的改变,也让两点一线的枯燥生活开始增添了一些乐趣,作为一个听音乐的极度爱好者者,选择一款舒适性价比高的耳机,成为了众多购买者的选择的最大难题,而随着科技的进步,手机耳机口的取消,也将无线耳机推向了一个新的需求热度,从传统耳机的到无线耳机的递进,耳机让声音变得更加美妙,它的功能也从单一的试听感受转化为生活交互体验,但随之而来的外观设计,佩戴的舒适度以及音质续航等问题,也成了消费者购买耳机的困扰,那么怎么选择一款性价比高的真无线耳机呢?现在让笔者来带来开箱一下,脉歌MT-70真无线耳机能否达到我们的要求。

开箱

从包装上来看,脉歌MT-70依旧走的是简约时尚的路线,包装盒的正面印有MT-70的产品外观以及产品特性,打开耳机包装盒,里面是一个印有“MacaW”标准的耳机充电仓,其中还包括产品说明书/质保卡、充电线在内的几种配件。

第一眼对于这款耳机的初印象,耳机盒子十分简约,表面上带有螺旋状的线圈条纹,盒子的边缘相对圆润且富有金属光泽,正面则印有脉歌的logo,材质虽然为塑料,但在手上的感觉就像金属般细腻,顶盖采用的是磨砂质感,盒子的坚硬和耐磨性都十分良好,相比之下塑料材质也为盒子的重量带来了不少的减负。

充电仓采用了磁吸式的开合方式,磁吸的开合力度适中,但这也保证了充电盒本身的收纳能力,耳机放入电池仓中后,触点即可对准并且开始进行充电。

充电收纳仓采用可以正反插的USB Type-C接口,这一点是值得表扬的,对于外出旅行的人来说,统一的充电接口能够为用户减少携带多种充电线的麻烦,充电的指示采用的是指示灯的方式,依旧指示灯即可分辨。耳机电仓电量为300mAh,但是可为耳机充电3次,自身充满仅需1小时,单次播放长达20小时 。

外观设计上,脉歌MT-70是标准的入耳式设计,采用的是相对流行的斜入式设计,相比之下能够更贴合人耳耳道结构,耳机的主体部分采用的是枪色配色,在灯光的反射下能呈现出光圈感,十分时尚简约。与其他耳机不同的是脉歌MT-70在耳机主体上并没有实体按键的存在,而是采用了一种智能触控的方式,可以在不用拿出手机的同时,即可触控耳机实现切换、暂停、接听等操作。

耳机背面带有符合人体工学的弧度设计,这一侧还带有LR标示以及用于充电的磁吸触点。可拆卸更换的耳塞设计,方便各类人群使用。脉歌Macaw MT-70真无线耳机的正面带有清晰的品牌标示,整体设计采用了流畅的曲线搭配,整体具有IPX5级防水,多重工序,防水防汗抗腐蚀,日常使用具有很不错的耐久度。

这一次它所使用的蓝牙5.0技术也是一大亮点,采用了成熟的RTL8763BFP蓝牙5.0芯片方案,相比于其他真无线耳机的蓝牙4.2,不仅功耗更低,而且还拥有更快的传输速率、更稳定的连接。最明显的就是在通话过程中,几乎没有任何延迟,配合上它的智能降噪算法,整体的通话效果在同价位中应该算是上游水准。

在佩戴方面,脉歌MT-70的重量也是比较适中的,在跑步、健身等运动场景下也不会因为个人的动作过大晃动而导致掉落,长时间佩戴下,耳朵轮廓部位也是比较舒适的。

在实际的使用试听下,我们再来说说下听感,低频质量非常高,生物纤维振膜的刚性带来了非常深的下潜,动态充沛,有明显的气流冲击感。鼓点的结像比较凝聚,属于弹性好而厚度低的取向,节奏感强而氛围感弱,相对的中频表现也十分棒!高频部分不算优秀,中规中矩保持了适度的解析力,足够应付日常听流行的需求。

得益于耳机上带有的高品质麦克风设计,通过耳机所具有的智能降噪效果,在室外或者是嘈杂的地铁里,降噪的效果还是非常明显能够感受得出的,环境的嘈杂声基本都能够被排除在外部,在通话过程中能够获得清晰的通话质量。

最后来说一下,作为一款高质量的耳机,当然是有惊喜在它的身上,靓丽外观,高质感。6mm尺寸的石墨烯复合振膜,耳机支持AAC与SBC高品质音频传输协议,阻抗16欧可以说轻松易推动,具备20-20kHz频响范围,同时拥有高解析力,强劲低频,自然而宽阔的声场、高杂食度,易推性、 三频均衡等特点。适合流行、乐器、人声。手机便可驱动,并适用于 不同类型的音乐和曲风。

总结

对于这样一款小巧且具备智能降噪的真无线耳机,在使用了一段时间之后,脉歌Macaw MT-70真无线耳机无论是产品设计还是功能设计上都算是一款合格的真无线耳机,并且充电仓能够提供20小时的续航能力,也足够一周的使用时间,同时还搭配了RTL8763BFP蓝牙5.0芯片 6mm尺寸的石墨烯复合振膜,让耳机具备了很好连接稳定性同时在试听上也具备更大的动态范围,让这款产品的优点更加突出,对于正在选择购买耳机的用户来说,还是很值得入手的一款设备。

老兵精讲:基于MM32实现音频播放系统的应用实例

文章下方附学习资源,自助领取

一、基本介绍

I2S总线又称为Inter-IC Sound总线,它是集成在芯片内的音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门应用于音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟和数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真问题。

MM32F3270系列MCU最多支持3个I2S接口,同一时刻只能工作在发送或者接收接收状态,支持16位、24位和32位三种数据格式、数据传输始终是MSB优先、每个I2S接口都支持DMA传输方式。

此外,MM32F3270系列MCU的I2S还支持4种I2S协议标准,分别是飞利浦标准、MSB对齐标准、LSB对齐标准、以及PCM标准,我们可以根据MM32F3270系列MCU连接的I2S外设所支持的协议标准进行灵活配置和选择。

二、实现功能

基于MM32-EVBoard(MB-039)开发板,实现音频播放系统。通过DMA的方式,将存储在TF卡中的音频文件(WAV格式/MP3格式)通过I2S总线,将音频数据发送给CS4344音频数模转换芯片,通过与其连接的音响设备播放出音乐;通过板载的4个按键来实现对音频文件的开始播放、停止播放、音频文件选择等操作,并在TFT液晶显示屏上显示系统运行信息、音频文件目录,以及当前的播放状态等内容。

根据如上功能要求,需要实现的技术点如下:

1、GPIO口控制LED闪烁和KEY按键检测;LED控制引脚与I2S引脚复用,所以在播放音乐的时候,LED是表象上不闪烁的;KEY在识**需要结合音频的当前状态做处理。

2、TFT LCD用于运行显示,通过FSMC接口与MCU进行连接,通过8080总线方式进行显示控制和内容显示;显示的字符包含ASCII码和汉字,其中ASCII码字库存放在MCU的FLASH程序空间,中文GBK编码字库存放在SPI FLASH中。

3、SPI FLASH用于存放中文GBK编码字库,通过板载的UART8接口,结合Xmodem串行文件传输协议,从电脑端把GBK_FONG.BIN文件传输并写入到板载的SPI FLASH芯片中;再通过回读取的方式,将SPI FLASH存储的字库数据通过Xmodem上传到电脑端,比较下载文件与读取到的文件是否相一致,确认字库的正确性。

4、通过MCU的SDIO接口来操作TF卡,移植FatFs文件系统对音频文件进行识别,对音频文件数据进行读取操作。

5、通过MCU的I2C接口来与CS4344音频数模转换芯片进行数据传输,实现播放音频文件,采用DMA传输方式,开启DMA传输完成中断和半传输完成中断,通过乒乓操作实现音频文件播放的流畅效果。

6、另外最重要的就是音频文件的识别和解码;对于WAV文件来说,它是未经编码/压缩的音频数据文件,在固定的文件头信息后面是音频数据,只需要在音频文件解析后将获取到的音频数据直接发送到I2S总线即可实现播放;而对于MP3文件来说,它是经过编码/压缩的音频数据文件,在没有外部解码芯片支持的时候,需要用软件解码的方式来实现音频数据的提取操作,本文中将会介绍Helix和libmad这两种开源的,且非常常用的软件解码方式。

三、软件环境

Windows操作系统下开发,使用的IDE和相应的软件如下:

1、Keil MDK开发软件;

2、MobaXterm终端软件,用于监控程序运行及代码中SHELL功能的操作;

3、SecureCRT终端软件,通过Xmodem传输协议结合MCU功能代码实现,用于将GBK汉字字库编码数据下载到板载的SPI FLASH芯片中;

4、Beyond Compare比较软件,用于比较GBK汉字字编码下载和上传数据的一致性;

5、酷狗音乐,下载音频文件。

四、硬件环境

1、MM32-EVBoard(MB-039)开发板;

2、8GB容量的TF卡及读卡器,通过读卡器连接电脑,将音频文件存放在TF卡中;

3、音箱设备;

4、Micro USB数据线、音频接口连接线;

5、USB转TTL调试工具。

五、WAV音频文件

WAV文件WAVEform的简写,也称为波形文件,是一种可以存储声音波形的数字音频格式。WAV支持多种音频数字、采样频率和声道,标准格式化的WAV文件和CD的格式一样,也是44.1kHz的采样频率、16位量化数据,具有真实记录声音波形的特点,基本无数据压缩,所以数据体量也变得相对大些。

WAV文件的编码包括两方面的内容,一个是按一定格式存储数据,另外一个就是采用一定的算法压缩数据。WAV格式对音频流的编码没有硬性规定,支持非压缩算法的PCM(Plus Code Modulation)脉冲编码调制格式,也支持其它一些压缩算法。

典型的WAV文件格式,如下图所示:

1、WAV文件结构

在Windows环境下,大部分多媒体文件都是按照资源互换文件格式(Resources Interchange File Format)存放信息的,简称RIFF格式。构成RIFF文件的基本单位称之为块(Chunk),每个RIFF文件都是由若干个块组成的,而每个块都是由块标识、块长度以及数据这三部分组成的。块标识是由4个ASCII码字符组成的,如果不满4个字符则在右边以空格来补齐;块长度也占4个字节存储空间,保存的是当前块数据的长度,但不包含块标识和块长度字段;所以一个块的实际长度就是块长度字段的数值再加上8字节。

RIFF格式规定,只有RIFF块和LIST块可以包含子块,其它的块都不允许包含子块;而一个RIFF格式文档本身就是一个块。分析一个RIFF文档的组成部分,第一部分的4个字节为文档的标识符“RIFF”,同时也是RIFF的块标识,指示该文档是一个有效的RIFF格式文档;第二部分的4个字节为块长度,指示文件的数据长度,其数据为文件总长度减8字节;第三部分为块数据,其中,前4个字节为文件格式类型标识,如Wave、AVI等;面后面其它部分就是RIFF块的子块了。

WAV文件采用的是RIFF格式结构,其至少由RIFF块、fmt块和data块组成,若是基于压缩编码的WAV文件还必须包含fact块;其中fmt块、data块和fact块都是RIFF块的子块。WAV文件的文件格式类型标识符为“WAVE”,其基本结构如下所示:

2、WAV文件头格式

3、WAV文件格式实例解析

4、扩展子块格式

5、fact块格式

6、WAV文件格式实例解析

5249 4646这个是ASCII字符”RIFF”,这部分是固定格式,表明了这是一个有效的RIFF格式文件;

AC96 5E03这个是WAV文件的数据大小,对应0x035E96AC,十进制值为56530604;这个值再加上8个字节就是WAV文件总长度了,如下图所示:

5741 5645这个是ASCII字符”WAVE”

666D 7420这个是ASCII字符”fmt ”,即fmt块的块标识

1000 0000这个是fmt格式块长度,16字节

0100这个是编码格式,0x0001对应PCM/非压缩格式

0200这个是声道个数,0x0002表示两声道或者立体声道

44AC 0000这个是采样频率,对应16进制数为0x0000AC44,对应十进制为44100

其它的字段数据可以对照上述表格一一列举出来,但需要注意的是数据的大小端不同的存储方式哈!!!

7、WAV文件格式在代码中的结构体定义

WAV.h /* 由于字数限制,请参考源代码 */

8、WAV文件格式在MM32中的结构解析

static uint8_t WAV_DecodeFile(WAV_TypeDef *pWav, char *Path, char *Name) /* 由于字数限制,请参考源代码 */

9、WAV文件格式在MM32中的播放实现

void WAV_PlaySong(char *Path, char *Name){ WAV_TypeDef WaveFile; char FilePath[100]; /* 获取WAV文件的信息 */ if(WAV_DecodeFile(&WaveFile, Path, Name) == 0) { if((WaveFile.BitsPerSample == 16) && (WaveFile.nChannels == 2) && (WaveFile.SampleRate > 44000) && (WaveFile.SampleRate < 48100)) { I2S_InitGPIO(); I2S_PowerON(1); I2S_Configure(I2S_Standard_Phillips, I2S_DataFormat_16b, I2S_AudioFreq_44k, I2S_Mode_MasterTx); } else { printf("rnWAV File Error!rn"); return; } } else { printf("rnNot WAV File!rn"); return; } memset( FilePath, 0x00, sizeof(FilePath)); sprintf(FilePath, "%s%s", Path, Name); WAV_RES = f_open(&WAV_File, FilePath, FA_READ); if(WAV_RES == FR_OK) { WAV_NextIndex = 0; WAV_PlayEnded = 0; WAV_PlaybackProgress = 0; WAV_PrepareData(); WAV_PlayHandler(); } else { printf("rnWAV File Open Error : %d", WAV_RES); }}

六、MP3音频文件

MP3格式音乐文件普遍存在我们生活中,实际上MP3本身是一种音频编码方式,全称为 Moving Picture Experts Group Audio Layer III(MPEG Audio Layer 3)。MPEG音频文件是MPEG标准中的声音部分,根据压缩质量和编码复杂程度划分为三层,即 Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件。其中,MP3压缩率可达到10:1至12:1,可以大大减少文件占用存储空间大小。

MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高。MP3是利用人耳对高频声音信号不敏感的特性,将时域波形信号转换成频域信号,并划分成多个频段,对不同的频段使用不同的压缩率,对高频加大压缩比(甚至忽略信号)对低频信号使用小压缩比,保证信号不失真。这样一来,就相当于抛弃人耳基本听不到的高频声音,只保留能听到的低频部分,这样可得到很高的压缩率。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:嵌入式物联网学习资料(头条)

1、MP3文件结构

MP3文件大致分为3个部分:TAG_V2(ID3V2)、音频数据、TAG_V1(ID3V1)。ID3是MP3文件中附加关于该MP3文件的歌手、标题、专辑名称、年代、风格等等信息,有两个版本ID3V1和ID3V2。ID3V1固定存放在MP3文件末尾,固定长度为128字节,以TAG三个字符开头,后面跟上歌曲信息。因为ID3V1可存储信息量有限,有些MP3文件添加了ID3V2,ID3V2是可选的,如果存在ID3V2那它必然存在在MP3文件起始位置,它实际是ID3V1的补充。

2、MP3数据帧

经过压缩后的MP3文件数据是由多个帧组成的,帧是MP3文件的最小组成单位。每个帧又由帧头 、附加信息和声音数据组成,每个帧的长度会随着位率的不同而变化,有些MP3文件末尾还有些额外的字节数据存放非声音数据的说明信息等。每个帧包含一段音频的压缩数据,通过解码库解码即可得到对应PCM音频数据,就可以通过I2S发送到CS4344芯片播放音乐,按顺序解码所有帧就可以得到整个MP3文件的音轨。

3、MP3解码库

MP3文件是经过压缩算法压缩而存在的,为得到PCM信号,需要对MP3文件进行解码,解码 过程大致为:比特流分析、霍夫曼编码、逆量化处理、立体声处理、频谱重排列、抗锯齿处理、 IMDCT 变换、子带合成、PCM输出。整个过程涉及很多算法计算,要自己编程实现不是一件现 实的事情,还好有很多公司经过长期努力实现了解码库编程。具体的MP3文件格式内容解析可以参考附件中的《MP3文件格式解析》一文,文本不需要对MP3数据帧的细节做深入的研究,我只需要掌握如何使用当前比较常用的开源软件来播放MP3音频文件即可。

现在合适在小型嵌入式控制器移植运行的有两个版本的开源MP3解码库,分别为libmad解码库和Helix解码库。

其中,libmad是一个开源的高精度MPEG音频解码库,是专门面向嵌入式应用的MP3解码程序,可以简单地实现MP3数据解码工作,支持MPEG-1、MPEG-2,以及MPEG-2.5标准,它可以提供24位PCM输出,用定点运算模拟浮点运算,因此不需要处理器有浮点运算功能,非常适合没有浮点支持的平台上使用;libmad对MP3解码中关键部分采用了优化的算法,这些优化算法能够大幅度地减少计算量,而且大多应用于MP3解码的VLSI实现中。libmad的源代码文件目录下的mad.h文件中,可以看到绝大部分该库的数据结构和API等,软件库结构清晰,易于使用和开发。

而Helix解码库则支持浮点和定点这两种的计算实现,它同样支持MPEG-1、MPEG-2以及MPEG-2.5标准的Layer3解码,此外Helix解码库还支持可变位速率、恒定位速率,以及立体声和单声道音频格式。这两个解码库都是以一帧为解码单位的,一次解码一帧。

各有优点,至于哪个更好,我还没有深入研究,但从使用下来最明显的体验来说,就是libmad库对堆栈空间大小的要求肯定是比Helix要大得多的,所以如果为了节省些RAM空间,可以优先考虑选择Helix库。

4、Helix MP3解码库在MM32中的播放实现

void MP3_Helix_PlaySong(char *Path, char *Name){ char FilePath[100]; memset( FilePath, 0x00, sizeof(FilePath)); sprintf(FilePath, "%s%s", Path, Name); if(f_open(&MP3_Helix_File, FilePath, FA_READ) == FR_OK) { hMP3Decoder = MP3InitDecoder(); /* 初始化MP3解码器 */ if(hMP3Decoder == 0) { f_close(&MP3_Helix_File); return; } MP3_Helix_RES = f_read(&MP3_Helix_File, MP3_Helix_iBuffer, MP3_HELIX_I_BUFFER_SIZE, &MP3_Helix_BR); if((MP3_Helix_RES == FR_OK) && (MP3_Helix_BR != 0)) { printf("rnMP3 Playrn"); I2S_InitGPIO(); I2S_PowerON(1); MP3_Helix_InPointer = MP3_Helix_iBuffer; /* 数据读取缓存指针 */ MP3_Helix_BytesLeft = MP3_Helix_BR; MP3_Helix_PlayEnded = 0; MP3_Helix_SampleRate = 0; I2S_DMA_Finish = 1; while(!MP3_Helix_PlayEnded) { MP3_Helix_PrepareData(); EVENT_Scanning(); MP3_Helix_PlayHandler(); TASK_Scheduling(); } } } else { printf("rnMP3 File Open Fail!rn"); }}

5、libmad MP3解码库在MM32中的播放实现

void MP3_libmad_PlaySong(char *Path, char *Name){ char FilePath[100]; int TagSize = 0; uint32_t FrameCount = 0; /* First the structures used by libmad must be initialized. */ mad_stream_init(&MP3_libmad_Stream); mad_frame_init( &MP3_libmad_Frame ); mad_synth_init( &MP3_libmad_Synth ); mad_timer_reset(&MP3_libmad_Timer ); memset( FilePath, 0x00, sizeof(FilePath)); sprintf(FilePath, "%s%s", Path, Name); if(f_open(&MP3_libmad_File, FilePath, FA_READ) == FR_OK) { I2S_InitGPIO(); I2S_PowerON(1); MP3_libmad_PlayEnded = 0; I2S_DMA_Finish = 1; MP3_libmad_RES = f_read(&MP3_libmad_File, MP3_libmad_iBuffer, MP3_LIBMAD_I_BUFFER_SIZE, &MP3_libmad_BR); if(strncmp("ID3", (char *)MP3_libmad_iBuffer, 3) == 0) { /*计算标签信息总大小 不包括标签头的10个字节*/ TagSize = ((unsigned int)MP3_libmad_iBuffer[6] << 21) | ((unsigned int)MP3_libmad_iBuffer[7] << 14) | ((unsigned int)MP3_libmad_iBuffer[8] << 7) | ((unsigned int)MP3_libmad_iBuffer[9] << 0); TagSize = 10; printf("rnMP3 TAG Size : %drn", TagSize); } f_lseek(&MP3_libmad_File, TagSize); /* 跳过TAG信息 */ while(1) { if((MP3_libmad_Stream.buffer == NULL) || (MP3_libmad_Stream.error == MAD_ERROR_BUFLEN)) { size_t ReadSize, Remaining; unsigned char *ReadStart = NULL; if(MP3_libmad_Stream.next_frame != NULL) { Remaining = MP3_libmad_Stream.bufend - MP3_libmad_Stream.next_frame; memmove(MP3_libmad_iBuffer, MP3_libmad_Stream.next_frame, Remaining); ReadStart = MP3_libmad_iBuffer Remaining; ReadSize = MP3_LIBMAD_I_BUFFER_SIZE - Remaining; } else { ReadSize = MP3_LIBMAD_I_BUFFER_SIZE, ReadStart = MP3_libmad_iBuffer, Remaining = 0; } MP3_libmad_RES = f_read(&MP3_libmad_File, (char *)ReadStart, ReadSize, &MP3_libmad_BR); if((MP3_libmad_BR <= 0) || (MP3_libmad_BR < ReadSize)) { printf("rnEnd Of Filern"); break; } mad_stream_buffer(&MP3_libmad_Stream, MP3_libmad_iBuffer, MP3_libmad_BR Remaining); MP3_libmad_Stream.error = MAD_ERROR_NONE; } if(mad_frame_decode(&MP3_libmad_Frame, &MP3_libmad_Stream)) { if(MAD_RECOVERABLE(MP3_libmad_Stream.error)) { if((MP3_libmad_Stream.error != MAD_ERROR_LOSTSYNC) || (MP3_libmad_Stream.this_frame != NULL)) { printf("rnRecoverable Frame Level Error (%s)rn", MP3_libmad_MadErrorString(&MP3_libmad_Stream)); } continue; } else { if(MP3_libmad_Stream.error == MAD_ERROR_BUFLEN) { continue; } else { printf("rnUnrecoverable Frame Level Error (%s)rn", MP3_libmad_MadErrorString(&MP3_libmad_Stream)); break; } } } if(FrameCount == 0) { MP3_libmad_PrintFrameInfo(&MP3_libmad_Frame.header); } FrameCount ; mad_timer_add(&MP3_libmad_Timer, MP3_libmad_Frame.header.duration); mad_synth_frame(&MP3_libmad_Synth, &MP3_libmad_Frame); for(uint32_t i = 0; i < MP3_libmad_Synth.pcm.length; i ) { short Sample = MP3_libmad_MadFixedToSshort(MP3_libmad_Synth.pcm.samples[0][i]); MP3_libmad_oBuffer[MP3_libmad_NextIndex][MP3_libmad_BufferSize ] = Sample; if(MAD_NCHANNELS(&MP3_libmad_Frame.header) == 2) { Sample = MP3_libmad_MadFixedToSshort(MP3_libmad_Synth.pcm.samples[1][i]); } MP3_libmad_oBuffer[MP3_libmad_NextIndex][MP3_libmad_BufferSize ] = Sample; MP3_libmad_PlayHandler(MP3_libmad_Synth.pcm.samplerate); } if(MP3_libmad_PlayEnded == 1) { break; } } DMA_Cmd(DMA2_Channel2, DISABLE); f_close(&MP3_libmad_File); I2S_PowerON(0); } mad_synth_finish( &MP3_libmad_Synth ); mad_frame_finish( &MP3_libmad_Frame ); mad_stream_finish(&MP3_libmad_Stream); char Buffer[80]; mad_timer_string(MP3_libmad_Timer, Buffer, "%lu:lu.u", MAD_UNITS_MINUTES, MAD_UNITS_MILLISECONDS, 0); printf("rn%d Frames Decoded (%s).rn", FrameCount, Buffer);}

七、代码实现

代码实现部分,我们只展示出功能实现的主体部分,对于像FatFs文件系统的移植、LED控制、KEY按键处理、Xmodem文件传输协议的实现等部分,这些在之前的分享帖中有详细的描述,可以参考之前的分享**,当然也可以直接下载附件中的软件工程源代码,直接查看源代码。

音频播放整体功能控制逻辑

void AUDIO_Handler(void) /* 由于字数限制,请参考源代码 */

根据识别按键处理对应功能

void KEY_Handler(eKEY_VALUE value, eKEY_TYPE type) /* 由于字数限制,请参考源代码 */

加载中文字库编码点阵数据,根据LCD显示方向进行旋转

void LCD_ShowCN(uint16_t StartX, uint16_t StartY, const char *str) /* 由于字数限制,请参考源代码 */

实现自动判断中英文字符并显示在显示屏上

uint16_t LCD_ShowLOG(uint16_t StartX, uint16_t StartY, const char *str) /* 由于字数限制,请参考源代码 */

通过FatFs文件系统列举当前目录文件,并显示在LCD屏上

FRESULT AUDIO_ScanFiles(char *path) /* 由于字数限制,请参考源代码 */

八、测试运行

系统初始化加载:

歌曲目录文件显示:

播放WAV歌曲:

通过Helix解码库播放MP3歌曲:

通过labmad解码库播放MP3歌曲:

通过Xmodem串行传输协议下载中文字库到SPI FLASH:

(1)通过Xmodem串行传输协议下载字库

(2)通过Xmodem串行传输协议上传字库

(3)比较下载的字库文件和上传的字库文件是否一致

以上就是基于MM32实现音频播放系统的应用实例了,如果有需要查看原图、代码、视频演示的小伙伴,请点击底部“阅读原文”进行下载。

END

作者:xld0932

来源:21ic论坛
本文转载自“嵌入式微处理器”,如有侵权,请联系删除
原文链接:老兵精讲:基于MM32实现音频播放系统的应用实例

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

可能是当前最小的安卓智能手机?天语I9上手体验

很久没听到天语这个牌子了。当大家把智能手机的注意力放在那几个品牌的时候,很少有人还会去记起这样的小众手机品牌了。

最近,国外的Android第三方ROM开发团队交流小组内突然开始聊起了天语的一款超小手机i9,笔者在淘宝看到之后,果断下单。

外观

拿到手之后,笔者完全没预料到它会这么小。它的尺寸是101.6mm x 44 mm x 8.1 mm,屏幕是一块分辨率340x800的3.5寸显示屏。这块看起来像是iPhone X的“刘海屏”很唬人,配上iPhone的壁纸看起来就更唬人了。点亮屏幕之后令人窒息,估计可以叫做“ID刘海屏”。左侧音量键上方那个并不是iPhone的拨动式静音开关,而是按键,需要按住3秒才会触发静音。

体积很小的它,仍然搭载了USB-C接口(并不知道功能是否完整),3.5mm耳机插孔,三选二SIM卡槽(支持全网通)。虽然处理器是联发科MT6739,但考虑到分辨率这么低,用起来也还可以。随着价格的不同,它分为2 16、2 32、3 32、3 64四种搭配。我们购买的这一款是2 32的。

同样是这么小的机身内,竟然还搭载了1300万像素的前置摄像头和800万像素摄像头,看起来有点可怕。机身比之前我们展示过的Nokia 3310 4G版以及Palm Phone还要小。

操作系统

作为这种没有太多系统研发优势的小规模厂商,这类厂商一般使用的是原生Android 8.1操作系统再加上自定制桌面,因此没有太多亮眼的地方。同样的,由于是相对规模较小的厂商推出的产品,并不应该对它的系统更新期待太多。

因为过小的机身,实际操作起来会有些不太方便,但T9输入法的按键大小其实跟3310的按键差不多,所以也还算一般,而且自带的讯飞输入法可以很好地支持语音转文字的输入。

硬件性能

因为搭载的联发科MT6739是一颗28nm制程的入门级处理器,我不禁好奇它的跑分性能能到多少。只有340x800的分辨率确实可以降低GPU的负担,但它在运行安兔兔的第一阶段时FPS都不到1,第二阶段的时候还死机了。

因为相对现在落后的制程,使得手机一充电或者激烈游戏的时候,就会严重发热,热量很快就会传导到整部手机上。手机搭载Type-C充电接口,但实际上输出电流不到1A……虽然标注1800mAh,但我仍然怀疑这是否是900mAh虚标上去的。

相机表现

虽然标榜1300万像素,但笔者仍然对它的实际成像表现表示怀疑。

事实证明的确如此。即便是晴朗的天气下拍摄的照片,仍然有严重的涂抹感和插值痕迹。100%缩放之后,远处的建筑物的细节全都丢失了,这就证明了它的1300万摄像头的水分比较严重。但至少,使用这个摄像头来扫码还是不成问题的。

样张,f/2.8,ISO-104,1/2066s

100%细节放大展示

前置摄像头的表现就更加惨不忍睹了,毫无疑问,一样是插值上来的摄像头。

从官方的介绍来看,低配搭载800万像素后置摄像头和200万像素前置摄像头,而这款手机的成像素质的确也像是它应有的表现。

过低分辨率下对应用的表现影响

在国内智能手机分辨率普遍720P起步的当下,很难想象如今这种分辨率连HVGA都不到的手机能否胜任当下的主流应用。

以日常生活中常见的支付宝和微信的付款码支付为例,实际上这些条码和二维码虽然小,但商家的扫码枪的分辨率还是足以轻松扫描出结果的。

而观看视频的时候,也因为分辨率受限,导致在主流视频网站观看视频的时候360P就足够了,不过应该也没几个人会想到用它来看视频……同样的原因,过小的屏幕相信不会有人愿意在上面运行主流手游。

随着现在应用的自适应做的比以往规范很多,现在在这种小屏幕手机上运行Android应用基本不会再出现界面过小而无法正确显示一些UI元素的问题了。

笔者购买时,店家配送了一个小收纳包,这样就可以将手机绑在手臂上,当作一个便携的MP3播放器来使用。实际上这也就是这款手机仍然保留了耳机插孔的原因。你可以安装各类你喜欢的音乐播放应用,比如说网易云音乐。

小结

由于几大手机厂商的激烈竞争,曾经红极一时的小众国产手机厂商市场份额已严重萎缩。天语作为这类小众厂商之一,他们重新获得大家关注的原因,就是在手机屏幕已经走向很大的当下,推出了与众不同的超小屏手机。因为仍然有一些人对这种小屏手机十分怀念,但又想在上面使用上主流的智能手机系统。而天语成功使用这种方式,重新使自己的手机在中国获得可观的销量。

联发科 MTK6771 安卓核心板 安卓主板定制开发方案

新移 XY6771核心板|MT6771核心板|P60核心板|4G全网通核心板|4G模块|安卓核心板|MTK方案 安卓核心板 是 一款 基于 MTK 平台, 工业级高性能 的 4G 全网通安卓核心板模块。此模块支持 2G/3G/4G 移动、联通、电信等多种网络制式。是面向全球市场 TDD-LTE/FDD-LTE/WCDMA/TD-SCDMA/CDMA/GSM 六种网络制式的智能无线通信模块。

MTK6771/P60 安卓核心板

MT6771 全网通模块 内置 64 位 八核 :4 大核 A73,4 小核 A53 架构 CPU。内存最大支持到 8GB,采用安卓 9.0 操作系统,提供 2G/3G/4G 六模 18 频全网通接入,支持 WiFi/BT/GNSS (GPS/Beidou)/ FM。提供丰富数据接口,包含 LCM,Camera,USB,UART,I2C,SPI,I2S,ADC,Keypad,GPIOs 等。可外接多种模块,包括 NFC, 一维二维扫描,RFID, 指纹,刷卡,ZigBee, 安全模块,身份识别,高频超高频模块,红外,以太网,车载雷达,OBD 等。

MT6771 是贴片式模块拥有业界领先的超高集成度,共有 166LCC 53LGA 管脚。尺寸仅为 40.5mm × 50.5mm ×2.85mm,可以通过焊盘内嵌于各类 M2M 产品应用中,非常适合开发车载电脑、多媒体终端、智能家居、物联网终端等移动设备。新移科技针对以上行业领域已开发完成各种类型的产品及对应的开发板。

MTK6771 主要性能:

Process

12nm

应用处理器

4xCortex-A73up to 2.0GHz 4xCortex-A53 up to 2.0GHz

GPU

ARM Mali G72 MP3 700MHz

摄像头接口

3xMIPI CSI(4 Data lanes)32MP @ 30fps

video decode

1080p 30fps H.264/H.265

video encode

1080p 30fps H.264

LCM 接口

MIPI DSI(4 Data lanes)最高分辨率支持 FHD (2160x1080) up to 2400x1080

AI Accelerator

Up to 280GMAC/s

MTK6771 性能参数:

蜂窝数据:载波聚合(CA),CDMA2000 1x / EVDO 版本 A(SRLTE),FDD / TDD LTE, HSPA

具体功能:Cat-7 DL/Cat-5/6 UL 相机

LTE 类别:16MP 16MP,32MP

通用连接功能:蓝牙,FM,收音机,GNSS,WiFi

GNSS:Beidou, Galileo, Glonass, GPS, QZSS

开发板

为了有助于测试及使用 MTK6771 安卓模块 ,新移科技 提供一套 XY001 安卓开发板 (MTK开发板-产品中心)。

XY001 安卓开发板

应用接口

l 电源供电

l VRTC 接口

l LCM 接口

l TP 接口

l 摄像头接口

l 音频接口

l USB 接口

l USIM 接口

l UART 接口

l SDIO 接口

l I2C 接口

l SPI 接口

l ADC 接口

MT6771 安卓模块 提供 2 个 VBAT 管脚用于连接外部电源,电源输入范围为 3.5V~4.35V,推荐值为 4.0V。支持多路电源输出,用于外围电路供电,在应用时,建议并联 33pF 和 100nF 电容,可以有效去除高频干扰。

1 个 USB 接口,该接口符合 USB2.0 规范,支持高速(480Mbps),全速(12Mbps)模式。 2 组 UART 接口, UART0 可用于 Debug。

2 个 USIM 卡接口,支持双卡双待功能,USIM 卡通过模块内部的电源供电,可自动识别 1.8V 和 3.0V 卡。支持 USIM 卡热插拔功能。支持 4 位数据接口的 SD/MMC 卡,或者基于 SDIO 协议的设备,支持最新的 SD3.0 协议。 5 组 I2C 接口,仅支持主设备模式。I2C 接口在核心板内部已加上拉,I2C 接口最高速率可支持 400K,如果采用 I2C 的 DMA,最高速度能达到 3.4Mbps。2 路 ADC 通道。

1 组 I2C 接口可以用于连接触摸屏(TP),同时提供了所需的电源、中断脚和复位。3 组模拟音频输入通道和 3 组模拟输出通道。2 路 Flash Light 接口,可直接驱动手电筒及闪光灯。

MT6771 视频输出接口基于 MIPI_DSI 标准,支持 4 组高速差分数据传输,每组最高速度达 1.2Gbps。支持 BT v2.1 EDR,3.0 HS,v4.1 HS,V4.2。调制方式支持 GFSK, 8PSK,π/4QPSK。提供了 MAIN 天线、DRX 天线、GNSS 天线、WIFI/BT 天线 4 个天线接口。

具体详细说明可见附件《XY6771 AI 智能模块硬件手册「链接」》

更多规格产品MTK安卓核心板 安卓智能模块,可联系?MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司

迷你型家庭音响 索尼回音壁HT-MT500体验评测

索尼近期推出的一款新品——HT-MT500,它以娇小时尚的体型搭载索尼Hi-Res Audio音频技术,兼顾“偶像派”的颜值与“实力派”的音质,塑造耳目一新的感官体验。

外型与设计

初接触HT-MT500,第一感觉就是“低调”。前置音响比较轻薄,放在电视机下面不会干扰到视线,低音炮可以放在沙发下面使用,这种设计迎合了最近比较流行的“融入家居”的理念,让产品和家居风格尽量和谐统一。(如果觉得炭黑色过于低调,可以选择乳白色款)

细看下,HT-MT500的质感也是相当不错,透着索尼一贯的工业设计风,音响外壳的主体使用了一种类皮革纹路的处理工艺,搭配高亮后盖,以及金属网罩,整体观感不错。

索尼内部称HT-MT500为Minibar是因为其体积小巧,前置音响宽度约为50cm,高度约6.4cm,能搭配很多小尺寸的电视机产品,而低音炮的厚度约9.5cm,甚至能平放在沙发下面使用。大多用户因体积而选择放弃选购传统家庭影院系统,其中甚至不少放弃了宽度大于100cm的回音壁,所以HT-MT500体积娇小,又能灵活摆放,可以满足多种家庭环境的个性化需求,尤其是满足小客厅用户的居家需求。

随着扫地机器人的普及和发展,家具店内已经有约6成左右的沙发都留有10cm以上的高度,所以HT-MT500在设计时候就很巧妙的利用了此空间,带来沙发模式的新体验,类似于低频人体共振效果(嗯,简单模拟4D影院效果)。还有就是,当低音炮放置在沙发下方时,HT-MT500优化了低频技术,不让沙发的阻挡改变视听效果。

声学与技术

回音壁在声音上的诉求与传统Hi-Fi音箱基本一致,但也不完全相同,除了追求高音质外,在某些环境下还要追求感染力,例如:电影中的爆炸场景。

先来说说高音质方面的努力,HT-MT500是贴有Hi-Res Audio小黄标的,也就是说高频回放需达到约40kHz,这就pass了很多普通振膜的喇叭。索尼在HT-MT500的前置扬声器上使用了泡沫云母振膜(黑科技的索尼又玩材料学了,真心有钱烧),并搭配钕磁铁,从而实现了约40kHz 高频回放能力和高解析度喇叭的小型化。HT-MT500的前置扬声器功率能达到约40w,实现了小体积,大声音的效果。

前面提到过HT-MT500的低音炮厚度约9.5cm,通过倒相管式箱体设计,使低频下潜更深,满足低频的需求,而且能达到约50w的功率,带来强劲有力的低音效果。

索尼回音壁HT-MT500延续了S-Force PRO 虚拟前置环绕声、S-Master HX、DSEE HX、LDAC等多项音频技术,其中 S-Force PRO 虚拟前置环绕声技术,能模拟出环绕立体声效果,实际体验中也确实如此,HT-MT500的环绕效果比起一般同类设计的回音壁要好不少,以《速度与激情7》为例,能明显感觉到车辆从左到右,从远到近的移动感。

PS:用户还可以通过“Music Center(原:SongPal)”APP来设置、控制和联动,HT-MT500将这点进一步扩展,借助无线多房间环绕技术,用户可以连接同样支持该技术的音频产品,放在沙发的左右斜后方,进一步打造环绕立体声效果。

使用与操控

HT-MT500的连接全面、简单,HDMI、光纤、模拟音频输入、网线、WiFi、蓝牙(支持LDAC)这些都有,NFC功能也不会缺席,方便与智能手机或者Walkman连接使用。并且作为自家产品,与BRAVIA有着优良的同步连接能力。

除了机身上的触控按键外,HT-MT500还可以使用手机APP—“Music Center(原:SongPal)”来操作和设置,并且还提供了传统的遥控器。

HT-MT500音效模式有醇音技术 、标准、电影、音乐、游戏、运动等,其中游戏针对PlayStation优化,而运动针对体育节目优化,这也是索尼家庭音频系统的优势。

主观试听

这台HT-MT500在本站使用了近一个月,编辑部整体对其声音的表现还是非常满意的,无论是电影、电视还是播放纯音乐方面,都非常不错,整体效果好于很多同结构设计的回音壁,在回放纯音乐方面,甚至可以PK掉很多入门级的国产Hi-Fi音箱产品。

对于电影来说,低频还原是非常重要的,因为低频除了爆炸、机械碰撞等带来的震撼感外,还起着烘托氛围的作用,所以电影配乐中会使用很多低频的声音,例如:《环太平洋》、《创.战记》等。HT-MT500电影模式下低频还原饱满,下潜很深,而且不闷,配乐中的器乐还原非常不错,环绕感和包围感也相当不错。

而电视剧和电视节目一般都要凸出中频,强调对话清晰,这点上HT-MT500也没有问题,标准模式下,人声清晰,结相明显,密度感高,特别是在《歌手》、《金曲捞》等歌唱类综艺节目中,还原歌者的声线准确,细小的失误音也能呈现。

纯音乐回放上,我们将HT-MT500与某国产入门级2.0声道Hi-Fi产品(2000元以上)进行了对比。HT-MT500的低频下潜有力,还原大鼓鼓声不“漂浮”;虽然是2.1声道系统,采用了独立的低音炮,低频与中低频的衔接却并不脱节,试听大提琴、倍低音提琴、贝斯等乐器时候,声音连贯自然;中频中性,人声没明显染色倾向,密度感和解析力兼顾;中高频和高频还原好,小提琴、三角铁等乐器的音色通透,延展好,而且不刺激,不硬,整体表现不错;声场还原方面略显遗憾,但整体来说,HT-MT500音质水准相当不错,能满足家庭影音用户对音质的高要求。

小结

HT-MT500是体积小巧(前置音箱约50cm宽,低音炮厚度约9.5cm,可放沙发下面),声音大(总功率90W,误开最大音量的情况下被楼上邻居投诉……),音效出色(S-Force PRO 虚拟前置环绕声技术),音质还原高(能PK掉部分入门级的2.0声道Hi-Fi音箱)且集合索尼多项音频技术的品质级回音壁产品。

免责声明:本文由用户上传,如有侵权请联系删除!