ST意法半导体
直播中

李猛

7年用户 1478经验值
私信 关注
[问答]

PDM麦克风数据损坏了怎么处理?

我正在使用 MEMS PDM 麦克风并使用 I2S 读取它。在我的 I2S 和 PDM 配置中设置了以下参数。
  • hi2s3.Instance = SPI3;
  •   hi2s3.Init.Mode = I2S_MODE_MASTER_RX;
  •   hi2s3.Init.Standard = I2S_STANDARD_MSB;
  •   hi2s3.Init.DataFormat = I2S_DATAFORMAT_24B;
  •   hi2s3.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
  •   hi2s3.Init.AudioFreq = I2S_AUDIOFREQ_48K;
  •   hi2s3.Init.CPOL = I2S_CPOL_LOW;
  •   hi2s3.Init.ClockSource = I2S_CLOCK_PLL;
  •   hi2s3.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;
PDM2PCM 抽取因子是 64。我以 2Mbaud 的速度从 uart 发送数据,但我的数据中出现损坏值的间隙。这是因为我发送的速度不够快吗?如果是这样,我怎样才能更好地缓冲它以解决这个问题?  
感谢您的帮助,我的代码也在这里,还有我绘制的音频图像。
  • HAL_I2S_Receive_DMA(&hi2s3, &pdmRxBuf[0],64);
  •    HAL_UART_Transmit_DMA(&huart2, (uint8_t *)txBuf, 256);
  •   /* USER CODE END 2 */
  •   /* Infinite loop */
  •   /* USER CODE BEGIN WHILE */
  •   while (1)
  •   {
  •           if (rxstate==1) {
  •                      PDM_Filter(&pdmRxBuf[0],&MidBuffer[0], &PDM1_filter_handler);
  •                      for (int i=0; i<16;i++)
  •                      {
  •                              //MidBuffer = j++;
  •                              FifoWrite(MidBuffer);
  •                              //j %= 65535;
  •                      }
  •                      if (fifo_w_ptr-fifo_r_ptr > 128) fifo_read_enabled=1;
  •                      rxstate=0;
  •              }
  •              if (rxstate==2) {
  •                      PDM_Filter(&pdmRxBuf[64],&MidBuffer[0], &PDM1_filter_handler);
  •                      for (int i=0; i<16;i++)
  •                      {
  •                              //MidBuffer = j++;
  •                              FifoWrite(MidBuffer);
  •                              //j %= 65535;
  •                      }
  •                      rxstate=0;
  •              }
  •              if (txstate==1) {
  •                      if (fifo_read_enabled==1) {
  •                                  for (int i=0; i<64;i=i+1) {
  •                                          uint16_t data = FifoRead();
  •                                          txBuf = data;
  •                                          //txBuf[i+2] = data;
  •                                  }
  •                      }
  •                      txstate=0;
  •              }
  •              if (txstate==2) {
  •                      if (fifo_read_enabled==1) {
  •                                  for (int i=64; i<128;i=i+1) {
  •                                          uint16_t data = FifoRead();
  •                                          txBuf = data;
  •                                  //        txBuf[i+2] = data;
  •                                  }
  •                          }
  •                      txstate=0;
  •              }

  • void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
  • {
  •          txstate = 1;
  • }
  • void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  • {
  •          txstate = 2;
  • }
  • void HAL_I2S_RxHalfCpltCallback (I2S_HandleTypeDef *hi2s) {
  •         rxstate = 1;
  • }
  • void HAL_I2S_RxCpltCallback (I2S_HandleTypeDef *hi2s) {
  •         rxstate = 2;
  • }

回帖(1)

曹昆

2023-1-6 11:42:45

库中有一个名为“nSamples”的参数,它定义每次调用转换函数在输出中产生多少样本(16 位格式)。
因此,根据 nSamples 参数和抽取因子,您必须为输入提供正确的维度。
关于你的例子:
n样本 = 16
抽取 = 64
--> 输入必须是16*64(位)= 64个16位的半字
举报

更多回帖

发帖
×
20
完善资料,
赚取积分