STM32 wavplayer播放单声道音频的处理方法

发布者:EtherealGrace最新更新时间:2024-08-30 来源: elecfans关键字:STM32 手机看文章 扫描二维码
随时随地手机看文章

最近在使用rtthread 的 audio设备播放wav的音频,MCU使用的是STM32F4,使用过程中发现,不能在播放单声道音频的时候会特别快,究其原因是因为STM32的I2S是双声道输出,而音频输入的声音是单声道的,相当于少一个声道的数据,其实如果播放立体声音频就没有问题了。


但是使用立体声音频会增加WAV文件的体积,这样占用的FLASH空间就大了,目前想到的方案是将读取到的音频数据扩展到双声道,我们直接修改wavplayer.c中的内容,如果有更好的解决方案,欢迎指正:


修改点如下:

1、声明一个声道数变量来记录当前音频的声道数,在声明一个ushort类型的指针,方便后边计算

2、获取当前音频的声道数

3、获取音频文件读取缓冲区的指针

4、如果是单声道音频,那么将 单声道的音频扩展到左右两个声道,形成双声道数据流

1.jpg

2.jpg


关键字:STM32 引用地址:STM32 wavplayer播放单声道音频的处理方法

上一篇:探究STM32H7芯片IAP跳转失败案例
下一篇:STM32模数转换器 (ADC)介绍

推荐阅读最新更新时间:2024-11-12 21:51

关于STM32头文件
用keil sdk编译STM32的程序时出现 .\inc\stm32f10x_conf.h(21): error: #5: cannot open source input file stm32f10x_type.h : No such file or directory 类似的问题,说明没有搜到此头文件,如果是用双引号 包含的头文件,则问题肯定出在没有把此头文件放在工程文件夹内。 还有一个问题,已经把此头文件放在了工程文件夹内,但是编译时出现这个问题:.\inc\stm32f10x_type.h(28): error: #256: invalid redeclaration of type name s32 (declar
[单片机]
关于<font color='red'>STM32</font>头文件
STM32库函数void USART_SendData()的缺陷和解决方法
1 问题及现象 使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。 如: for(TxCounter = 0;TxCounter RxCounter; TxCounter++) USART_SendData(USART1, RxBuffer ); 2 原因 此API函数不完善,函数体内部没有一个判断一个字符是否发送完毕的语句,而是把数据直接放入发送缓冲区,当连续发
[单片机]
STM32时钟分频因子
无关的话: 关于TIM的时钟分频因子Clock division 是什么,他的作用是什么。 网上找了很多解释,说的人更加一头雾水! 于是自己研究,先看其定义 时钟分频因子的定义: 官方参考手册P377页 TIM1和TIM8的时钟控制寄存器(TIMX_CR1)的第9:8位 是这样定义的 This bit-field indicates the division ratio between the timer clock (CK_INT) frequency and the dead-time and sampling clock (tDTS)used by the dead-time generators and the digit
[单片机]
UG-2864HSWEG0或ssd1306与stm32源程序+Proteus仿真
我在做这个仿真的时候也遇到了一定问题,现附上proteus仿真模拟图和源代码供大家参考。大家在用这块屏幕取字模的时候一定要注意是行列式还是列行试。注意在打印数组的时候要注意他的页与行的变换。加油 仿真原理图如下 单片机源程序如下: #include sys.h #include usart.h #include delay.h //unsigned char a = mengxinyu ; unsigned char a ={//孟 /* 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m
[单片机]
UG-2864HSWEG0或ssd1306与<font color='red'>stm32</font>源程序+Proteus仿真
STM32驱动MAX6675读取温度
MAX6675是带冷端补偿的K型热电偶转换芯片,SO-8封装,精度12位,分辨率0.25℃,测量最高温度1023.75℃。也就是1024/(2的12次方)=0.25℃。 VCC-GND接3~5.5V电压; T+,T-分别接K型热电偶正负极; CS为片选,低电平有效; SCK为串行时钟,需要由STM32提供; SO为数据串行输出; 接线方式: MAX6675的输出方式是单片机输入时钟脉冲,MAX6675在时钟的下跳沿在SO管脚上输出数据。在数据手册第5页有时序说明,在6页有时序图,时序说明和时序图有差别。本人在读取数据过程中,发现按照时需说明操作,是正确
[单片机]
<font color='red'>STM32</font>驱动MAX6675读取温度
stm32库函数GPIO_Init()解析
GPIO_Init函数是IO引脚的初始化函数,进行个个引脚的初始化配置,主要接受两个参数,一个是配置引脚组(GPIO_TypeDef* GPIOx),一个是配置的参数( GPIO_InitTypeDef* GPIO_InitStruct),具体如下 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) /*其中第一个参数为那组引脚,每组拥有16个引脚,每组都具有不同的寄存器配置地址,第二个参数是一个数据结构,也就是将基本配置信息放在这个数据结构里面,再将这个结构传入函数进行配置*/ //其中数据机构可以表示为如下 typedef str
[单片机]
STM32_入门程序LED
*********************************************************************************************************************************************************** 开发板 :奋斗STM32 cpu :STM32F103 开发环境:keil uVsion4 ********************************************************************************************************
[单片机]
STM32_入门程序LED
STM32之CAN详解
简介:bxCAN有3个主要的工作模式:初始化模式、正常模式和睡眠模式。 当bxCAN处于睡眠模式,软件必须对CAN_MCR寄存器的INRQ位置’1’并且同时对SLEEP位清’0’,才能进入初始化模式。 有2种方式可以唤醒(退出睡眠模式)bxCAN:通过软件对SLEEP位清’1’,或硬件检测到CAN总线的活动。 1 bxCAN工作模式 bxCAN有3个主要的工作模式:初始化模式、正常模式和睡眠模式。 在硬件复位后,bxCAN工作在睡眠模式以节省电能,同时CANTX引脚的内部上拉电阻被激活。软件通过对CAN_MCR寄存器的INRQ或SLEEP位 置’1’,可以请求bxCAN进入初始化或睡眠模式。一旦进入了初始化或睡眠模
[单片机]
<font color='red'>STM32</font>之CAN详解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved