资源简介
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
相关资源
- stm32f103zet6最小系统原理图
- STM32F103单片机输出SPWM波
- STM32F103 ADC 中断模式 连续转换
- stm32f103引脚详图
- stm32控制ch376s例程
- STM32使用HAL库移植freemodbus-v1.6
- stm32 LabVIEW控制开发板LED灯显示
- VC程序实现了波形显示与FFT算法
- STM32F103C8T6+1.44寸ST7735TFT LCD彩屏驱动程
-
Jli
nk unlock for F1,解锁F1系列的ARM芯 - f407_mpu6050.rar
- 基于STM32的AD9834驱动
- 基于STM32HAL库的AD9834驱动代码修正.z
- STM32Cube之ID加密
- JPEG解码,可以移植到STM32中
- stm32cubemx软件iic读取mpu6050dmp通过串口
- 基于STM32实现的简易电子琴
- 简易工频信号测试仪(FFT)
- STM32F207中文数据手册
- STM32F407W5500
- Flymcu(STM32)
- nRF24LE1与nRF24L01通讯程序
- stm32内部结构图
- STM32 多通道 不同频率 可变频 pwm输出
- STM32一步一步教你点亮流水灯
- STM32F103ZET6 AD10封装库
- STM32F10x标准固件函数库V3.6.1
- STM32F AT24c02软件驱动程序
- Proteus8.9 仿真STM32407ZGT6系列基础模板
- STM32通过GPRS(SIM7600CE模块)进行IAP远
评论
共有 条评论