如何将 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(&htim3))<124);
行定义了您的采样率,将幻数从 124 减少将提高您的采样率。
几乎可以肯定有更好的方法来做到这一点,例如定时器触发的 DMA 或类似方法。
【讨论】:
您好我正在尝试使用“定时器触发 DMA”,但不知道如何配置它以上是关于如何将 8 kHz 音频采样率提高到 16 kHz STM32的主要内容,如果未能解决你的问题,请参考以下文章
以高于 16kHz 的采样率从 AirPod Pro 录制音频