OpenEdv-开源电子网

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

求助 ALIENTEKMiniSTM32V3.1开发板+VS1053模块 播放录音的语速太快 而且声音有点失真

[复制链接]

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
发表于 2015-5-23 16:52:56 | 显示全部楼层 |阅读模式
5金钱

1、我用 原子哥的 Ministm32开发板 + vs1053模块, 按照网上的例程,能够实现录音与播放。
2、网上的例子都是将VS1053读取回来的数据以WAV的格式存储到SD卡中,然后再读取SD卡中的录音文件XXX.WAV播放。
3、我现在想把VS1053采集回来的数据以字节的方式,通过串口发送给另一块配有VS1053的板子,然后实现一块板子实时录音,一块板子实时播放。
4、我现在只在一块板子上做实验,录音键按下,就是把VS1053采集回来的数据以txt的方式存储到带有fatfs文件系统的SD卡中,命名为123.txt,录音键松开,录音完毕。然后当按下播放键,现初始化VS1053,然后发送wav头给1053,在去SD卡中读取保存的录音文件,丢给1053,现发现播放出来的录音语速特别的快,而且有点失真。搞几天了,一直没有效果。麻烦懂得大侠们指导下。万分感谢谢谢。

录音部分
[mw_shl_code=c,true]if(KEY1 == 0) { f_unlink("123.txt"); Show_Str(60,70,200,16,"Speaking",16,0); VS_Init();//初始化 recoder_enter_rec_mode(1024*4); //4倍增益 while(VS_RD_Reg(SPI_HDAT1)>>8); //等到buf 较为空闲再开始 delay_ms(1); while(KEY1 == 0) { read_pcm(); //读取VS1053 每读取一次 为512个字节 if(PCM_flag==1) { u16 i = 0,j=0; res1 = f_open(file,"123.txt", FA_OPEN_ALWAYS | FA_WRITE); if(res1 == FR_OK) { f_lseek(file, f_size(file));//将文件指针移动到文件末尾 for(j= 0;j<16;j++)//将512个字节 分成16行 每行32个 方便发送时一行读取32个字节 { for(i= 0;i<32;i++) { sprintf(wBuf,"%4d", recbuf[i+32*j]); f_puts(wBuf, file); } f_printf(file, "%s", "\n"); } f_close(file); } PCM_flag = 0; } LED0 = !LED0; }[/mw_shl_code]

播放录音代码
[mw_shl_code=c,true]if(KEY0 == 0) { u16 i = 0; while(KEY0 == 0) // { VS_Init();//初始化 VS_HD_Reset(); //硬复位 VS_Soft_Reset(); //软复位 VS_Set_Vol(220); //设置音量 VS_Set_All(); //设置音量等信息 send_wav_header(); //发送wav头 VS_SPI_SpeedHigh(); //设置速度 delay_ms(2); res2 = f_open(file,"123.txt", FA_OPEN_ALWAYS | FA_READ| FA_WRITE); if(res2 == FR_OK) { while(f_gets(rBuf, 200,file))//去123.txt中一行一行读取数据 直到数据读取完毕 { for(i= 0;i<32;i++)//将读取出来的包含32个字节的字符串 分解为32个字节数值 { sendBuf = atoi(&rBuf[i*4]);//将字符串转化为 数值 } VS_Send_MusicData(sendBuf);//发送32个字节 } f_close(file); } printf("发送完毕\r\n"); } }[/mw_shl_code]
wav头
 //文件头44字节
u8 wav_header[64] = {0X52,0X49,0X46,0X46,//="RIFF"
                    //0XD4,0X86,0X01,0X00,//文件总长 - 8
                      0XF7,0XFF,0XFF,0XFF,//文件总长 - 8
                    0X57,0X41,0X56,0X45,//"WAVE"
                     0X66,0X6D,0X74,0X20,//"fmt"标记
 
                    0X10,0X00,0X00,0X00, //0x10
                    0X01,0X00,//0x01
                    0X01,0X00,//0x01
                    0X40,0X1F,0X00,0X00,//采样率为8KHZ
                    0X80,0X3E,0X00,0X00,//2*采样率
                     0X02,0X00,//0X02
                     0X10,0X00,//0X10
                     0X64,0X61,0X74,0X61,//"data"
                    0XD3,0XFF,0XFF,0XFF
                    // 0XA0,0X86,0X01,0X00
                     };//WAV文件头 



[mw_shl_code=c,true]//激活PCM 录音模式 //agc:0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍 void recoder_enter_rec_mode(u16 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_WR_Cmd(SPI_AICTRL0,8000); //设置采样率,设置为8Khz VS_WR_Cmd(SPI_AICTRL1,agc); //设置增益,0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍 VS_WR_Cmd(SPI_AICTRL2,0); //设置增益最大值,0,代表最大值65536=64X VS_WR_Cmd(SPI_AICTRL3,6); //左通道(MIC单声道输入) VS_WR_Cmd(SPI_CLOCKF,0X2000); //设置VS10XX的时钟,MULT:2倍频;ADD:不允许;CLK:12.288Mhz VS_WR_Cmd(SPI_MODE,0x1804); //MIC,录音激活 delay_ms(5); //等待至少1.35ms VS_Load_Patch((u16*)wav_plugin,40);//VS1053的WAV录音需要patch } //**********************jiaqing*************** //读取PCM,将512字节的数据存储到数据缓冲区recbuf //**********************jiaqing*************** void read_pcm(void) { u16 w; //数据长度 u16 idx=0; w=VS_RD_Reg(SPI_HDAT1); if((w>=256)&&(w<896)) { PCM_flag = 1; idx=0; while(idx<512) //一次读取512字节 { w=VS_RD_Reg(SPI_HDAT0); recbuf[idx++]=w&0XFF; recbuf[idx++]=w>>8; }; } }[/mw_shl_code]



test.rar

3.17 MB, 下载次数: 602

最佳答案

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

回复【9楼】正点原子: --------------------------------- 您好原子哥,感谢您这几天的帮助,我刚刚找到语速加快的原因了,之前进入误区了,一直以为都是播放的问,其实是我录音部分出现了问题,现已解决。语速不快了正常了。 但是有出现一个新的问题就是 播放的录音前2秒左右以内都是正常的(非常的清晰),大约2s以后播放的录音声音有点失真(好像还有点杂音),但是语速都是对的了。不知道这个是什么原因?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-23 16:52:57 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
您好原子哥,感谢您这几天的帮助,我刚刚找到语速加快的原因了,之前进入误区了,一直以为都是播放的问,其实是我录音部分出现了问题,现已解决。语速不快了正常了。

但是有出现一个新的问题就是 播放的录音前2秒左右以内都是正常的(非常的清晰),大约2s以后播放的录音声音有点失真(好像还有点杂音),但是语速都是对的了。不知道这个是什么原因?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165580
金钱
165580
注册时间
2010-12-1
在线时间
2118 小时
发表于 2015-5-23 23:30:18 | 显示全部楼层
把声音存成.bin吧,你这样转换成字符串,又转换回来,真心看着蛋痛.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-24 09:03:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
非常感谢,原子哥的回复,会因为我这样来回转换浪费时间,而导致播放的录音语速加快吗?我试试存储成bin然后试试!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165580
金钱
165580
注册时间
2010-12-1
在线时间
2118 小时
发表于 2015-5-24 23:16:13 | 显示全部楼层
回复【3楼】lixiaoxu186:
---------------------------------
拿到应该也不会,变快的话,肯定是wav解码码率没设置好
也就是数据头,没搞好。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-25 12:02:23 | 显示全部楼层

您好,原子哥,您说的数据头的解码率没设置好,就是WAV头没有设置对吧。
这个是我的WAV头

[mw_shl_code=c,true]wav头 //文件头44字节 u8 wav_header[64] = {0X52,0X49,0X46,0X46,//="RIFF" 0XF7,0XFF,0XFF,0XFF,//文件总长 - 8 0X57,0X41,0X56,0X45,//"WAVE" 0X66,0X6D,0X74,0X20,//"fmt"标记 0X10,0X00,0X00,0X00, //0x10 0X01,0X00,//0x01 0X01,0X00,//0x01 0X40,0X1F,0X00,0X00,//采样率为8KHZ 0X80,0X3E,0X00,0X00,//2*采样率 0X02,0X00,//0X02 0X10,0X00,//0X10 0X64,0X61,0X74,0X61,//"data" 0XD3,0XFF,0XFF,0XFF//文件总长 - 44 };//WAV文件头 [/mw_shl_code]
下面是我按您的例子配置的
[mw_shl_code=c,true]//激活PCM 录音模式 //agc:0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍 void recoder_enter_rec_mode(u16 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_WR_Cmd(SPI_AICTRL0,8000); //设置采样率,设置为8Khz VS_WR_Cmd(SPI_AICTRL1,agc); //设置增益,0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍 VS_WR_Cmd(SPI_AICTRL2,0); //设置增益最大值,0,代表最大值65536=64X VS_WR_Cmd(SPI_AICTRL3,6); //左通道(MIC单声道输入) VS_WR_Cmd(SPI_CLOCKF,0X2000); //设置VS10XX的时钟,MULT:2倍频;ADD:不允许;CLK:12.288Mhz VS_WR_Cmd(SPI_MODE,0x1804); //MIC,录音激活 delay_ms(5); //等待至少1.35ms VS_Load_Patch((u16*)wav_plugin,40);//VS1053的WAV录音需要patch }[/mw_shl_code]
 
麻烦您看下,还有那些我没注意到的吗?
非常期待您的答复~


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165580
金钱
165580
注册时间
2010-12-1
在线时间
2118 小时
发表于 2015-5-25 17:26:27 | 显示全部楼层
回复【5楼】lixiaoxu186:
---------------------------------
录音是单声道,你存储的wav头,是不是立体声?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-25 18:06:38 | 显示全部楼层
感谢您的答复!
您好原子,您说的立体声 是我红色的部分吗?
wav头
//文件头44字节
u8 wav_header[64] = {0X52,0X49,0X46,0X46,//="RIFF"
                     0XF7,0XFF,0XFF,0XFF,//文件总长 - 8
                     0X57,0X41,0X56,0X45,//"WAVE"
                     0X66,0X6D,0X74,0X20,//"fmt"标记
                     0X10,0X00,0X00,0X00, //0x10即块大小为16
                     0X01,0X00,//0x01 编码方式
                     0X01,0X00,//0x01标记声道数,这里值为1。1代表单声道,2代表双声道。
                     0X40,0X1F,0X00,0X00,//采样率为8KHZ
                     0X80,0X3E,0X00,0X00,//2*采样率
                     0X02,0X00,//0X02采样一次占字节数 ,也是little-endian的,这里是两个字节。声道数*量化数/8=1*16/8=2(字节)
                     0X10,0X00,//0X10量化数,也就是每个采样需要的bit数,也是little-endian的,所以这里是16位
                     0X64,0X61,0X74,0X61,//"data"
                     0XD3,0XFF,0XFF,0XFF//文件总长 - 44
                     };//WAV文件头

下面是我在您的MiniSTM32例程里 抓取出来的WAV头
[mw_shl_code=c,true]wavhead->riff.ChunkID: 0x46 0x46 0x49 0x52 wavhead->riff.ChunkSize:0x01 0x36 0x24 wavhead->riff.Format: 0x45 0x56 0x41 0x57 wavhead->fmt.ChunkID: 0x20 0x74 0x6d 0x66 wavhead->fmt.ChunkSize:0x10 wavhead->fmt.AudioFormat:0x01 wavhead->fmt.NumOfChannels:0x01 wavhead->fmt.SampleRate: 0x1f 0x40 wavhead->fmt.ByteRate:0x3e 0x80 wavhead->fmt.BlockAlign:0x2 wavhead->fmt.BitsPerSample:0x10 wavhead->data.ChunkID:0x61 0x74 0x61 0x64 wavhead->data.ChunkSize:0x01 0x36 0x00[/mw_shl_code]
对比了下  除了little-endian存储格式区别外,别的地方没有发现不妥的地方。所以很是郁闷,搞了几天,就是录音语速特别地快,播放的录音内容倒是完整的。难道是网上说的 我发给VS1053的数据流不顺畅,断流了?

回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-25 18:08:07 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
如楼上的WAV头 
我与原子哥不同的地方就是
数据块的记录方式是little-endian字节顺序
今天原子哥这么早回复,每天都看原子哥23点以后来回复大家的帖子,帮大家解答疑难问题,原子哥辛苦了

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165580
金钱
165580
注册时间
2010-12-1
在线时间
2118 小时
发表于 2015-5-26 00:08:27 | 显示全部楼层
回复【7楼】lixiaoxu186:
---------------------------------
直接打开我们例程录制的wav文件,用winhex看看wav头数据,和你定义的区别吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-26 09:13:10 | 显示全部楼层
您好原子哥,我把例程里的WAV文件用winhex 打开查看了下,除了文件长度-8文件长度-44这八个字节除外,其他的都是一样的
截图



下面的是我的WAV头
[mw_shl_code=c,true]//文件头44字节 u8 wav_header[64] = {0X52,0X49,0X46,0X46,//="RIFF" 0XF7,0XFF,0XFF,0XFF,//文件总长 - 8 0X57,0X41,0X56,0X45,//"WAVE" 0X66,0X6D,0X74,0X20,//"fmt"标记 0X10,0X00,0X00,0X00, //0x10 0X01,0X00,//0x01 0X01,0X00,//0x01 0X40,0X1F,0X00,0X00,//采样率为8KHZ 0X80,0X3E,0X00,0X00,//2*采样率 0X02,0X00,//0X02 0X10,0X00,//0X10 0X64,0X61,0X74,0X61,//"data" 0XD3,0XFF,0XFF,0XFF//文件总长 - 44 };//WAV文件头 [/mw_shl_code]
wav头好像没有不妥,但是就是播放录音语速飞快。还有那些我没有注意到的?难道是,录音部分出了问题?

这是我录音部分的配置 及 读取VS1053的代码
[mw_shl_code=c,true]//激活PCM 录音模式 //agc:0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍 void recoder_enter_rec_mode(u16 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_WR_Cmd(SPI_AICTRL0,8000); //设置采样率,设置为8Khz VS_WR_Cmd(SPI_AICTRL1,agc); //设置增益,0,自动增益.1024相当于1倍,512相当于0.5倍,最大值65535=64倍 VS_WR_Cmd(SPI_AICTRL2,0); //设置增益最大值,0,代表最大值65536=64X VS_WR_Cmd(SPI_AICTRL3,6); //左通道(MIC单声道输入) VS_WR_Cmd(SPI_CLOCKF,0X2000); //设置VS10XX的时钟,MULT:2倍频;ADD:不允许;CLK:12.288Mhz VS_WR_Cmd(SPI_MODE,0x1804); //MIC,录音激活 delay_ms(5); //等待至少1.35ms VS_Load_Patch((u16*)wav_plugin,40);//VS1053的WAV录音需要patch } //**********************jiaqing*************** //读取PCM,将512字节的数据存储到数据缓冲区recbuf //**********************jiaqing*************** void read_pcm(void) { u16 w; //数据长度 u16 idx=0; w=VS_RD_Reg(SPI_HDAT1); if((w>=256)&&(w<896)) { PCM_flag = 1; idx=0; while(idx<512) //一次读取512字节 { w=VS_RD_Reg(SPI_HDAT0); recbuf[idx++]=w&0XFF; recbuf[idx++]=w>>8; }; } }[/mw_shl_code] [mw_shl_code=c,true] 期待您的答复,您的答复就是我学习的动力~ [/mw_shl_code]
回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-26 09:20:43 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
每天最激动的时候,就是刷新论坛,看到站内短信的“小信封”在闪烁!再次感谢原子哥对新人的帮助!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165580
金钱
165580
注册时间
2010-12-1
在线时间
2118 小时
发表于 2015-5-27 00:52:44 | 显示全部楼层
回复【12楼】lixiaoxu186:
---------------------------------
是不是存储出问题了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-27 08:02:41 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
谢谢原子哥。存储都是一个函数,最奇怪的就是前2秒左右一点问题没有。大约2秒过后,声音就有点失声,带尾音,出现这种情况会不会是在录音是存储时间长了,造成读取数据不及时,或者发送时断流,我在看看我的存储函数。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165580
金钱
165580
注册时间
2010-12-1
在线时间
2118 小时
发表于 2015-5-27 23:20:42 | 显示全部楼层
回复【14楼】lixiaoxu186:
---------------------------------
得慢慢分析了,呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

36

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-5-21
在线时间
6 小时
 楼主| 发表于 2015-5-28 07:51:01 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
恩, 非常感谢原子哥最近的帮助!
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-12-6
在线时间
0 小时
发表于 2015-12-7 14:30:15 | 显示全部楼层
遇到同样问题,播放速度很快,请楼主帮忙解答如何处理,谢谢。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-12-6
在线时间
0 小时
发表于 2015-12-9 14:51:47 | 显示全部楼层
楼主,请教呀
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-1-18
在线时间
46 小时
发表于 2016-1-21 10:53:45 | 显示全部楼层
我也遇到这样问题了,只能录制两秒,或者录制文件打不开,有的文件酷狗可以解码,芯片播放卡死!
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2015-1-24
在线时间
21 小时
发表于 2016-11-21 16:08:58 | 显示全部楼层
lixiaoxu186 发表于 2015-5-23 16:52
回复【9楼】正点原子:
---------------------------------
您好原子哥,感谢您这几天的帮助,我刚刚找到语 ...

能说一下是什么问题导致的吗?是如何解决的呢?
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-2-20
在线时间
10 小时
发表于 2017-2-26 13:41:21 | 显示全部楼层
楼主,能不能说一下是因为什么原因出现播放速度快这种情况的,我也遇到了一样的问题,求教。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-9-22 16:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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