#include "sys.h"
#include "arm_math.h"
/* ----------------------------------------------------------------------
** Macro Defines
** ------------------------------------------------------------------- */
#define TEST_LENGTH_SAMPLES 320 //采样点数
#define BLOCK_SIZE 32 //调用一次arm_fir_f32处理的采样点个数,这个参数的大小没有特殊要求,只需保证其1<blockSize<=TEST_LENGTH_SAMPLES
#define NUM_TAPS 29 //滤波器系数个数
/* -------------------------------------------------------------------
* The input signal and reference output (computed with MATLAB)
* are defined externally in arm_fir_lpf_data.c.
* ------------------------------------------------------------------- */
static float32_t testInput_f32_1kHz_15kHz[TEST_LENGTH_SAMPLES];//采样点
static float32_t testOutput[TEST_LENGTH_SAMPLES]; //滤波后输出
/* -------------------------------------------------------------------
* 声明大小为的状态缓冲区(numTaps+blockSize-1)
* ------------------------------------------------------------------- */
static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];//状态缓存,大小=BLOCK_SIZE + NUM_TAPS - 1
/* ----------------------------------------------------------------------
** 用fir1()MATLAB函数生成FIR系数缓冲区.
** fir1(28, 6/24)
** ------------------------------------------------------------------- */
const float firCoeffs32[NUM_TAPS] = {
-0.0018225230, -0.0015879294, +0.0000000000, +0.0036977508, +0.0080754303, +0.0085302217, -0.0000000000, -0.0173976984,
-0.0341458607, -0.0333591565, +0.0000000000, +0.0676308395, +0.1522061835, +0.2229246956, +0.2504960933, +0.2229246956,
+0.1522061835, +0.0676308395, +0.0000000000, -0.0333591565, -0.0341458607, -0.0173976984, -0.0000000000, +0.0085302217,
+0.0080754303, +0.0036977508, +0.0000000000, -0.0015879294, -0.0018225230
};
/* ------------------------------------------------------------------
* Global variables for FIR LPF Example
* ------------------------------------------------------------------- */
uint32_t blockSize = BLOCK_SIZE; //blocksize就是指一次处理多少个值
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; //采样数据长度/一次处理的值的个数
/* ----------------------------------------------------------------------
* FIR LPF Example
* ------------------------------------------------------------------- */
int32_t main(void)
{
uint32_t i;
arm_fir_instance_f32 S; //定义结构体
float32_t *inputF32, *outputF32;//定义输入数据和输出数据指针
/* 初始化输入输出缓存指针*/
inputF32 = &testInput_f32_1kHz_15kHz[0];
outputF32 = &testOutput[0];
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
/* 调用FIR初始化功能来初始化这个实例结构*/
arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize);//初始化结构体
/* ----------------------------------------------------------------------
** 为每一个采样块blockSize调用FIR处理功能,实现FIR滤波
**outputF32即为滤波后的序列
** ------------------------------------------------------------------- */
for(i=0; i < numBlocks; i++)
{
arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
}
while(1); /* main function does not return */
}
ST官方DSP库FIRl滤波器使用方法
最新推荐文章于 2025-04-07 19:00:22 发布