求教,有关VS1053B ADPCM录音的问题。

2019-07-20 22:02发布

硬件参考战舰板子的VS1053音频模块,已经实现了线性PCM的录音和播放,程序参考的是战舰板子的程序,现在想实现IMA ADPCM录音,参考数据手册配置WAV头和寄存器如下:
//初始化WAV头.
void Recorder_Wav_Init(__WaveHeader* wavhead) //初始化WAV头                          
{
  wavhead->riff.ChunkID=0X46464952;        //"RIFF"
  wavhead->riff.ChunkSize=0;                //还未确定,最后需要计算
  wavhead->riff.Format=0X45564157;         //"WAVE"
  wavhead->fmt.ChunkID=0X20746D66;         //"fmt "
  wavhead->fmt.ChunkSize=20;                 //大小为16个字节
  wavhead->fmt.AudioFormat=0X11;         //0X01,表示PCM;0X11,表示IMA ADPCM
  wavhead->fmt.NumOfChannels=1;                //单声道
  wavhead->fmt.SampleRate=8000;        //8Khz采样率 采样速率
  wavhead->fmt.ByteRate=(wavhead->fmt.SampleRate)*(wavhead->fmt.NumOfChannels)*256/505;         //B=Fs*C*256/505
  wavhead->fmt.BlockAlign=256;        //块大小,2个字节为一个块
  wavhead->fmt.BitsPerSample=4;                //4位ADPCM
  wavhead->fmt.ByteExtraData=2;                //附加的数据字节2
  wavhead->fmt.ExtraData=505;        //附加的数据 单个采样数据块的大小
  wavhead->fact.ChunkID=0X74636166;     //chunk id;这里固定为“fact”;即0X74636166
  wavhead->fact.ChunkSize=4;            //子集合大小(不包括id和size)这里为4
  wavhead->fact.NumOfSamples=0xffffffff;
  wavhead->data.ChunkID=0X61746164;        //"data"
  wavhead->data.ChunkSize=0;                //数据大小,还需要计算  
}

void Recorder_Enter_RecMode(uint16_t agc)
{
   //如果是IMA ADPCM,采样率计算公式如下:
   //采样率=CLKI/256*d;       
   //假设d=0,并2倍频,外部晶振为12.288M.那么Fc=(2*12288000)/256*6=16Khz
   //如果是线性PCM,采样率直接就写采样值
  VS_WR_Cmd(SPI_BASS, 0x0000, VS_WRITE_COMMAND);
  VS_WR_Cmd(SPI_AICTRL0, 0x0c, VS_WRITE_COMMAND);//设置采样率,设置为8Khz               
  VS_WR_Cmd(SPI_AICTRL1, agc, VS_WRITE_COMMAND);//设置增益,0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍               
  VS_WR_Cmd(SPI_AICTRL2, 0x1000, VS_WRITE_COMMAND);//设置增益最大值,0,代表最大值65536=64X
  VS_WR_Cmd(SPI_AICTRL3, 2, VS_WRITE_COMMAND);
  VS_WR_Cmd(SPI_CLOCKF, 0X2000, VS_WRITE_COMMAND);  
  VS_WR_Cmd(SPI_MODE, 0x1804, VS_WRITE_COMMAND);
  mico_thread_msleep( 5 );                                //等待至少1.35ms
  VS_Load_Patch((uint16_t*)wav_plugin,40);//VS1053的WAV录音需要patch
}

读取IMA ADPCM数据时,先读高字节,在读低字节,代码入下:
        while(idx<512)         //一次读取512字节
        {                                               
          w=VS_WR_Cmd(SPI_HDAT0, 0xFFFF, VS_READ_COMMAND);
          recbuf[idx++]=w>>8;
          recbuf[idx++]=w&0XFF;
        }
        res=f_write(f_rec,recbuf,512,&bw);//写入文件

播放时寄存器配置如下:
    VS_WR_Cmd(SPI_MODE, 0x0804, VS_WRITE_COMMAND);//关闭录音
    VS_WR_Cmd(SPI_CLOCKF, 0X9800, VS_WRITE_COMMAND);//设置时钟为:12.288*7 Mhz
    VS_WR_Cmd(SPI_AUDATA, 0X1f40, VS_WRITE_COMMAND);
    VS_WR_Cmd(SPI_BASS, 0X0000, VS_WRITE_COMMAND);

测试时,生成的录音文件可以播放,但刚开始播放时会有一小段杂音,后面会将录入的声音重复播放4次,为什么会出现这种现象呢?这和压缩编码1:4的比例有关吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。