资源简介
1.使用ADC采集音频信号
2.使用官方提供的FFT函数对采集到的信号进行处理
3.量化显示
4,在人耳能听到的频率范围(20-20KHz)中,故我们设置采样频率为44100Hz(根据采样定理,采样频率要大于信号最大频率的两倍,才能保证不失真)来采集这0-20KHz的音频信号。我们把采样点数设置为1024个点,那么在进行1024点FFT时,将得到44100Hz / 1024 = 43Hz的频率分辨率

代码片段和文件信息
/******************************************************************************
版权所有 (C) 2015-2050 厦门优胜卫厨有限公司
******************************************************************************
文 件 名 : myfft.c
版 本 号 : 初稿
作 者 : zgj
生成日期 : 2020年4月24日
最近修改 :
功能描述 : 快速傅里叶变换算法——STM32F1+DSP库实现
函数列表 :
修改历史 :
1.日 期 : 2020年4月24日
作 者 : zgj
修改内容 : 创建文件
******************************************************************************/
#include “myfft.h“
#include “math.h“
#include “mycfg.h“
#include “stm32_dsp.h“
#include “table_fft.h“
#include “dbg.h“
#include “osif.h“
#include “com.h“
void InitBufInArray(void);
void GetPowerMag(void);
void FFT_Stop(void);
void FFT_Start(void);
/*
由于FFT计算出来的数据是对称的,因此通常而言输出数组取一半的数据,为lBufOutArray[NPT/2]。
*/
#define SPECTRUM_WND_SIZE 32 //窗口数
#define THRESHOLD_WINDOW_SIZE 16 //均值窗口数
#define MULTIPLIER 1.0f //增益系数
u16 wndNum = 0;
u16 ADC_Value[NPT];
u32 lBufInArray[NPT]; //
u32 lBufOutArray[NPT];
u32 lBufMagArray[NPT/2]; //当前幅值
u32 lastSpectrum[NPT/2]; //上一次幅值 差值处理使用
u8 ucmagarry[37];
u16 spectralFlux[SPECTRUM_WND_SIZE]; //前后差值
u16 threshold[SPECTRUM_WND_SIZE]; //均值阈值
u16 peakSpectrum[SPECTRUM_WND_SIZE]; //节拍值
uint8 adc_dma_ok =0; //标记ADC_DMA传输完成
void myfft_init(void)
{
/* Enable ADC1 and GPIOC TIM1 DMA1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1ENABLE); //使能DMA1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 ENABLE);
gpio_config(GPIOCGPIO_Pin_0GPIO_Mode_AIN); //pc0
dma_config(DMA1_Channel1 (u32)&ADC1->DR(u32)&ADC_ValueNPT);
nvic_config(DMA1_Channel1_IRQn 0 0);
adc_config(ADC1RCC_PCLK2_Div8);//adc1 -an10 64mhz/8= 8mhz 最大14M
TIM_PWM_Config(TIM1 22 63 60 TIM_Channel_1); //samplingRate:44100hz 64M/(63+1)(22+1)
FFT_Start();
//InitBufInArray();
}
void DMA1_Channel1_IRQHandler(void)
{
FFT_Stop();
adc_dma_ok = 1; //标记ADC_DMA传输完成
}
/* 函数名称:void FFT_Start(void)
* 功能描述:FFT数据采集的启动
* 参数:无
* 返回值:无
*/
void FFT_Start(void)
{
/*启动ADC的DMA传输,配合定时器触发ADC转换*/
DMA_Cmd(DMA1_Channel1 ENABLE);
/*开启定时器,用溢出时间来触发ADC*/
TIM_Cmd(TIM1 ENABLE);
}
/* 函数名称:void FFT_Stop(void)
* 功能描述:FFT数据采集的停止
* 参数:无
* 返回值:无
*/
void FFT_Stop(void)
{
/*停止ADC的DMA传输*/
DMA_Cmd(DMA1_Channel1 DISABLE);
DMA_ClearITPendingBit(DMA_IT_HT);
DMA_ClearITPendingBit(DMA1_IT_TC1); //清除中断标志位
/*停止定时器*/
TIM_Cmd(TIM1 DISABLE);
}
/*****************************************************************************
函 数 名 : InitBufInArray
功能描述 : 模拟采样数据,采样数据中包含3种频率正弦波(350Hz,8400Hz和18725Hz)
输入参数 : 无
输出参数 : long *lBufInArray
返 回 值 :
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2020年4月24日
作 者 : zgj
修改内容 : 新生成函数
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 288 2020-05-06 15:17 myfft.h
文件 8144 2020-05-13 15:14 myfft.c
相关资源
- stm32做的红外遥控解码程序
- 《emwin实战指南(基于STM32-ISO开发板)
- Beginning STM32: Developing with FreeRTOS libo
- stm32f103c8t6_sch.Lib
- ALIENTEK战舰STM32F1 V3开发板原理图.rar
- STM32F103RC+ADC+DMA多通道采样LCD显示
- I2C读写AT24C02 基于STM32F103 cube116540
- 基于stm32f103ve的程序——跑马灯实验
- 基于STM32RCT6的步进电机驱动程序
- stm32f407上的两个can发送和接收例程
- STM32 led 时钟
- STM32 2.4G通信例程
- 直流无刷电机方波驱动 stm32 例程代码
- STM32中文资料
- STM32蓝牙和串口程序
- STM32f103超声波模块例程
- stm32f103c8t6 4 oled.rar
- stm32f030 IAP Demo(原创)
- STM32基于rt_thread操作系统的SDHC卡文件
- dsp2812上128点FFTc程序以及其CMD文件
- 用FFT对信号进行频谱分析
- NRF24L01实现51与STM32双向通讯
- STM32F103 串口程序(完整版)
- stm32 ds18b20 温度传感器 测试通过
- stm32官方例程
- STM32F103定时器中断程序
- [免费]基于stm32f103ze 的OLED驱动代码
- STM32F103RBT6驱动UC1698控制芯片的160160黑
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- STM32定时器使用入门。看了这个程序会
评论
共有 条评论