本设计:
基于STM32音频频谱分析设计方案(程序+原理图+PCB)
原理图:Altium Designer
程序编译器:keil 5
编程语言:C语言
编号C0030

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

百度云下载链接
https://docs.qq.com/doc/DS2hGYlhvRG1Rbnh5


原理图:

PCB:

源程序:

复制到浏览器https://docs.qq.com/sheet/DS0xIa0llTmtNakRW
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#include "adc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* USER CODE BEGIN Includes */
#include "stm32_dsp.h"
#include "table_fft.h"
#include "math.h"
#include "oled.h"
#include "config.h"
#include "bg.h"
/* USER CODE END Includes *//* Private variables ---------------------------------------------------------*//* 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 */}/** System Clock Configuration
*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct;RCC_ClkInitTypeDef RCC_ClkInitStruct;RCC_PeriphCLKInitTypeDef PeriphClkInit;/**Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/**Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}/**Configure the Systick interrupt time */HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);/**Configure the Systick */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);/* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}/* USER CODE BEGIN 4 */
/************FFT相关*****************/
//测试用 生成一个信号
void Creat_Single(void)
{u16 i = 0;float fx=0.0;for(i=0; i<NPT; i++){fx = 2048+2048*sin(PI2 * i * 200.0 / Fs)+3100*sin(PI2 * i * 502.0 / Fs)+1300*sin(PI2 * i * 990.0 / Fs);lBufInArray[i] = ((signed short)fx) << 16;       }
}
//获取FFT后的直流分量
void GetPowerMag(void)
{signed short lX,lY;float X,Y,Mag;unsigned short i;for(i=0; i<NPT/2; i++){lX  = (lBufOutArray[i] << 16) >> 16;lY  = (lBufOutArray[i] >> 16);//除以32768再乘65536是为了符合浮点数计算规律X = NPT * ((float)lX) / 32768;Y = NPT * ((float)lY) / 32768;Mag = sqrt(X * X + Y * Y)*1.0/ NPT;if(i == 0)   lBufMagArray[i] = (unsigned long)(Mag * 32768);elselBufMagArray[i] = (unsigned long)(Mag * 65536);}
}

STM32音频频谱分析设计方案(程序+原理图+PCB)相关推荐

  1. STM32物联网智能鱼缸智能家居系统(程序+原理图+PCB+图文教程)

    本设计: 基于STM32物联网智能鱼缸智能家居系统设计方案(程序+原理图+PCB) 原理图:Altium Designer 程序编译器:keil 5 编程语言:C语言 编号C0027 功能说明: 1. ...

  2. STM32模拟电磁炮设计_STM32F103ZET6(程序+原理图+PCB+论文报告)

    本设计: 基于STM32模拟电磁炮设计_STM32F103ZET6(程序+原理图+PCB+论文报告) 原理图:Altium Designer 程序编译器:keil 5 编程语言:C语言 编号C0029 ...

  3. STM32单片机紫外线强度检测仪器蜂鸣器报警(程序+原理图+PCB)

    本设计: 基于STM32单片机紫外线强度检测仪器蜂鸣器报警(程序+原理图+PCB) 原理图:Altium Designer 程序编译器:keil 5 编程语言:C语言 编号C0023 完整下载链接: ...

  4. STM32单片机智能跟随小车_红外遥控(程序+原理图+PCB+论文报告)

    本设计: 基于STM32单片机智能跟随小车_红外遥控(程序+原理图+PCB+论文报告) 原理图:Altium Designer 程序编译器:keil 5 编程语言:C语言 编号C0021 资料下载 [ ...

  5. STM32老人防跌倒报警GSM短信GPS定位设计(程序+原理图+PCB)

    本设计: 基于STM32老人防跌倒报警GSM短信GPS定位设计(程序+原理图+PCB) 编号C0025 下载链接 C0025 网盘链接 功能描述: 本系统由基于STM32单片机的核心板.ADXL345 ...

  6. 基于STM32F103C8T6的充电桩计费系统(程序+原理图+PCB+论文)

    本设计: 基于STM32F103C8T6的充电桩计费系统(程序+原理图+PCB+论文) 原理图:Altium Designer 程序编译器:keil 5 编程语言:C语言 编号C0019 下载链接 [ ...

  7. 51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告)

    本设计: 基于51单片机的简易计算器设计(仿真+程序+原理图+PCB+设计报告) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号S0001 芯片可以替换为 ...

  8. stm32三相逆变程序,pcb,以及板子。stm32输出三相spwm波驱动6个mos管实现三相逆变

    .逆变器本身可稳压,可任意设定输出电压,pid参数可用电脑通过串口调节.输入12-40 v,自动生成辅助电源供电.资料齐全,程序注释详细,稳定可靠,适合新手学习以及项目应用. stm32三相逆变开环驱 ...

  9. 54、基于51单片机饮水机温度水位控制无线蓝牙APP控制报警系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+开题报告+元器件清单等)

    方案的选择 方案一:采用51单片机作为控制核心,配合无线蓝牙模块.水温加热模块继电器开关.基于Dallas单线数字式的DS18B20温度传感器模块.蜂鸣器报警模块.按键模块.LCD1602液晶显示器模 ...

最新文章

  1. 我的hadoop学习之路
  2. 【组队学习】【34期】阿里云天池在线编程训练营
  3. pytorch版本的bert使用笔记
  4. eclipse导入jar包_在命令行上操作JAR,WAR和EAR
  5. 第二章 创建webGL设备和绘制缓冲区呈现 Context Creation and Drawing Buffer Presentation
  6. 54 Django 模型层(1) 单表查询
  7. 张掖计算机职称考试,甘肃省张掖市2018年3月计算机等级考试公告
  8. cfree运行程序错误的原因_Python入门教程 | 第 8 章 错误、调试和测试
  9. 23个小动作让你记忆力惊人
  10. scala-传名函数和传值函数
  11. 接口测试基础——第6篇unittest模块(三)
  12. rgb sw 线主板接口在哪_配置升级性能再突破,华硕TUF GAMING B460M-PRO 重炮手主板爆款来袭...
  13. 京瓷300i_kyocera cs 300i kx驱动下载
  14. 微信小游戏代码热更(转载)
  15. 在安装Maven检查版本时出现Please set the JAVA_HOME variable in your environment to match the locat
  16. MySQL锁篇-⾏级锁
  17. @Zabbix6.2安装部署【 Red Hat Linux release 8.0】
  18. MVX-Net论文解读
  19. 小白学 Python(1):开篇
  20. 华为鸿蒙战略发布会内容,万物互联!华为鸿蒙发布会带来无限可能

热门文章

  1. 能完成么?马斯克推特宣称特斯拉今年将生产约50万辆电动汽车
  2. UE4入门学习4:C++编程介绍
  3. 中华英才网三千员工全部裁员引争议
  4. 上海迪士尼推出“冰雪奇缘”梦幻仙境
  5. X.509证书(结构+原理)
  6. 只有自我负责,才能真正增长自己的力量
  7. python 中的butter函数
  8. 360安全卫士直达 卸载软件的位置
  9. DJI的核心竞争力是什么?
  10. C语言函数大全-- s 开头的函数(3)