OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10483|回复: 8

在F4Discovery 板上移植了Helix 软解MP3,放音不是立体声,求助(解决了)

[复制链接]

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-9-6 09:46:56 | 显示全部楼层 |阅读模式
在stm32f4 discovery fw中Audio_playback_and_record的USB OTG基础上修改,读取U盘中名为audio.mp3的文件,解码正常,可以听歌,没有杂音,但是从板载DAC出来的不是立体声,两个声道混合一起的声音。就像老式单声道收音机。求助。


解决了,原先以为是出在I2S上,后来发现还是出在解码过程中。

问题出在拷贝过来的Helix Mp3解码库上。百度上翻了不少实例,发现大家都一样,只能自己调试单步看。

1. 对比了原版的helix mp3解码库,拷贝过来的库多了一个mp3_play.c。里面有两个函数:
/************************************************************************************/
/*
* File Name : Convert_Stereo
* Description   : I have do some modification in Subband() function due to the long time of
*                  decode.Using PolyphaseMono() function which is used in decode mono mp3,to decode
*                  Stereo,so must use this funtion to convert mono to Stereo.
* Input         : Adress of buffer data
* Output         : None
* Return         : None
*/
/************************************************************************************/
void Convert_Stereo(short *buffer)

/***********************************************************************************/
/*
* File Name : Convert_Mono
* Description   : after decoder a frame of Mono MP3,the buffer will fill by 1152 halfword,this function
*                   will change  Mono into Stereo.  Mono1,L2,L3,L4.  Stereo1R1,L2R2,L3R3.L4R4
* Input         : Adress of buffer data
* Output         : None
* Return         : None
*/
/***********************************************************************************/
void Convert_Mono(short *buffer)


看了注释后才知道第一个函数是将两个声道混合。
第二个函数是将单声道复制到另外一个声道。

在播放大循环中调用了void Convert_Stereo(short *buffer),混合两个声道,所以放音出来是单声道声音。

注释掉后发现声音像哨子,还是不对。 
在void Convert_Stereo(short *buffer)上面的注释中发现了蹊跷,原来以前的人对这个库进行了修改,找到库里的subband.c
找到了int Subband(MP3DecInfo *mp3DecInfo, short *pcmBuf)

既然没有双声道 就到双声道代码区找

if (mp3DecInfo->nChans == 2) {
/* stereo */
for (b = 0; b < BLOCK_SIZE; b++) {
// FDCT32(mi->outBuf[0], sbi->vbuf + 0*32, sbi->vindex, (b & 0x01), mi->gb[0]);
// FDCT32(mi->outBuf[1], sbi->vbuf + 1*32, sbi->vindex, (b & 0x01), mi->gb[1]);
// PolyphaseMono(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef);
// sbi->vindex = (sbi->vindex - (b & 0x01)) & 7;
// pcmBuf += (2 * NBANDS);
/*the normal code*/
FDCT32(mi->outBuf[0], sbi->vbuf + 0*32, sbi->vindex, (b & 0x01), mi->gb[0]);
FDCT32(mi->outBuf[1], sbi->vbuf + 1*32, sbi->vindex, (b & 0x01), mi->gb[1]);
PolyphaseStereo(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef);
sbi->vindex = (sbi->vindex - (b & 0x01)) & 7;
pcmBuf += (2 * NBANDS);
}

上面绿色部分是作者原先在使用的代码,下半黑色部分才是原先正常的代码,区别就是
PolyphaseMono(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef);
PolyphaseStereo(pcmBuf, sbi->vbuf + sbi->vindex + VBUF_LENGTH * (b & 0x01), polyCoef);
一个是单声道函数 一个立体声函数。把修改部分注释掉,重新编译,OK,现在声音对了,是正常的立体声。

原先的作者估计是想在单个喇叭上播放,所以对库进行了修改。

传新的附件。

STM32F4-Discovery_FW_V1.1.0.zip

29.73 MB, 下载次数: 5691

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-9-6 10:38:59 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
 楼主| 发表于 2013-9-6 10:55:35 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
感谢原子哥帮顶
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
 楼主| 发表于 2013-9-6 14:48:38 | 显示全部楼层
解决了,看主贴
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-9-6 21:30:28 | 显示全部楼层
回复【4楼】ricefat:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-4-1
在线时间
1 小时
发表于 2013-11-1 13:58:04 | 显示全部楼层
好厉害!学习学习
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2014-3-26
在线时间
0 小时
发表于 2014-3-26 11:48:08 | 显示全部楼层
谢谢楼主分享,很详细
回复 支持 反对

使用道具 举报

0

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2014-12-13
在线时间
89 小时
发表于 2016-1-31 09:49:55 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-6-7
在线时间
1 小时
发表于 2018-6-9 14:17:35 | 显示全部楼层
下载到一半就停了,,可以发我一份吗,谢谢  clvert@163.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 07:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表