3.3数字滤波信号前端
原理
CMSIS-DSP提供直接I型IIR库支持Q7,Q15,Q31和浮点四种数据类型。其中Q15和Q31提供了快速版本。
直接I型IIR滤波器是基于二阶Biquad级联的方式来实现的。每个Biquad由一个二阶的滤波器组成:
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]
直接I型算法每个阶段需要5个系数和4个状态变量。
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]
matlab使用上面的公式实现,在使用fdatool工具箱生成的a系数需要取反才能用于直接I型IIR滤波器的函数中。
高阶IIR滤波器的实现是采用二阶Biquad级联的方式来实现的。其中参数numStages就是用来做指定二阶Biquad的个数。比如8阶IIR滤波器就可以采用numStages=4个二阶Biquad来实现。
如果要实现9阶IIR滤波器就需要将numStages=5,这时就需要其中一个Biquad配置成一阶滤波器(也就是b2=0,a2=0)。
添加命令行
shell_fun.h中
void IirFun(void* param);
shell_fun.c中
#include "iir.h"
shell_cmd_list中添加一行
{ (const uint8_t*)"iir", IirFun, “iir"},
添加命令执行函数
void IirFun(void* param)
{
Iir_main();
}
实现代码
Iir.c
#include "arm_math.h"
#include "arm_const_structs.h"
#include < stdio.h >
#define TEST_LENGTH_SAMPLES 2048
#define FS 10000
extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES];
static float32_t testOutput[TEST_LENGTH_SAMPLES];
static uint32_t fftSize = 1024;
static uint32_t ifftFlag = 0;
static uint32_t doBitReverse = 1;
static arm_cfft_instance_f32 varInstCfftF32;
static int testIndex = 0;
static float testtmp_f32_10khz[2048];
static int32_t adcbuffer[2048];
#define numStages 2 /* 2阶IIR滤波的个数 */
#define BLOCK_SIZE 128 /* 调用一次arm_biquad_cascade_df1_f32处理的采样点个数 */
uint32_t blockSize = BLOCK_SIZE;
uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_biquad_cascade_df1_f32的次数 */
static float32_t IIRStateF32[4*numStages]; /* 状态缓存 */
/* 巴特沃斯低通滤波器系数 80Hz*/
const float32_t IIRCoeffs32LP[5*numStages] = {
1.0f, 2.0f, 1.0f, 1.479798894397216679763573665695730596781f,
-0.688676953053861784503908438637154176831f,
1.0f, 2.0f, 1.0f, 1.212812092620218384908525877108331769705f,
-0.384004162286553540894828984164632856846f
};
int32_t iir_main(void)
{
uint32_t i;
arm_biquad_casd_df1_inst_f32 S;
float32_t ScaleValue;
float32_t *inputF32, *outputF32;
/* 初始化输入输出缓存指针 */
//memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz));
#if 1
adc_samp(adcbuffer,2048);
for(int i=0; i< 2048;i ++)
{
testtmp_f32_10khz[i] = (float)adcbuffer[i];
}
#endif
inputF32 = testtmp_f32_10khz;
outputF32 = testOutput;
/* 初始化 */
arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32LP[0],
(float32_t *)&IIRStateF32[0]);
/* 实现IIR滤波,这里每次处理1个点 */
for(i=0; i < numBlocks; i++)
{
arm_biquad_cascade_df1_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize),
blockSize);
}
/*放缩系数 */
ScaleValue = 0.012f* 0.42f;
/* 打印滤波后结果 */
for(i=0; i< TEST_LENGTH_SAMPLES; i++)
{
printf("/*%f, %f*/rn", testtmp_f32_10khz[i], testOutput[i]*ScaleValue);
}
}
/** endlink */
Iir.h
#ifndef IIR_H
#define IIR_H
int iir_main(void);
#endif
测试
输入iir回车,查看波形
见视频
以下可以看到滤波导致了滞后,黄色线有滞后
以下是实时采集滤波
审核编辑:汤梓红
-
英飞凌
+关注
关注
66文章
2183浏览量
138646 -
滤波器
+关注
关注
161文章
7795浏览量
177996 -
PSoC
+关注
关注
12文章
170浏览量
91893 -
滤波
+关注
关注
10文章
667浏览量
56633 -
信号处理
+关注
关注
48文章
1026浏览量
103259 -
开发板
+关注
关注
25文章
5032浏览量
97375 -
RTT
+关注
关注
0文章
65浏览量
17114
发布评论请先 登录
相关推荐
评论