OpenEdv-开源电子网

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

VS1053板子在录音时有突突的杂音

[复制链接]

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
发表于 2016-10-28 20:32:35 | 显示全部楼层 |阅读模式
5金钱
大家好!我在用VS1053做MP3语音处理时发现录音时杂音很大,一直有突突的声音,不知道什么原因?请大家能给点处理意见。谢谢!

最佳答案

查看完整内容[请看2#楼]

已经解决,是电源质量的问题,下午把电源做好滤波就好多了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
 楼主| 发表于 2016-10-28 20:32:36 | 显示全部楼层
已经解决,是电源质量的问题,下午把电源做好滤波就好多了。
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-10-29 16:07:58 | 显示全部楼层
把1053B的初始化代码贴出来
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-10-29 16:09:17 | 显示全部楼层
VS1053B和VS1063A的编码和解码我都做通了,没有任何的问题。
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
 楼主| 发表于 2016-10-29 17:21:08 | 显示全部楼层

void recoder_enter_rec_mode(u16 agc)
{
          u16 temp;
                //如果是IMA ADPCM,采样率计算公式如下:
                //采样率=CLKI/256*d;       
                //假设d=0,并2倍频,外部晶振为12.288M.那么Fc=(2*12288000)/256*6=16Khz
                //如果是线性PCM,采样率直接就写采样值
           VS_WR_Cmd(SPI_BASS,0x0000);   
                VS_WR_Cmd(SPI_AICTRL0,8000);        //设置采样率,设置为8Khz
                VS_WR_Cmd(SPI_AICTRL1,agc);    //2016.10.29xuyan                //设置增益,0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍       
                //VS_WR_Cmd(SPI_AICTRL2,0);                //设置增益最大值,0,代表最大值65536=64X
    VS_WR_Cmd(SPI_AICTRL2,0);      //2016.10.29xuyan
                VS_WR_Cmd(SPI_AICTRL3,2);
                //VS_WR_Cmd(SPI_AICTRL3,6);                //左通道(MIC单声道输入)
                VS_WR_Cmd(SPI_CLOCKF,0xC000);  
                //VS_WR_Cmd(SPI_CLOCKF,0X2000);        //设置VS10XX的时钟,MULT:2倍频;ADD:不允许;CLK:12.288Mhz
          //VS_WR_Cmd(SPI_AUDATA,8000);  
                //VS_WR_Cmd(SPI_MODE,0x1804);                //MIC,录音激活
                VS_WR_Cmd(SPI_MODE,0x0804);       //ADPCM录音激活
                temp=VS_RD_Reg(SPI_MODE);
    //VS_WR_Cmd(SPI_MODE,temp|SM_RESET|SM_ADPCM|SM_LINE_IN1);
          VS_WR_Cmd(SPI_MODE,temp|SM_RESET|SM_ADPCM);
                delay_ms(5);                                        //等待至少1.35ms
                VS_Load_Patch((u16*)wav_plugin,40);//VS1053的WAV录音需要patch
}
void recoder_wav_init(__WaveHeader* wavhead,u8 SetType) //初始化WAV头(44个字节)                          
{
                        wavhead->riff.ChunkID=0X46464952;        //"RIFF"
                  if(SetType==RecordMode)
                        {
                                wavhead->riff.ChunkSize=0;                        //还未确定,最后需要计算
                        }
                        if(SetType==WirelessMode)
                        {
                                wavhead->riff.ChunkSize=0xffffffff;                        //还未确定,最后需要计算
                        }
                        wavhead->riff.Format=0X45564157;         //"WAVE"
                        wavhead->fmt.ChunkID=0X20746D66;         //"fmt "
                        //wavhead->fmt.ChunkSize=16;                         //大小为16个字节(4个字节)
                        wavhead->fmt.ChunkSize=20; //大小为20个字节
                        wavhead->fmt.AudioFormat=0X11;  //0X01,表示PCM;0X11,表示IMA ADPCM
                        //wavhead->fmt.AudioFormat=0X01;                 //0X01,表示PCM;0X01,表示IMA ADPCM(2个字节)
                        wavhead->fmt.NumOfChannels=1;                //单声道(2个字节)
                        wavhead->fmt.SampleRate=8000;                //8Khz采样率 采样速率(4个字节)
                        wavhead->fmt.ByteRate=wavhead->fmt.SampleRate*256/505;//B=Fs*C*256/505
                        wavhead->fmt.BlockAlign=256; //块大小,256个字节为一个块
                        wavhead->fmt.BitsPerSample=4; //4位ADPCM
                        //wavhead->fmt.ByteRate=wavhead->fmt.SampleRate*2;//16位,即4个字节
                        //wavhead->fmt.BlockAlign=2;                        //块大小,2个字节为一个块(2个字节)
                        //wavhead->fmt.BitsPerSample=16;                //16位PCM(2个字节)
                        wavhead->fmt.ByteExtraData=2;
                     wavhead->fmt.ExtraData=505;
                     wavhead->fact.ChunkID=0x74636166;   //"fact"
                     wavhead->fact.ChunkSize=4;
                     wavhead->fact.NumOfSamples=0;
                        wavhead->data.ChunkID=0X61746164;        //"data"(4个字节)
                        if(SetType==RecordMode)
                        {
                                wavhead->data.ChunkSize=0;                                //数据大小,还需要计算
                        }
                        if(SetType==WirelessMode)
                        {
                                wavhead->data.ChunkSize=0xffffffff;                        //数据大小,还需要计算
                        }
}
                                       
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
 楼主| 发表于 2016-10-29 17:21:44 | 显示全部楼层
我最怕是PCB板子的铺地没有做好。
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-10-29 17:27:00 | 显示全部楼层
        SPI1_SetSpeed(SPI_BaudRatePrescaler_16);//64);//低速
       
           VS10X3_WR_Cmd(0x02, 0x0000);   
        VS10X3_WR_Cmd(0x0C, 8000);      //设置采样率,设置为8Khz
        VS10X3_WR_Cmd(0x0D, agc);       //设置增益,0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍       
        VS10X3_WR_Cmd(0x0E, 0);         //设置增益最大值,0,代表最大值65536=64X
        VS10X3_WR_Cmd(0x0F, 6);         //左通道(MIC单声道输入)
        VS10X3_WR_Cmd(0x03, 0x2000);    //设置VS10XX的时钟,MULT:2倍频;ADD:不允许;CLK:12.288Mhz
        VS10X3_WR_Cmd(0x00, 0x1804);    //MIC,录音激活   
        vTaskDelay(5);                  //等待至少1.35ms
       
        VS_Load_Patch((u16*)wav_plugin, 40);//VS1053的WAV录音需要patch

static const u16 wav_plugin[40]=/* Compressed plugin */
{
        0x0007, 0x0001, 0x8010, 0x0006, 0x001c, 0x3e12, 0xb817, 0x3e14, /* 0 */
        0xf812, 0x3e01, 0xb811, 0x0007, 0x9717, 0x0020, 0xffd2, 0x0030, /* 8 */
        0x11d1, 0x3111, 0x8024, 0x3704, 0xc024, 0x3b81, 0x8024, 0x3101, /* 10 */
        0x8024, 0x3b81, 0x8024, 0x3f04, 0xc024, 0x2808, 0x4800, 0x36f1, /* 18 */
        0x9811, 0x0007, 0x0001, 0x8028, 0x0006, 0x0002, 0x2a00, 0x040e,  
};

这是我调通的初始化代码,你参考下,录音没有任何问题,播放的效果也很好。
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-10-29 17:30:34 | 显示全部楼层
        //禁止功放
        GPIO_ResetBits(GPIOA, GPIO_Pin_1);
       
        //开始录音
        VS10X3_enter_rec_mode(4096);//参数:设置增益,0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍
        在开始录音前,我是把功放禁止了
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-10-29 17:32:54 | 显示全部楼层
//初始化WAV头               
void WAV_Header_init(_WAV_Header* wavhead)           
{
        wavhead->riff.ChunkID = 0x46464952;    //"RIFF"
        wavhead->riff.ChunkSize = 0;           //还未确定,最后需要计算
        wavhead->riff.Format = 0x45564157;     //"WAVE"
        wavhead->fmt.ChunkID = 0x20746D66;     //"fmt "
        wavhead->fmt.ChunkSize = 16;           //大小为16个字节
        wavhead->fmt.AudioFormat = 0x01;       //0x01,表示PCM
        wavhead->fmt.NumOfChannels = 1;        //单声道
        wavhead->fmt.SampleRate = 8000;        //8Khz采样率 采样速率
        wavhead->fmt.ByteRate = wavhead->fmt.SampleRate*2;//16位,即2个字节
        wavhead->fmt.BlockAlign = 2;           //块大小,2个字节为一个块
        wavhead->fmt.BitsPerSample = 16;       //16位PCM
           wavhead->data.ChunkID = 0x61746164;    //"data"
        wavhead->data.ChunkSize = 0;           //数据大小,还需要计算  
}
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1836
金钱
1836
注册时间
2013-7-29
在线时间
278 小时
 楼主| 发表于 2016-10-29 17:39:45 | 显示全部楼层
我用的是ADPCM,初始化没有问题,我在想是不是我电源的问题,我这里有一个无线发射模块,估计是这个模块发送数据时把电源带的有波动了。
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
发表于 2016-11-21 16:54:49 | 显示全部楼层
super910906 发表于 2016-10-29 16:09
VS1053B和VS1063A的编码和解码我都做通了,没有任何的问题。

你好,我现在也在搞Vs1053,现在遇到的问题是,录音能录,但是播出来的时候就是很快,应该是原来的2倍速。配置那些都和你贴出来的代码一样,很是不解。望解答
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2016-11-22 09:44:22 | 显示全部楼层
lss1330 发表于 2016-11-21 16:54
你好,我现在也在搞Vs1053,现在遇到的问题是,录音能录,但是播出来的时候就是很快,应该是原来的2倍速 ...

那就是播放代码有问题,你贴出来吧。
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
发表于 2016-11-22 13:58:14 | 显示全部楼层
super910906 发表于 2016-11-22 09:44
那就是播放代码有问题,你贴出来吧。

[mw_shl_code=c,true]void vs10xx_play(void)
{
        int status;
        int fd;
        char testbuf[512] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
        uint32_t file_size = 0;
        int count = 0;
        Mp3Reset();
        Mp3SoftReset();//里面包含VS1003B_WriteCMD(SPI_CLOCKF, 0x9800);
        VS1003B_SetVirtualSurroundOn();
        VS1003B_WriteCMD(SPI_DECODE_TIME,0x0000);     //复位解码器时间
        VS1003B_WriteCMD(SPI_DECODE_TIME,0x0000);
        VS_Load_Patch((uint16_t *)wav_plugin, 40);     //加载配置
        INFOF(("register SPI_CLOCKF: 0x%x\n", Mp3ReadRegister(SPI_CLOCKF)));
        INFOF(("play strat\n"));
        if ((fd = open(FILE,  O_RDWR, 777))  < 0) {
                INFOF(("open error: 0x%x\n", fd));
                return;
        }

        while(1){
                status = read( fd, testbuf, 512 );
//                INFOF(("sizeof (buffer): %d\n",  sizeof (buffer)));
                if ( status > 0 )
                {
                        count = 0;
                        Mp3DeselectControl();
                        Mp3SelectData();

                        while ( count < 512)  
                        {
                                if ( MP3_DREQ != 0 )           
                                {
                                        VS1003B_WriteDAT( testbuf + count, 32);
                                        count += 32;
                                }
                        }
                        Mp3DeselectData();

                        led_toggle(0);
                        if (gpio_get(VKEY2) == 0) {
                                while (gpio_get(VKEY2) == 0 ){
                                        mdelay(200);
                                }
                                INFOF(("break\n"));
                                close(fd);
                                break;
                        }
                }
                else {
                        INFOF((FILE" play over\n"));
                        close(fd);
                        VS1003B_Fill2048Zero();
                        break;
                }
        }
}[/mw_shl_code]
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
发表于 2016-11-22 14:05:41 | 显示全部楼层
super910906 发表于 2016-11-22 09:44
那就是播放代码有问题,你贴出来吧。

还有一个问题是,正弦测试是听到一声还是两声,我用1003的时候稳定的两声,但是用1053就只能听到一声。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 14:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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