基于STM32音频频谱分析设计方案


本设计包含程序代码+原理图+PCB

📚开发环境

原理图:Altium Designer
程序编译器:keil 5
编程语言:C语言
设计编号:C0030

📚功能说明

硬件系统组成:STM32F103C8T6 +麦克风咪头+LM358音频放大电路+0.96寸OLED屏幕+按键。
采用咪头(话筒拾音传感器)采集音频信号,此音频信号过小,不利于单片机ADC直接采集,故将此音频信号经LM358放大电路放大后送入单片机的ADC口采集。
将采集到的音频信号进行量化,采用傅里叶变换,得出音频信号中的AD值频谱分布,并将各段实时时间内的频谱分布数组以描点的方式显示在OLED屏幕之上。即可直观感受经傅里叶FFT变换分析得出的频谱显示。

📚原理图

在这里插入图片描述

📚PCB

在这里插入图片描述

📚程序代码

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
#define NPT 256
#define PI2 6.28318530717959
//采样率计算
//分辨率:Fs/NPT 
//#define Fs	10000
#define Fs	9984
//取9984能出来整数的分辨率 9984/256 = 39Hz

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void Creat_Single(void);
void GetPowerMag(void);
void Single_Get(void);
void display1(void);
void display2(void);
void Key_Scan(void);
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
uint32_t adc_buf[NPT]={0};

long lBufInArray[NPT];
long lBufOutArray[NPT/2];
long lBufMagArray[NPT/2];


uint8_t prt = 10;	//量化显示的比例
#define SHOW_NUM 4				//显示函数的个数
uint8_t display_num = 1;	//控制显示方式的
uint8_t auto_display_flag = 0;	//自动切换显示标志 1:自动切换 0:手动

uint8_t fall_pot[128];	//记录下落点的坐标

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */
	uint16_t i = 0;
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_ADC1_Init();
  MX_TIM3_Init();

  /* USER CODE BEGIN 2 */
	printf("uart test! \r\n");
	
	/*初始化显示*/
	GUI_Initialize();
	/*设置前景色和背景色 这里用1和0代替*/
	GUI_SetColor(1,0);
	GUI_LoadPic(0,0,(uint8_t *)&gImage_bg,128,64);
	GUI_Exec();
	HAL_Delay(3000);
	
	//初始化下落点 把下落的点 初始化为最底部显示
	for(i=0;i<128;i++)
		fall_pot[i] = 63;
	
	/*启动ADC的DMA传输 配合下面定时器来触发ADC转换*/
	HAL_ADC_Start_DMA(&hadc1, adc_buf, NPT);
	/*开启定时器 用溢出事件来触发ADC转换*/
	HAL_TIM_Base_Start(&htim3);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
		Key_Scan();
  }
  /* USER CODE END 3 */

}

在这里插入图片描述

📚资料清单&下载链接

在这里插入图片描述

资料下载链接:
https://pan.baidu.com/s/1LaAmzzpc-lWUfGX7I2Tabg?pwd=ks20

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值