搜索
bottom↓
回复: 15

407播放mp3, 播放节奏至少慢一半,声音低沉,女音变超低沉男音

[复制链接]

出0入0汤圆

发表于 2017-10-18 16:25:07 | 显示全部楼层 |阅读模式
如题, 板子25M外部晶振,DSP用的是nxp的tef6635, 没用mck输出, 44.1k, 无论是音乐是64kbps还是128k, 320k效果一样,个人觉得不是解码速度慢的问题。
整体用的是原子的例程,没跑系统, 很多内存申请用的是外部ram.
请教各位高手可能是什么原因?

谢谢


const u16 I2S_PSC_TBL[][5]=
{
  // fs/10, PLLI2SN,  PLLI2SR,  I2SDIV,  ODD
  
        {800 ,  192,         2,           187,       1},                //8Khz²ÉÑùÂÊ
        {1600, 192,         3,            62,        1},                //16Khz²ÉÑùÂÊ
        {2205, 290,         3,            68,        1},                //22.05Khz²ÉÑùÂÊ
        {3200, 256,         2,            62,        1},                //32Khz²ÉÑùÂÊ
        {4410, 302,         2,            53,        1},                //44.1Khz²ÉÑùÂÊ
        {4800, 192,         5,            12,        1},                //48Khz²ÉÑùÂÊ
        {9600, 384,         5,            12,        1},          //96Khz²ÉÑùÂÊ
        {19200,424,        3,             11,       1},          //192Khz²ÉÑùÂÊ
}

u8 I2S2_SampleRate_Set(u32 samplerate)
{
        u8 i=0;
        u32 tempreg=0;
        samplerate/=10;//ËõС10±¶   
       
        for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//¿´¿´¸Ä²ÉÑùÂÊÊÇ·ñ¿ÉÒÔÖ§³Ö
        {
                if(samplerate==I2S_PSC_TBL[i][0])break;
        }

        RCC_PLLI2SCmd(DISABLE);//ÏȹرÕPLLI2S
        if(i==(sizeof(I2S_PSC_TBL)/10))return 1;//ËѱéÁËÒ²ÕÒ²»µ½
        RCC_PLLI2SConfig((u32)I2S_PSC_TBL[i][1],(u32)I2S_PSC_TBL[i][2]);//ÉèÖÃI2SxCLKµÄƵÂÊ(x=2)  ÉèÖÃPLLI2SN PLLI2SR

        RCC->CR|=1<<26;                                        //¿ªÆôI2SʱÖÓ
        while((RCC->CR&1<<27)==0);                //µÈ´ýI2SʱÖÓ¿ªÆô³É¹¦.
        tempreg=I2S_PSC_TBL[i][3]<<0;        //ÉèÖÃI2SDIV
        tempreg|=I2S_PSC_TBL[i][3]<<8;        //ÉèÖÃODDλ
        tempreg|=0<<9;                                        //ʹÄÜMCKOEλ,Êä³öMCK
        SPI2->I2SPR=tempreg;                        //ÉèÖÃI2SPR¼Ä´æÆ÷
        return 0;
}

I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_16bextended); // 这里用I2S_DataFormat_16b的话播放就会始终有断音。
I2S2_TX_DMA_Init(p1->i2sbuf1, p1->i2sbuf2,mp3ctrl->outsamples, TRUE);//ÅäÖÃTX DMA

void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num, BOOL DoubleBuffer_Flag)
{  
        NVIC_InitTypeDef   NVIC_InitStructure;
        DMA_InitTypeDef  DMA_InitStructure;
       

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ
       
  DMA_DeInit(DMA1_Stream4);
  
  while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}//µÈ´ýDMA1_Stream1¿ÉÅäÖÃ
               
  /* ÅäÖÃ DMA Stream */

  DMA_InitStructure.DMA_Channel = DMA_Channel_0;  //ͨµÀ0 SPI2_TXͨµÀ
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//ÍâÉèµØַΪ:(u32)&SPI2->DR
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;//DMA ´æ´¢Æ÷0µØÖ·
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//´æ´¢Æ÷µ½ÍâÉèģʽ
  DMA_InitStructure.DMA_BufferSize = num;//Êý¾Ý´«ÊäÁ¿
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉè·ÇÔöÁ¿Ä£Ê½
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//ÍâÉèÊý¾Ý³¤¶È:16λ
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//´æ´¢Æ÷Êý¾Ý³¤¶È£º16λ
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ʹÓÃÑ­»·Ä£Ê½
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//¸ßÓÅÏȼ¶
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //²»Ê¹ÓÃFIFOģʽ        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«Êä
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
  DMA_Init(DMA1_Stream4, &DMA_InitStructure);//³õʼ»¯DMA Stream

  if(DoubleBuffer_Flag)
          {
         DMA_DoubleBufferModeConfig(DMA1_Stream4,(u32)buf1,DMA_Memory_0);//Ë«»º³åģʽÅäÖÃ

         DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);//Ë«»º³åģʽ¿ªÆô
          }

  DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);//¿ªÆô´«ÊäÍê³ÉÖжÏ
       
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//ÇÀÕ¼ÓÅÏȼ¶0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//×ÓÓÅÏȼ¶0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ
  NVIC_Init(&NVIC_InitStructure);//ÅäÖÃ
  
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出100入101汤圆

发表于 2017-10-18 16:33:22 | 显示全部楼层
买个原子的板子试一下

出0入0汤圆

 楼主| 发表于 2017-10-18 16:39:08 | 显示全部楼层
fengyunyu 发表于 2017-10-18 16:33
买个原子的板子试一下

dsp不一样。

出0入0汤圆

 楼主| 发表于 2017-10-18 16:41:20 | 显示全部楼层
I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_16bextended); // 这里用I2S_DataFormat_16b的话播放就会始终有断音。
如果原子板子这里用I2S_DataFormat_16b是什么情况?

出0入0汤圆

发表于 2017-10-19 08:45:29 | 显示全部楼层
应该是I2S采样率不对

出0入0汤圆

 楼主| 发表于 2017-10-19 09:07:15 | 显示全部楼层
DSP设的是44.1k, 另外sd卡还是spi连接, 管脚50M.

出0入0汤圆

发表于 2017-10-19 09:56:59 | 显示全部楼层
leonliu_1128 发表于 2017-10-19 09:07
DSP设的是44.1k, 另外sd卡还是spi连接, 管脚50M.

你这种女声变男生的根本原因就是采样率变低了,你可以用示波器测量407的I2S输出时钟速度。407解码mp3资源完全够,如果是解码慢,表现应该是卡顿,而不是变调

出0入0汤圆

 楼主| 发表于 2017-10-19 10:20:34 | 显示全部楼层
qq854149876 发表于 2017-10-19 09:56
你这种女声变男生的根本原因就是采样率变低了,你可以用示波器测量407的I2S输出时钟速度。407解码mp3资源 ...

手册上写
音频频率精度(针对PLLM VCO = 1 MHz 或2 MHz)-- 是25MHz, PLL_M=25
主时钟关闭 44100, 16位 {4410, 302,         2,            53,        1}, -->我的mck没连  tempreg|=0<<9;  SPI2->I2SPR=tempreg;       

FS= I2SxCLK / [(16*2)*((2*I2SDIV)+ODD))]= 151M/[32x(2x53+1)]=151M/3424=44100
I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR = 25M/25x 302/2=151M

看上去没错阿
等会接示波器看看

出0入0汤圆

发表于 2017-10-19 10:47:13 | 显示全部楼层
leonliu_1128 发表于 2017-10-19 10:20
手册上写
音频频率精度(针对PLLM VCO = 1 MHz 或2 MHz)-- 是25MHz, PLL_M=25
主时钟关闭 44100, 16位  ...


PLL你这样试试吧
然后I2S也要配成44100

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-10-19 13:16:05 | 显示全部楼层
qq854149876 发表于 2017-10-19 10:47
PLL你这样试试吧
然后I2S也要配成44100

原子用的跟你的不太一样

u8 I2S2_SampleRate_Set(u32 samplerate)
{
        u8 i=0;
        u32 tempreg=0;
        samplerate/=10;//ËõС10±¶   
       
        for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//¿´¿´¸Ä²ÉÑùÂÊÊÇ·ñ¿ÉÒÔÖ§³Ö
        {
                if(samplerate==I2S_PSC_TBL[0])break;
        }

        RCC_PLLI2SCmd(DISABLE);//ÏȹرÕPLLI2S
        if(i==(sizeof(I2S_PSC_TBL)/10))return 1;//ËѱéÁËÒ²ÕÒ²»µ½
        RCC_PLLI2SConfig((u32)I2S_PSC_TBL[1],(u32)I2S_PSC_TBL[2]);//ÉèÖÃI2SxCLKµÄƵÂÊ(x=2)  ÉèÖÃPLLI2SN PLLI2SR

        RCC->CR|=1<<26;                                        //¿ªÆôI2SʱÖÓ
        while((RCC->CR&1<<27)==0);                //µÈ´ýI2SʱÖÓ¿ªÆô³É¹¦.
        tempreg=I2S_PSC_TBL[3]<<0;        //ÉèÖÃI2SDIV
        tempreg|=I2S_PSC_TBL[3]<<8;        //ÉèÖÃODDλ
        tempreg|=0<<9;                                        //ʹÄÜMCKOEλ,Êä³öMCK
        SPI2->I2SPR=tempreg;                        //ÉèÖÃI2SPR¼Ä´æÆ÷
        return 0;
}  

出0入0汤圆

 楼主| 发表于 2017-10-19 13:49:39 | 显示全部楼层
示波器测了,I2S2_CK是1.41MHz, I2S2_WS是22.05kHz, 这是怎么回事啊?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-10-19 14:06:39 | 显示全部楼层
现在是用I2S_DataFormat_16b, I2S2_WS是44.1kHz, 但声音播放速度正常, 感觉是快速的卡顿,所以听不太清楚, 隐约能听到女声.
之前用的是I2S_DataFormat_16bextended,  I2S2_WS是22.05kHz, 效果就是前面那种.
原子例程里用的是I2S_DataFormat_16bextended, 请问为什么会这样啊?

出0入0汤圆

 楼主| 发表于 2017-10-19 14:17:47 | 显示全部楼层
设成这样就好了
I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_32b);
I2S2_SampleRate_Set里选44.1k时16位的参数值。

谁知道为什么吗?

出0入0汤圆

发表于 2017-10-19 14:49:06 | 显示全部楼层
leonliu_1128 发表于 2017-10-19 14:17
设成这样就好了
I2S2_Init(I2S_Standard_Phillips,I2S_Mode_MasterTx,I2S_CPOL_Low,I2S_DataFormat_32b);
...

你的codec,可能工作在24位模式

出0入0汤圆

 楼主| 发表于 2017-10-19 15:14:51 | 显示全部楼层
qq854149876 发表于 2017-10-19 14:49
你的codec,可能工作在24位模式

查了下, 你说对了。 那我应该改成24位才对。

谢谢执教

/* ADSP X memory absolute addresses */
#define ADSP_X_AD01InL                               0xF202BCUL
#define ADSP_X_AD01InR                               0xF202BDUL
#define ADSP_X_AD23InL                               0xF202BEUL
#define ADSP_X_AD23InR                               0xF202BFUL
#define ADSP_X_CenterInPntr                          0xF205B7UL

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-24 12:52

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

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