【英飞凌PSoC 6 RTT开发板试用】信号处理前端之滤波

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.hshell_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 #define test_length_samples 2048#define fs 10000extern 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_hint iir_main(void);#endif测试输入iir回车,查看波形
见视频
以下可以看到滤波导致了滞后,黄色线有滞后
以下是实时采集滤波


借力AI为医生赋能,为红斑狼疮患者带来希望
反向串联电池分析
浅谈金属脚在段码液晶屏上的焊接属性
哪些工业项目适合can光纤模块的应用?
伺服编码器有何特点?如何连接呢?
【英飞凌PSoC 6 RTT开发板试用】信号处理前端之滤波
CHINAPLAS与知名展商到达最后一站苏州
模拟信号转换到数字信号要经历哪两个步骤
带喇叭口的雷达液位计为什么更值得购买?
湖南广播电视台总局实验室已正式启动了5G NR广播国际标准
基于虚拟仪器的多通道信号产生系统设计
旷为铅酸蓄电池的正确安装使用与维护
利用电脑软驱模拟数控机床换刀的动作原理,步进电机控制
纳多德助力国家超算深圳中心,建设高性能计算通用测试平台
奥迪合作法国全球生物能源公司,助力推进新燃料发动机测试研究
220V指示灯电路哪个更好一些?
信号处理电路-移相电路设计
荣耀20PRO采用了挖孔屏设计是目前DxOMark机评分的第二高分
全志Tina Linux NOR Flash系统开发指南 最详细版本 支持所有全志芯片
区块链除了圈钱与炒币还有什么用?