如何将 8 kHz 音频采样率提高到 16 kHz STM32

Posted

技术标签:

【中文标题】如何将 8 kHz 音频采样率提高到 16 kHz STM32【英文标题】:How can I increase the 8 kHz audio sampling rate to 16 kHz STM32 【发布时间】:2021-10-24 23:34:44 【问题描述】:

感谢阅读我的主题

我尝试录制声音,我设法以 8 kHz 的采样率录制声音。

这是我的代码,效果很好。但我需要更多的采样率,比如 11kHz 或 16kHz,我不知道如何将采样率提高到这个速率。我使用 STM32F103C8

我在源代码https://www.hackster.io/christopher-william-sutjiono/read-audio-amplifier-circuit-output-using-stm-32-d9acb5中得到了这段代码

    void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM3_Init(void);
static void MX_USART1_UART_Init(void);
 
 
/* USER CODE END 0 */
#define SAMP 8000
 
 
int main(void)

 
    int k;
    uint8_t buf[40];
    uint16_t dat[SAMP]; // store ADC value 'SAMP'variable is 8000 1 sec for store audio
 
  HAL_Init();
 
 
  SystemClock_Config();
 
 
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_TIM3_Init();
  MX_USART1_UART_Init();
 
  HAL_TIM_Base_Start(&htim3);
 
 
 
  while (1)
  
      for(k=0;k<SAMP;k++)
          
              while((__HAL_TIM_GET_COUNTER(&htim3))<124);
              HAL_ADC_Start(&hadc1);
              HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
              dat[k] = HAL_ADC_GetValue(&hadc1); //GET ADC Value
          
 
          // for loop to print sammples to computer screen with 1 msec pause between samples
 
          for (k=0;k<SAMP;k++)
          
              sprintf((char*)buf,"%d\r\n", dat[k]);
              HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY);
              HAL_Delay(1);
          
 
          HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
          HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_SET);
          HAL_Delay(3000);
          HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_RESET);
          HAL_Delay(3000);
 
  
 

htim3.Instance = TIM3;
  htim3.Init.Prescaler = 16-1;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 125-1;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  
    Error_Handler();
  
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  
    Error_Handler();
  
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  
    Error_Handler();
  


  [1]: https://www.hackster.io/christopher-william-sutjiono/read-audio-amplifier-circuit-output-using-stm-32-d9acb5

【问题讨论】:

【参考方案1】:

看起来while((__HAL_TIM_GET_COUNTER(&amp;htim3))&lt;124); 行定义了您的采样率,将幻数从 124 减少将提高您的采样率。

几乎可以肯定有更好的方法来做到这一点,例如定时器触发的 DMA 或类似方法。

【讨论】:

您好我正在尝试使用“定时器触发 DMA”,但不知道如何配置它

以上是关于如何将 8 kHz 音频采样率提高到 16 kHz STM32的主要内容,如果未能解决你的问题,请参考以下文章

以高于 16kHz 的采样率从 AirPod Pro 录制音频

音频兼容方案

将 pcm/wav 音频从 22khz 下采样到 8khz

如何在 linux/android 平台上设置高于 44.1kHz 的音频采样率?

将音频缓冲区从 44100 重新采样到 16000

语音处理:音频入门之基础概念总结