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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版