STM32代码中4通道PCM数据缓冲区中buffer_data的提取和处理查询

Posted

技术标签:

【中文标题】STM32代码中4通道PCM数据缓冲区中buffer_data的提取和处理查询【英文标题】:Query of Extraction and process of buffer_data from 4 channel PCM data buffer in STM32 Code 【发布时间】:2021-12-29 06:48:56 【问题描述】:

我正在尝试理解 ST(AMicArray_Microphones_Streaming) 提供的一个 4 通道麦克风阵列代码。

在代码中,PCM 缓冲区数据通过此函数在 USB 上发送。在这段代码中,我实际上想对接收到的数据进行一些处理,然后我想通过 USB 发送它。我的问题是如何提取原始数据并进行处理?

对于初学者来说,这个主题似乎非常广泛,如果有人可以帮助我提供一些入门材料或指南,将不胜感激。

//PCMSamples = AUDIO_IN_SAMPLING_FREQUENCY/1000*AUDIO_IN_CHANNELS;

 uint8_t  USBD_AUDIO_Data_Transfer(USBD_HandleTypeDef *pdev, int16_t * audioData, uint16_t PCMSamples)

  
  USBD_AUDIO_HandleTypeDef   *haudio;
  haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassData;
  
  if(haudioInstance.state==STATE_USB_WAITING_FOR_INIT)    
    return USBD_BUSY;    
    
  uint16_t dataAmount = PCMSamples * 2; /*Bytes*/
  uint16_t true_dim = haudio->buffer_length;
  uint16_t current_data_Amount = haudio->dataAmount;
  uint16_t packet_dim = haudio->paketDimension;
  
  if(haudio->state==STATE_USB_REQUESTS_STARTED  || current_data_Amount!=dataAmount)   
    
    /*USB parameters definition, based on the amount of data passed*/
    haudio->dataAmount=dataAmount;                  
    uint16_t wr_rd_offset = (AUDIO_IN_PACKET_NUM/2) * dataAmount / packet_dim; 
    haudio->wr_ptr=wr_rd_offset * packet_dim;
    haudio->rd_ptr = 0;
    haudio->upper_treshold = wr_rd_offset + 1;
    haudio->lower_treshold = wr_rd_offset - 1;
    haudio->buffer_length = (packet_dim * (dataAmount / packet_dim) * AUDIO_IN_PACKET_NUM);
    
    /*Memory allocation for data buffer, depending (also) on data amount passed to the transfer function*/
    if(haudio->buffer != NULL)
    
      USBD_free(haudio->buffer);      
    
    haudio->buffer = USBD_malloc(haudio->buffer_length + haudio->dataAmount);
    if(haudio->buffer == NULL)
    
      return USBD_FAIL;       
    
    memset(haudio->buffer,0,(haudio->buffer_length + haudio->dataAmount));
    haudio->state=STATE_USB_BUFFER_WRITE_STARTED;
    
    
  else if(haudio->state==STATE_USB_BUFFER_WRITE_STARTED)
    if(haudio->timeout++==TIMEOUT_VALUE)
      haudio->state=STATE_USB_IDLE;
      ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->Stop();   
     haudio->timeout=0;
    
    memcpy((uint8_t * )&haudio->buffer[haudio->wr_ptr], (uint8_t *)(audioData), dataAmount);    
    haudio->wr_ptr += dataAmount;
    haudio->wr_ptr = haudio->wr_ptr % (true_dim);    
    if((haudio->wr_ptr-dataAmount) == 0)
      memcpy((uint8_t *)(((uint8_t *)haudio->buffer)+true_dim),(uint8_t *)haudio->buffer, dataAmount);
    
  
  return USBD_OK;  

【问题讨论】:

【参考方案1】:

我猜你正在使用 ST 的 X-Cube 音频库,如果是这样的话

音频处理()

Core/Src/audio_application.c 文件中的功能符合您的需求。

void AudioProcess(void)

  if (CCA02M2_AUDIO_IN_PDMToPCM(CCA02M2_AUDIO_INSTANCE,(uint16_t * )PDM_Buffer,(uint16_t *)PCM_Buffer) != BSP_ERROR_NONE)
  
    Error_Handler();
  
  Send_Audio_to_USB((int16_t *)PCM_Buffer, (AUDIO_IN_SAMPLING_FREQUENCY/1000)*AUDIO_IN_CHANNELS * N_MS);

PDM 和 PCM 数据可在此处进行处理。

ST提供音频采集视频教程here。您可以参考他们的频道以获取更多信息。

【讨论】:

以上是关于STM32代码中4通道PCM数据缓冲区中buffer_data的提取和处理查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将 PCM 音频流转换为在线播放

stm32_ADC定时器采样(DMA均值处理数据)

STM32F0 DMA“输入溢出”

STM32 无法让 DMA + ADC 运行。 (NUCLEO-G431KB)

硬件——STM32 , 录音

stm32中adc的常规通道和注入通道的区别