- 使用
cmsis-dsp - 开启单片机的
FPU
c
#define DEF_APP_FFT_MODULE
/*********************************************************************************
* INCLUDES
*********************************************************************************/
#include "app_fft.h"
#include "arm_math.h"
#include "transform_functions.h"
#include "arm_const_structs.h"
#include <stdio.h>
/*********************************************************************************
* DEFINES
*********************************************************************************/
// FFT点数 = 采样率 ÷ 目标分辨率,向上取整到2的幂次
#define FFT_LENGTH 256
//采样频率 ≥ 2 × 最高频率(建议2.5倍以上)
#define SAMPLE_FREQ 256
// 缓冲区
float adcBuffer[FFT_LENGTH];
float fftBuffer[FFT_LENGTH * 2]; // 实部+虚部
float magBuffer[FFT_LENGTH / 2];
/*********************************************************************************
* MACROS
*********************************************************************************/
/*********************************************************************************
* TYPEDEFS
*********************************************************************************/
/*********************************************************************************
* STATIC FUNCTION
*********************************************************************************/
void app_CollectData(void)
{
uint16_t i = 0;
// 从ADC采集数据到adcBuffer
// 这里用模拟数据代替
for(i = 0; i < FFT_LENGTH; i++)
{
float time = (float)i / SAMPLE_FREQ;
adcBuffer[i] = 0.2f * arm_sin_f32(2 * PI * 50 * time) +
0.8f * arm_sin_f32(2 * PI * 51 * time);
// 填充FFT缓冲区(实部)
fftBuffer[2*i] = adcBuffer[i];
// 虚部设为0
fftBuffer[2*i+1] = 0;
}
}
void app_FFTProcess(void)
{
uint32_t maxIndex;
float maxValue;
float frequency = 0;
float magValue = 0;
// 执行FFT
arm_cfft_f32(&arm_cfft_sR_f32_len256, fftBuffer, 0, 1);
// 计算幅度
arm_cmplx_mag_f32(fftBuffer, magBuffer, FFT_LENGTH/2);
// 寻找峰值频率
arm_max_f32(magBuffer, FFT_LENGTH/2, &maxValue, &maxIndex);
// 计算频率
frequency = (float)maxIndex * SAMPLE_FREQ / FFT_LENGTH;
//幅值
magValue = maxValue * 2 / SAMPLE_FREQ;
printf("原始:%d Hz, 峰值频率: %.2f Hz, 幅度: %.2f\n", maxIndex, frequency, magValue);
}
c
void main()
{
app_CollectData();
app_FFTProcess();
}