搜索
bottom↓
回复: 46

STM32+FATFS+SDIO+helix 软解MP3成功了,但播放有杂音,是I2S2 Master的问题?

  [复制链接]

出0入0汤圆

发表于 2011-10-1 23:28:27 | 显示全部楼层 |阅读模式
主控:STM32F103ZET6
文件系统:FATFS R0.07c
SDIO 4bit DMA
软解码:helix mp3

功能:上电从SD卡读取MP3文件,调用helix 库解码MP3,将解码后的数据传到I2S2 codec上播放
问题:解码没问题,播放可以听到完整歌曲,但有吱吱的杂音,不知道是不是I2S2 Master的问题,看论坛上stm32 radio好象有说过这个问题

以下是播放程序代码:
/**
  ******************************************************************************
  * @file    Project/play.c
  * @author  baiweijishu
  * @version V1.0.0
  * @date    28/09/2011
  * @brief   this file provides all audio play relevant function
  ******************************************************************************
  * @copy
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2>&copy; COPYRIGHT 2011 baiweijishu</h2>
  */

/* Includes ------------------------------------------------------------------*/
#include "stm3210e_eval_lcd.h"
#include "i2s_codec.h"
#include "sdcard.h"
#include "ff.h"

#include <string.h>
#include "mp3dec.h"
#include "mp3common.h"

/* Audio file location */
#define AUDIO_FILE_ADDRESS  0x64060000

extern __IO uint32_t AudioDataIndex;

s16 outbuf[4608];          // Playback buffer - Value must be 4608 to hold 2xMp3decoded frames.

// MP3
#define READBUF_SIZE 4000       // Value must min be 2xMAINBUF_SIZE = 2x1940 = 3880bytes
MP3FrameInfo mp3FrameInfo;      // Content is the output from MP3GetLastFrameInfo,
                                // we only read this once, and conclude it will be the same in all frames
                                // Maybe this needs to be changed, for different requirements.
static HMP3Decoder hMP3Decoder; // Content is the pointers to all buffers and information for the MP3 Library
u32 Old_Pll;                    // Saves the PLL setting before we change it to Very high speed in MP3 section
volatile u32 bytesLeft;         // Saves how many bytes left in readbuf
volatile u32 outOfData;         // Used to set when out of data to quit playback
u8 readBuf[READBUF_SIZE];       // Read buffer where data from SD card is read to
u8 *readPtr;                    // Pointer to the next new data
u32 offset;                                  // Used to save the offset to the next frame   
u32 err=0;                                   // Return value from MP3decoder
// MP3 END

void play_mp3(void)
{
        FRESULT fsresult;
        FATFS fs;
        FILINFO finfo;
        DIR dir;
        FIL file;
        UINT cnt;



    /* Initilizes the MP3 Library */
    hMP3Decoder = MP3InitDecoder();

        /*open mp3 file*/
          fsresult = f_mount(0, &fs);
        fsresult = f_opendir(&dir,"");
        fsresult = f_open(&file, "a.mp3", FA_READ);

        /* Reset counters */
    bytesLeft = 0;
    outOfData = 0;
        readPtr = readBuf;

          /* Initialize the application environment(I2S, I2C, codec,memory) */  
        printf("I2S_CODEC_Init \n\r");        
        I2S_CODEC_Init(OutputDevice_HEADPHONE, AUDIO_FILE_ADDRESS);
        printf("I2S_CODEC_Init finish\n\r");

        /* Enable Playing the audio file */
        I2S_CODEC_Play(GetVar_DataStartAddr());

        fsresult = f_read(&file,readBuf,READBUF_SIZE,&cnt);
        bytesLeft += cnt;
       
        while(1)
        {
                /* find start of next MP3 frame - assume EOF if no sync found */
                offset = MP3FindSyncWord(readPtr, bytesLeft);
                if (offset < 0) {
                        outOfData = 1;
                        return;
                }
                else
                {
                        readPtr += offset;                         //data start point
                        bytesLeft -= offset;                 //in buffer
                           err = MP3Decode(hMP3Decoder, &readPtr, &bytesLeft, outbuf, 0);

                        if (bytesLeft < READBUF_SIZE)
                        {
                                memmove(readBuf,readPtr,bytesLeft);
                                fsresult = f_read(&file, readBuf + bytesLeft, READBUF_SIZE - bytesLeft, &cnt);
                                if (cnt < READBUF_SIZE - bytesLeft)
                                memset(readBuf + bytesLeft + cnt, 0, READBUF_SIZE - bytesLeft - cnt);
                                bytesLeft=READBUF_SIZE;
                                readPtr=readBuf;               
                        }
                       
            MP3GetLastFrameInfo(hMP3Decoder, &mp3FrameInfo);

//                        printf("mp3FrameInfo.samprate=%d\n\r",mp3FrameInfo.samprate);
//                        printf("mp3FrameInfo.nChans=%d\n\r",mp3FrameInfo.nChans);
//                        printf("mp3FrameInfo.samprate=%d\n\r",mp3FrameInfo.samprate);
//                        printf("mp3FrameInfo.outputSamps=%d\n\r",mp3FrameInfo.outputSamps);
//                        printf("mp3FrameInfo.layer=%d\n\r",mp3FrameInfo.layer);
//                        printf("mp3FrameInfo.version=%d\n\r",mp3FrameInfo.version);
//                        printf("mp3FrameInfo.bitrate=%d\n\r",mp3FrameInfo.bitrate/1000);
//
//                        for(cnt=0;cnt<mp3FrameInfo.outputSamps;cnt++)
//                        printf("%d ",outbuf[cnt]);

//                        LCD_DisplayStringLine(Line3, "debug by zhangxl");
                  
                  printf("debug by zhangxl \n\r");  
                  while (AudioDataIndex < mp3FrameInfo.outputSamps)
                  printf("I2S_CODEC_Play \n\r");
                  
                  AudioDataIndex=0;

                }
        }               
               
}


/******************* (C) COPYRIGHT 2011 baiweijishu *****END OF FILE****/

出0入0汤圆

发表于 2011-10-2 01:12:50 | 显示全部楼层
什么代码,还是全部发上来吧

出0入0汤圆

 楼主| 发表于 2011-10-8 09:18:26 | 显示全部楼层
这部分是关键源码,其余部分基本上都是库函数了

出0入0汤圆

发表于 2011-11-17 20:07:11 | 显示全部楼层
软解码,厉害呀!

出0入0汤圆

发表于 2011-12-26 16:41:31 | 显示全部楼层
东东很好,就是没有源代码,太可惜了。

出0入0汤圆

发表于 2012-1-9 21:48:46 | 显示全部楼层
求源代码

出0入0汤圆

发表于 2012-2-14 17:29:48 | 显示全部楼层
有代码就更好了

出0入0汤圆

发表于 2012-3-27 19:22:40 | 显示全部楼层
有杂音是程序设计的问题 不关STM32的事

出0入0汤圆

发表于 2012-3-28 09:41:59 | 显示全部楼层
可惜东西不全

出0入0汤圆

发表于 2012-3-28 09:46:15 | 显示全部楼层
这个应该是很多人都想做的。

出0入0汤圆

发表于 2012-3-28 09:53:46 | 显示全部楼层
软解码!厉害!

出0入0汤圆

发表于 2012-3-29 00:28:14 | 显示全部楼层
我昨天调试MP3软解码, 右声道完全没有问题, 左声道有杂音, 可能还是软件没有处理好, 今天继续调

出0入0汤圆

发表于 2012-4-16 10:37:08 | 显示全部楼层
如果楼主能将电路图和软件包传上来就好了,我等正好可以参考着做一个。我现在也把VS1053放弃了,成本太高不适合业余玩家。最终的目标是实现软解FLAC

出0入0汤圆

发表于 2012-4-16 11:49:14 | 显示全部楼层
能否把整个工程贴上来

出0入0汤圆

发表于 2012-4-16 11:52:26 | 显示全部楼层
是不是卡顿造成的

出0入0汤圆

发表于 2012-4-16 11:58:35 | 显示全部楼层
楼主能否将电路图和软件包传上来参考 ?

出0入0汤圆

发表于 2012-4-17 08:36:14 | 显示全部楼层
mark,软解MP3

出0入0汤圆

发表于 2012-4-17 08:54:50 | 显示全部楼层
mark 软解

出0入0汤圆

发表于 2012-4-17 20:36:43 | 显示全部楼层
MARK,不错

出0入0汤圆

发表于 2012-4-24 14:40:51 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2012-4-24 15:51:48 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-10-18 17:19:29 | 显示全部楼层
Lengxue 发表于 2012-3-29 00:28
我昨天调试MP3软解码, 右声道完全没有问题, 左声道有杂音, 可能还是软件没有处理好, 今天继续调 ...

兄台, 可否交流一下mp3软件,  我也是软解出来后, 声音有"吱吱"
的杂音, 我的平台是stm32f207, helix库(我用的是源码), 不知道你现在解码OK了没有呢?  谢谢.

出0入0汤圆

发表于 2012-10-18 22:18:53 | 显示全部楼层
yuzhangyuan 发表于 2012-10-18 17:19
兄台, 可否交流一下mp3软件,  我也是软解出来后, 声音有"吱吱"
的杂音, 我的平台是stm32f207, helix库(我 ...

我的4月底已经调试成功了,但是我的平台是LPC1766 也是CM3内核

出0入0汤圆

发表于 2012-10-31 09:19:49 | 显示全部楼层
牛人啊,我也想做软解码

出0入0汤圆

发表于 2012-10-31 09:50:49 | 显示全部楼层
可尝试将PLL提高到12倍频~

出0入0汤圆

发表于 2012-11-1 14:31:25 | 显示全部楼层
我回去再试下... 搁浅一阵子了.

出0入0汤圆

发表于 2012-11-1 14:37:39 | 显示全部楼层
Lengxue 发表于 2012-10-18 22:18
我的4月底已经调试成功了,但是我的平台是LPC1766 也是CM3内核

既然都是CM3的片子, 应该差距不大啊, I2S, DMA什么的应该差不多吧.
都是用的helix, 那么解码这块应该基本一致吧, 我估计就是时钟和数据传输方面的问题....
希望您能把MP3解码过程中的要点共享一下吧, 时钟, I2S, DMA方面的...谢谢您.  

出0入0汤圆

发表于 2012-12-28 15:14:00 | 显示全部楼层
楼主能否上传点资料????

出0入46汤圆

发表于 2013-1-15 12:52:32 | 显示全部楼层
同意楼上,可否把工程文件一起上传?

出0入0汤圆

发表于 2013-8-16 18:46:52 | 显示全部楼层

出0入0汤圆

发表于 2013-9-14 10:41:06 | 显示全部楼层
如果有人解决了,能否贡献一下经验。现在可以放歌,但是效果不是特别好也是咯吱的响。估计是解码后的数据转换出了问题,求解决。


本人验证过,用现在的硬件平台播放WAV歌曲,不会有任何咯吱噪音。至少我的耳朵听着不明显!!!!!!!!!!!!!

出0入0汤圆

发表于 2013-9-14 11:04:39 | 显示全部楼层
如果有人解决了,能否贡献一下经验。现在可以放歌,但是效果不是特别好也是咯吱的响。估计是解码后的数据转换出了问题,求解决。


本人验证过,用现在的硬件平台播放WAV歌曲,不会有任何咯吱噪音。至少我的耳朵听着不

出0入0汤圆

发表于 2013-9-14 11:05:21 | 显示全部楼层
好无语,自己都不知道自己修改了哪儿,现在仍然有杂音,不过相别刚才,好了横多了!!!!!!无语了,泪奔

出0入8汤圆

发表于 2013-9-14 12:14:02 来自手机 | 显示全部楼层
留名标记一下

出0入0汤圆

发表于 2013-12-25 09:27:24 | 显示全部楼层
Lengxue 发表于 2012-3-29 00:28
我昨天调试MP3软解码, 右声道完全没有问题, 左声道有杂音, 可能还是软件没有处理好, 今天继续调 ...

你是在lz的程序的基础上调的吗?

出0入0汤圆

发表于 2013-12-25 10:10:18 | 显示全部楼层
k_er_tlwei 发表于 2013-12-25 09:27
你是在lz的程序的基础上调的吗?

好像不是 我已经把工程源码都开源了
帖子地址:http://www.amobbs.com/thread-5464131-1-1.html

出0入0汤圆

发表于 2013-12-25 10:53:09 来自手机 | 显示全部楼层
印象中f1系列的iis是有bug的,时钟有误差
因此有网友甚至在dac前用了一个cpld作缓冲

而最新的f4系列,单独给iis设置了一个pll,问题得到了比较好的解决~

出0入0汤圆

发表于 2013-12-25 10:55:24 来自手机 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2013-12-25 11:00:49 | 显示全部楼层
Lengxue 发表于 2013-12-25 10:10
好像不是 我已经把工程源码都开源了
帖子地址:http://www.amobbs.com/thread-5464131-1-1.html ...

谢谢了,我没注意到 。看来我找资料的能力还很欠缺

出0入0汤圆

 楼主| 发表于 2013-12-25 11:28:59 | 显示全部楼层
在LPC1788上解码完全没杂音了

出0入0汤圆

 楼主| 发表于 2014-2-21 17:36:16 | 显示全部楼层
之前这个STM32杂音主要是缓冲处理没弄好,开两三个缓冲,一个解码,一个播放,这样效果会好一点。另外是PLL的问题了,论坛很多大牛有说过

出0入0汤圆

 楼主| 发表于 2014-6-26 16:06:32 | 显示全部楼层
2011年搞的,市面上很多都是抄袭我们的。。。。。。。。。。。

出0入0汤圆

发表于 2014-9-25 09:35:53 | 显示全部楼层
楼主 能共享代码么,最近也在搞MP3软解码

出0入0汤圆

发表于 2014-10-16 14:03:14 | 显示全部楼层
坐等代码

出0入0汤圆

发表于 2014-10-16 14:17:28 | 显示全部楼层
103做软解码……牛……

出0入0汤圆

发表于 2014-12-27 21:00:40 | 显示全部楼层
本帖最后由 hantnt 于 2014-12-27 21:02 编辑

应该是电路上的问题,I2S2 codec对电源要求比较高,特别是那个DAC供电电源和后级放大的电源,另耳机的地一定得是单独走线至芯片,否则会听到其他元件在地上叠加的噪声。
编辑原因: ADC->DAC

出0入0汤圆

发表于 2015-4-23 10:13:33 | 显示全部楼层
MARK,不错
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 16:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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