硬件参考战舰板子的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的比例有关吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>