OpenEdv-开源电子网

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

wm8978 配置成单声道问题,录音不正常

[复制链接]

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2018-5-29
在线时间
136 小时
发表于 2019-12-26 18:12:07 | 显示全部楼层 |阅读模式
1金钱
wm8978 配置成单声道问题   录音播放不正常,开发板播放是正常的,
//初始化WAV头.
void recoder_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=16;    //大小为16个字节
wavhead->fmt.AudioFormat=0X01;   //0X01,表示PCM;0X01,表示IMA ADPCM
wavhead->fmt.NumOfChannels=1;  //双声道
wavhead->fmt.SampleRate=16000;  //16Khz采样率 采样速率
wavhead->fmt.ByteRate=wavhead->fmt.SampleRate*2;//字节速率=采样率*通道数*(ADC位数/8)
wavhead->fmt.BlockAlign=2;   //块大小=通道数*(ADC位数/8)
wavhead->fmt.BitsPerSample=16;  //16位PCM
wavhead->data.ChunkID=0X61746164; //"data"
wavhead->data.ChunkSize=0;   //数据大小,还需要计算  
}


最佳答案

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

我们例程是双声道设计的。你要单声道有很多办法,第一个,推送给右声道的数据,直接用左声道的数据替换。第二个,设置WM8978寄存器,将左声道数据也放到右声道去。第三个,使用WM8978的MONO输出。最后,如果你的WAV就是MONO的,建议读取数据,将数复制成2份,分别输出给左右声道,这样听起来也是单声道的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-12-26 18:12:08 | 显示全部楼层
我们例程是双声道设计的。你要单声道有很多办法,第一个,推送给右声道的数据,直接用左声道的数据替换。第二个,设置WM8978寄存器,将左声道数据也放到右声道去。第三个,使用WM8978的MONO输出。最后,如果你的WAV就是MONO的,建议读取数据,将数复制成2份,分别输出给左右声道,这样听起来也是单声道的。
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2018-5-29
在线时间
136 小时
 楼主| 发表于 2019-12-27 13:52:03 | 显示全部楼层
本帖最后由 CLLS2080000 于 2019-12-27 14:15 编辑
正点原子 发表于 2019-12-26 18:12
我们例程是双声道设计的。你要单声道有很多办法,第一个,推送给右声道的数据,直接用左声道的数据替换。第 ...

///录音 I2S_DMA接收中断服务函数.在中断里面写入数据
void rec_i2s_dma_rx_callback(void)
{
u16 bw;
u8 res;
  u16 i;
if(rec_sta==0X80)//录音模式
{  
  if(DMA1_Stream3->CR&(1<<19))
  {
//将右声道剔除,i2srecbuf1前一半数据放入左声道,
i2srecbuf1后半段是错误的右声道数据,不可用

   for(i=2;i<I2S_RX_DMA_BUF_SIZE;i++)
   {
     i2srecbuf1[   i]=i2srecbuf1[i*2];//i2srecbuf1=i2srecbuf1[i*2];
     i2srecbuf1[i+1]=i2srecbuf1[i*2+1];
     i++;
   }
   res=f_write(f_rec,i2srecbuf1,I2S_RX_DMA_BUF_SIZE/2,(UINT*)&bw);//写一半左声道
   if(res)
   {
    printf("write error:%d\r\n",res);
   }
  }
  else
  {
   for(i=2;i<I2S_RX_DMA_BUF_SIZE;i++)
   {
     i2srecbuf2 [i  ]=i2srecbuf2[i*2];
     i2srecbuf2[i+1]=i2srecbuf2[i*2+1];
     i++;
   }
   res=f_write(f_rec,i2srecbuf2,I2S_RX_DMA_BUF_SIZE/2,(UINT*)&bw);//写一半左声道
   if(res)
   {
    printf("write error:%d\r\n",res);
   }
  }
  wavsize+=I2S_RX_DMA_BUF_SIZE;
}
} 这样搞单声道可以了,不过电脑播放正常了,开发板播放快了一倍,可能要该播放器了

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 22:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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