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的提取和处理查询的主要内容,如果未能解决你的问题,请参考以下文章