OpenEdv-开源电子网

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

求助!! 使用原子哥的录音机例程+ PWM DAC的方式来播放WAV的音乐

[复制链接]

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-4-24
在线时间
56 小时
发表于 2017-12-28 09:32:46 | 显示全部楼层 |阅读模式
10金钱
我用原子哥的录音机例程 获取到wav格式的文件,保存到SD卡中,然后用PWM DAC的方式来播放音乐,喇叭直接用板子上的,PDC 和 AIN两个引脚也接在一起了,但是播放的时候WAV文件的数据用串口看是有的,但是没有任何声音,请问要从哪里调整?

最佳答案

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

参考我们战舰板的USB DAC例程。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-28 09:32:47 | 显示全部楼层
进击的咸鱼 发表于 2018-1-2 10:33
想了老半天也没想出来怎么转换,试了几种办法
直接x/256,会有一堆杂音
x>>8 + 0x80 也不行能分辨出声 ...

参考我们战舰板的USB DAC例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-4-24
在线时间
56 小时
 楼主| 发表于 2017-12-28 09:34:10 | 显示全部楼层
本帖最后由 进击的咸鱼 于 2017-12-28 10:42 编辑

[mw_shl_code=c,true]u8 pwm_play_wav(u8 *pname)
{         
         FIL* fmp3;
    u16 br;
        u8 res,rval=0;         
        u8 *databuf;                              
        u16 i=0;                  
        u8 n;
        
        fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//éêÇëÄú′æ
        databuf=(u8*)mymalloc(SRAMIN,512);                //¿a±ù512×Ö½úμÄÄú′æÇøóò
        if(databuf==NULL||fmp3==NULL)rval=0XFF ;//Äú′æéêÇëê§°ü.
        if(rval==0)
        {         
                printf("in\r\n");
                VS_HD_Reset();                           //ó2¸′λ
                VS_Soft_Reset();                  //èí¸′λ
                VS_Set_All();                        //éèÖÃòôá¿μè2Îêy                          
                VS_Reset_DecodeTime();        //¸′λ½aÂëê±¼ä                    
                res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//′ò¿aÎļt         
                 if(res==0)//′ò¿a3é1|.
                {
                        VS_SPI_SpeedHigh();        //¸ßËù        
                        //VS_SPK_Set(1);
                        while(rval==0)
                        {
                                res=f_read(fmp3,databuf,512,(UINT*)&br);//¶á3ö4096¸ö×Ö½ú  
                                i=0;
                                do//Ö÷2¥·ÅÑ-»·
                            {         
//                                        if(VS_Send_MusicData(databuf+i)==0)i+=32;//¸øVS10XX·¢ËíòôÆμêy¾Y
//                                         else recoder_show_time(VS_Get_DecodeTime());//ÏÔê¾2¥·Åê±¼ä         
                                       
                                TIM_SetCompare1(TIM1, databuf[i++]);
                                       
                                }while(i<512);//&#209;-&#187;··¢&#203;í4096&#184;&#246;×&#214;&#189;ú
                                
                                if(br!=512||res!=0)
                                {
                                        rval=0;
                                        printf("&#182;áíê\r\n");
                                        break;//&#182;áíêá&#203;.                  
                                }                                                         
                        }
                        f_close(fmp3);
                }else rval=0XFF;//3&#246;&#207;&#214;′í&#206;ó
                VS_SPK_Set(0);        //1&#216;±&#213;°&#229;&#212;&#216;à&#174;°è
        }               
  myfree(SRAMIN,fmp3);
        myfree(SRAMIN,databuf);
        return rval;                                                
}[/mw_shl_code]
PWM的配置:TIM1_PWM_Init(255, 71);        //用的是4K的频率


录音的配置:
[mw_shl_code=c,true]//&#188;¤&#187;&#238CM &#194;&#188;ò&#244;&#196;£ê&#189;
//agc:0,×&#212;&#182;ˉ&#212;&#246;ò&#230;.1024&#207;àμ±óú1±&#182;,512&#207;àμ±óú0.5±&#182;,×&#238;′ó&#214;μ65535=64±&#182;                  
void recoder_enter_rec_mode(u16 agc)
{
        //è&#231;1&#251;ê&#199;IMA ADPCM,2é&#209;ù&#194;ê&#188;&#198;&#203;&#227;1&#171;ê&#189;è&#231;&#207;&#194;:
        //2é&#209;ù&#194;ê=CLKI/256*d;       
        //&#188;ùéèd=0,2¢2±&#182;&#198;μ,ía2&#191;&#190;§&#213;&#241;&#206;a12.288M.&#196;&#199;&#195;′Fc=(2*12288000)/256*6=16Khz
        //è&#231;1&#251;ê&#199;&#207;&#223;D&#212CM,2é&#209;ù&#194;ê&#214;±&#189;ó&#190;íD′2é&#209;ù&#214;μ
           VS_WR_Cmd(SPI_BASS,0x0000);   
        VS_WR_Cmd(SPI_AICTRL0,4000);        //éè&#214;&#195;2é&#209;ù&#194;ê,éè&#214;&#195;&#206;a8Khz
        VS_WR_Cmd(SPI_AICTRL1,agc);                //éè&#214;&#195;&#212;&#246;ò&#230;,0,×&#212;&#182;ˉ&#212;&#246;ò&#230;.1024&#207;àμ±óú1±&#182;,512&#207;àμ±óú0.5±&#182;,×&#238;′ó&#214;μ65535=64±&#182;       
        VS_WR_Cmd(SPI_AICTRL2,0);                //éè&#214;&#195;&#212;&#246;ò&#230;×&#238;′ó&#214;μ,0,′ú±í×&#238;′ó&#214;μ65536=64X
        VS_WR_Cmd(SPI_AICTRL3,6);                //×óí¨μà(MICμ¥éùμàê&#228;è&#235;)
        VS_WR_Cmd(SPI_CLOCKF,0X2000);        //éè&#214;&#195;VS10XXμ&#196;ê±&#214;ó,MULT:2±&#182;&#198;μ;ADD:2&#187;&#212;êDí;CLK:12.288Mhz
        VS_WR_Cmd(SPI_MODE,0x1804);                //MIC,&#194;&#188;ò&#244;&#188;¤&#187;&#238;   
        delay_ms(5);                                        //μè′y&#214;áéù1.35ms
        VS_Load_Patch((u16*)wav_plugin,40);//VS1053μ&#196;WAV&#194;&#188;ò&#244;Dèòapatch
}

//3&#245;ê&#188;&#187;ˉWAVí·.
void recoder_wav_init(__WaveHeader* wavhead) //3&#245;ê&#188;&#187;ˉWAVí·                          
{
        wavhead->riff.ChunkID=0X46464952;        //"RIFF"
        wavhead->riff.ChunkSize=0;                        //&#187;1&#206;′è·&#182;¨,×&#238;oóDèòa&#188;&#198;&#203;&#227;
        wavhead->riff.Format=0X45564157;         //"WAVE"
        wavhead->fmt.ChunkID=0X20746D66;         //"fmt "
        wavhead->fmt.ChunkSize=16;                         //′óD&#161;&#206;a16&#184;&#246;×&#214;&#189;ú
        wavhead->fmt.AudioFormat=0X01;                 //0X01,±íê&#190CM;0X01,±íê&#190;IMA ADPCM
        wavhead->fmt.NumOfChannels=1;                //μ¥éùμà
        wavhead->fmt.SampleRate=4000;                //8Khz2é&#209;ù&#194;ê 2é&#209;ù&#203;ù&#194;ê
        wavhead->fmt.ByteRate=wavhead->fmt.SampleRate*2;//16&#206;&#187;,&#188;′2&#184;&#246;×&#214;&#189;ú
        wavhead->fmt.BlockAlign=2;                        //&#191;é′óD&#161;,2&#184;&#246;×&#214;&#189;ú&#206;aò&#187;&#184;&#246;&#191;é
        wavhead->fmt.BitsPerSample=16;                //16&#206;&#187CM
           wavhead->data.ChunkID=0X61746164;        //"data"
        wavhead->data.ChunkSize=0;                        //êy&#190;Y′óD&#161;,&#187;1Dèòa&#188;&#198;&#203;&#227;  
}[/mw_shl_code]

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-29 00:47:08 | 显示全部楼层
PWM DAC是8位的,值只能是0~255,而WAV数据,一般是16位的,值是-32767~32767,自己要做好变换。
回复

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-4-24
在线时间
56 小时
 楼主| 发表于 2017-12-29 09:17:36 | 显示全部楼层
本帖最后由 进击的咸鱼 于 2017-12-29 09:18 编辑
正点原子 发表于 2017-12-29 00:47
PWM DAC是8位的,值只能是0~255,而WAV数据,一般是16位的,值是-32767~32767,自己要做好变换。

用8位的PWM输出16位的数据,不知道怎么操作
但是可不可以把WAV的数据改成8位的,不过我改成8位之后,在电脑上只有杂音了

[mw_shl_code=c,true]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=4000;                //4K采样率
         wavhead->fmt.ByteRate=wavhead->fmt.SampleRate;//表示每秒的数量,通道数*每秒样本数*每个样本的数据位数/8,这里是1*4000* (8/8)
         wavhead->fmt.BlockAlign=1;                        //块大小,其值为通道数*每个样本的数据位置/8
         wavhead->fmt.BitsPerSample=8;                //采样的大小,每样本数据位数
           wavhead->data.ChunkID=0X61746164;        //"data"
         wavhead->data.ChunkSize=0;                        //数据区开头以后的数据总数,也就是音频数据的大小[/mw_shl_code]

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-30 01:31:49 | 显示全部楼层
进击的咸鱼 发表于 2017-12-29 09:17
用8位的PWM输出16位的数据,不知道怎么操作
但是可不可以把WAV的数据改成8位的,不过我改成8位之后,在 ...

你自己去缩,不是直接改这个。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-4-24
在线时间
56 小时
 楼主| 发表于 2018-1-2 10:33:53 | 显示全部楼层
本帖最后由 进击的咸鱼 于 2018-1-2 15:52 编辑
正点原子 发表于 2017-12-30 01:31
你自己去缩,不是直接改这个。。。。

想了老半天也没想出来怎么转换,试了几种办法
直接x/256,会有一堆杂音
x>>8 + 0x80 也不行能分辨出声音但是中间会夹杂着很多噪音,可以的话,请原子哥指点怎么转换


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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