网上看了一些资料,有点乱和杂,这里记录一下过程。
-
首先勾选DSP,选择Library或者Source都可以。
-
增加预定义
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);
}
}
}
- 滤波效果示例(FIR,32阶,1khz, 低通)
橙色线FIR滤波器的输入,灰色是FIR滤波器输出,都是真实的DAC->ADC输入(橙色),FIR输出(灰色),不是模拟测试,可以看出效果十分明显。
转载:https://blog.csdn.net/memoff/article/details/115920348
查看评论