求助,USB MIC ADC采集后能够传输正常的数据,但是声音波形不对

2019-07-20 21:07发布

本帖最后由 xavierchen 于 2016-6-23 22:06 编辑

看到论坛中做的USB 收音机非常不错,非常感谢大牛的分享,自己想研究研究,遇到了问题。
使用了定时器中断来采集ADC,采用了16k的采样周期。
USB通信也没有了问题,但是采集到的声音通过GoldWave查看波形,发现只有一半的波形,另外一半消失了。
感觉可能的问题是:
(1)转换的问题,12bit的采集转换到PCM
(2)可能还有些地方设置不对,如果是USB的设置不对,不会采集到正确的声音。
声音波形如下:(有比较大的噪音因为mic附近有一个服务器)
wave.jpg

附上中断处理的函数:
[mw_shl_code=c,true]//¶¨ê±Æ÷3ÖD¶Ï·tÎñ3ìDò
void TIM3_IRQHandler(void)   //TIM3ÖD¶Ï
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //¼ì2éTIM3¸üDÂÖD¶Ï·¢éúóë·ñ
                {
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //Çå3yTIMx¸üDÂÖD¶Ï±êÖ¾
               
                //printf(".");
                        
                //ADCvalue=((ADC_GetConversionValue(ADC1)<<4));
                //ADCvalue=(uint8_t)(ADC_GetConversionValue(ADC1)>>4);                                        //ADC&#187;&#241;è&#161;&#214;μPA1£&#172;12bit4096FFFH
                //TIM_SetCompare3(TIM4, (uint8_t)(ADCvalue>>4));        //TIM4OC3PB82¥·&#197WM£&#172;12&#206;&#187;×a8&#206;&#187;£¨2aê&#212;&#214;±&#189;ó2é&#209;ù2¢2¥·&#197;£&#169;



                        if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ))
                                ADCvalue = ADC_GetConversionValue(ADC1);
                        else
                                ADCvalue = 0x0800;
                        
               
                        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_71Cycles5);        //ADC2é&#209;ùê±&#188;&#228;£¨71.5+12.5)/(72/6)=7us , audio2¥·&#197;&#194;ê 16K=62.5us&#161;¢32K=31.25us
                        ADC_SoftwareStartConvCmd(ADC1, ENABLE);

                        
                        
                        if (tag_buff==0)
                        {
                                Stream_Buff_0[buff_Offset*2+1]=(uint8_t)(ADCvalue>>8);
                                Stream_Buff_0[(buff_Offset*2)]=(uint8_t)(ADCvalue&0x00ff);
                                if (buff_Offset==15)
                                {
                                        tag_buff=1;
                                        buff_Offset=0;
                                }
                                else
                                        buff_Offset++;                        
                        }
                        else
                        {
                                Stream_Buff_1[buff_Offset*2+1]=(uint8_t)(ADCvalue>>8);
                                Stream_Buff_1[(buff_Offset*2)]=(uint8_t)(ADCvalue&0x00ff);
                                if (buff_Offset==15)
                                {
                                        tag_buff=0;
                                        buff_Offset=0;
                                }
                                else
                                        buff_Offset++;        
                        }  

                }
}
[/mw_shl_code]

希望大神帮助
另外,如何实现多声道多通道的采集,请大神指点迷津。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
mengheli
1楼-- · 2019-07-21 02:45
xavierchen 发表于 2016-7-21 20:04
这个还真不太了解,USB库的话,需要看看,里面东西还需要了解。另外,如果你用st的方案的话,可能自己要 ...

已经解决了,是我没开启AD中断的原因,好像是要使用DMA中断必须开启AD中断,我用的CUBE库
xavierchen
2楼-- · 2019-07-21 07:52
 精彩回答 2  元偷偷看……
xavierchen
3楼-- · 2019-07-21 08:42
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-21 10:08
xavierchen 发表于 2016-6-26 11:06
单声道的基本搞定了,问题出现在ADC和DMA中。
现在开始搞双声道,但是问题就出来了。
usb audio的USB描述 ...

继续努力
xavierchen
5楼-- · 2019-07-21 14:29
正点原子 发表于 2016-7-2 23:44
继续努力

这个帖子好像发错了,用的是103,现在两路的mic已经完美,4路的也没有什么大问题,6路的话mic的波束成形算法有点儿复杂,4路OK,声音加强完全没有问题。谢支持!!
mengheli
6楼-- · 2019-07-21 18:27
xavierchen 发表于 2016-7-3 14:08
这个帖子好像发错了,用的是103,现在两路的mic已经完美,4路的也没有什么大问题,6路的话mic的波束成形 ...

你好我用的是ADC采集后DMA传输然后写U盘,但是不知道为什么一直失败,好像DMA中断和USB的process函数有冲突是吗?请问您当时的问题是什么

一周热门 更多>