你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

PDM2PCM转换结果成了脉冲波形,请大神指点

[复制链接]
scanli 提问时间:2018-10-24 11:08 /
1.环境:  

            stm32f407vet6      

           SPI2作为PDM麦克数据的输入,
           单路数字mic,MIC的L/R管脚接地,

            SPI2的时钟为1.28MHz。
2.配置:SPI2的配置:
   /* SPI2 init function */
static void MX_SPI2_Init(void)
{

  /* SPI2 parameter configuration*/
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
  hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}


PDM2PCM配置:

void MX_PDM2PCM_Init(void)
{
  PDM1_filter_handler.bit_order = PDM_FILTER_BIT_ORDER_LSB;
  PDM1_filter_handler.endianness = PDM_FILTER_ENDIANNESS_LE;
  PDM1_filter_handler.high_pass_tap = 1932735282;
  PDM1_filter_handler.in_ptr_channels = 1;
  PDM1_filter_handler.out_ptr_channels = 1;
  PDM_Filter_Init(&PDM1_filter_handler);

  PDM1_filter_config.decimation_factor = PDM_FILTER_DEC_FACTOR_80;
  PDM1_filter_config.output_samples_number = 16;
  PDM1_filter_config.mic_gain = 0;
  PDM_Filter_setConfig(&PDM1_filter_handler, &PDM1_filter_config);
}
PDM2PCM转换
uint8_t MX_PDM2PCM_Process(uint16_t *PDMBuf, uint16_t *PCMBuf)
{
     uint32_t retuVal;
     retuVal= PDM_Filter(PDMBuf,PCMBuf,&PDM1_filter_handler);
     return retuVal;
}


3.数据处理:  PDM2PCM
#define PDMBUFSIZE             160      //16bit
#define PCMBUFSIZE             16            //16bit
#define PCM2DACBUFSIZE         60         //16bit

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
    uint8_t i;
    uint16_t  tmpPDM[PDMBUFSIZE/2];
    if(hspi==&hspi2)
    {
        for(i=0;i<PDMBUFSIZE/2;i++)
           tmpPDM=HTONS(PDMDataBuf[i+PDMBUFSIZE/2]);        
        PDM2PCMState=MX_PDM2PCM_Process(tmpPDM,PCMdataBuf);
        for(i=0;i<PCMBUFSIZE;i++)
          {
           if(PCM2DACBuf->isFull(PCM2DACBuf)==true)        
           PCM2DACBuf->add(PCM2DACBuf, (PCMdataBuf+i));    ////写入DAC转换
            }
     
    }            
}   

void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi)
{
  uint8_t i;
    uint16_t  tmpPDM[PDMBUFSIZE/2];
    if(hspi==&hspi2)
    {
        for(i=0;i<PDMBUFSIZE/2;i++)
           tmpPDM=HTONS(PDMDataBuf);
        PDM2PCMState=MX_PDM2PCM_Process(tmpPDM,PCMdataBuf);
   
        for(i=0;i<PCMBUFSIZE;i++)
          {
                if(PCM2DACBuf->isFull(PCM2DACBuf)==true)
                  PCMBufFullFlag++;
               PCM2DACBuf->add(PCM2DACBuf, (PCMdataBuf+i));   //写入DAC转换
            }
    }            
}   
结果:  转换后的PCM数据只有两种情况:要么是接近0xffff,要么接近ox0000.也就是说,转换的输出成了类似PWM的脉冲,而不是正常音频的PCM数据。

点评

请发求助,谢谢  发表于 2018-10-25 08:54
收藏 评论6 发布时间:2018-10-24 11:08

举报

6个回答
scanli 回答时间:2018-10-25 08:44:17
没有人玩数字麦克?
程序员 回答时间:2018-10-25 16:40:30
scanli 发表于 2018-10-25 08:44
没有人玩数字麦克?

不懂,帮顶~~
stm32学习hpdj 回答时间:2018-10-27 06:41:27
不懂,帮顶
lyh1040754007 回答时间:2018-11-12 08:24:31
为什么不用libPDMFilter_Keil.lib这个库,,你调好吗

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

scanli 回答时间:2018-11-12 09:45:22
我用的是libPDMFilter_CM4_Keil.lib库,目前没有调出来,望成功者点拨。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版