• 大小: 3KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: 其他
  • 标签: FFT  STM32  AD采集DMA  

资源简介

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

评论

共有 条评论