飞道的博客

STM32F3/F4基于DSP的FIR滤波器应用

190人阅读  评论(0)

网上看了一些资料,有点乱和杂,这里记录一下过程。

  1. 首先勾选DSP,选择Library或者Source都可以。

  2. 增加预定义

ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING


3. 增加包含头文件目录

4. 打开Matlab,输入fdatool命令,进行FIR滤波器设计
具体设计选哪种滤波器,多少阶,采样率,截止频率完全根据自己的要求设计,完成后点Generate C header 来输出滤波器参数。

5. STM32 代码
(这些只是大概的结构,具体的FIR滤波器源头数据testInput的得来当然要自己按照自己的应用来写,其中用到的33个参数就来自于上面生成的头文件中)

#include "arm_math.h"
#define TEST_LENGTH_SAMPLES   1000
#define BLOCK_SIZE            100
#define NUM_TAPS              33

uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE;

float32_t testOutput[TEST_LENGTH_SAMPLES];
float32_t testInput[TEST_LENGTH_SAMPLES];
float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];

const float32_t firCoeffs32[NUM_TAPS] = {
   0.004545294214, 0.005060049705, 0.006566246971, 0.009012510069,   0.0123100793,
    0.01633617282,  0.02093872614,  0.02594230697,  0.03115498833,  0.03637590259,
    0.04140317068,  0.04604187235,  0.05011179298,  0.05345456675,  0.05593996495,
    0.05747107789,  0.05798817798,  0.05747107789,  0.05593996495,  0.05345456675,
    0.05011179298,  0.04604187235,  0.04140317068,  0.03637590259,  0.03115498833,
    0.02594230697,  0.02093872614,  0.01633617282,   0.0123100793, 0.009012510069,
   0.006566246971, 0.005060049705, 0.004545294214
};
arm_fir_instance_f32 S;
float32_t  *inputF32, *outputF32;

main()
{
	inputF32 = &testInput[0];
 	outputF32 = &testOutput[0];
  	arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize);
	while(1)
	{
		for(int i=0; i < numBlocks; i++)
		{
			arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
		}
	}
}
  1. 滤波效果示例(FIR,32阶,1khz, 低通)
    橙色线FIR滤波器的输入,灰色是FIR滤波器输出,都是真实的DAC->ADC输入(橙色),FIR输出(灰色),不是模拟测试,可以看出效果十分明显。

转载:https://blog.csdn.net/memoff/article/details/115920348
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场