0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-07-14 00:09 次阅读

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个状态变量。
image.png

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来实现。

image.png

如果要实现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回车,查看波形

视频

以下可以看到滤波导致了滞后,黄色线有滞后
image.png

image.png

以下是实时采集滤波
image.png
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 英飞凌
    +关注

    关注

    65

    文章

    1903

    浏览量

    136909
  • 滤波器
    +关注

    关注

    158

    文章

    7331

    浏览量

    174779
  • PSoC
    +关注

    关注

    12

    文章

    167

    浏览量

    91110
  • 滤波
    +关注

    关注

    10

    文章

    624

    浏览量

    56247
  • 信号处理
    +关注

    关注

    47

    文章

    854

    浏览量

    102528
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93991
  • RTT
    RTT
    +关注

    关注

    0

    文章

    63

    浏览量

    16881
收藏 人收藏

    评论

    相关推荐

    玩转PSoC 6 RTT积木式开发套件,实现毫米波雷达等实用功能

    本期英飞凌手工课,将由来自英飞凌的工程师Jenson给大家带来PSoC62withCAPSENSEevaluationkit(下称PSoC6RTT
    的头像 发表于 03-20 08:35 237次阅读
    玩转<b class='flag-5'>PSoC</b> 6 <b class='flag-5'>RTT</b>积木式<b class='flag-5'>开发</b>套件,实现毫米波雷达等实用功能

    英飞凌PSoC™ 62开发板 -LCD ILI9341 8080 DEMO

    英飞凌开发板
    rx_ted
    发布于 :2024年03月07日 21:08:39

    基于infineonPSOC62开发板的-信号处理前端 虚拟示波器-工具集

    一、前言 本项目基于英飞凌PSoC 6 RTT开发板实现了信号处理
    的头像 发表于 10-11 18:35 309次阅读
    基于infineonPSOC62<b class='flag-5'>开发板</b>的-<b class='flag-5'>信号</b><b class='flag-5'>处理</b><b class='flag-5'>前端</b> 虚拟示波器-工具集

    基于 Infineon PSoC™62开发板信号处理前端虚拟示波器-工具集

    一、前言 本项目基于英飞凌PSoC6 RT-Thread开发板实现了信号处理前端-一个
    的头像 发表于 08-16 20:15 402次阅读
    基于 Infineon <b class='flag-5'>PSoC</b>™62<b class='flag-5'>开发板</b>的<b class='flag-5'>信号</b><b class='flag-5'>处理</b><b class='flag-5'>前端</b>虚拟示波器-工具集

    英飞凌开发板模块评测任务大挑战-SPI驱动测试

    使用PSoC™ 62 with CAPSENSE™ evaluation kit开发板适配的RTT SPI驱动,做显示测试。
    发表于 08-10 15:44 466次阅读
    <b class='flag-5'>英飞凌</b><b class='flag-5'>开发板</b>模块评测任务大挑战-SPI驱动测试

    基于PSOC6开发板构建的智能小车

    本项目是基于Psoc6-evaluationkit-062S2开发板构建的智能小车。该开发板由RT-Thread与英飞凌联合推出,集成了一颗32位双核CPU子系统,包括150MHz的A
    发表于 07-28 15:14 508次阅读
    基于<b class='flag-5'>PSOC</b>6<b class='flag-5'>开发板</b>构建的智能小车

    英飞凌PSoC 6 RTT开发板试用信号处理前端之频率幅值相位分析

    FFT变换结果,幅值最大的横坐标对应信号频率,纵坐标对应幅度。幅值最大的为out[m]=val;则信号频率f0=(Fs/N)m ,信号幅值Vpp=val/(N/2)。N为FFT的点数,Fs为采样频率。相位Pha=atan2(a,
    的头像 发表于 07-14 09:02 868次阅读
    【<b class='flag-5'>英飞凌</b><b class='flag-5'>PSoC</b> 6 <b class='flag-5'>RTT</b><b class='flag-5'>开发板</b><b class='flag-5'>试用</b>】<b class='flag-5'>信号</b><b class='flag-5'>处理</b><b class='flag-5'>前端</b>之频率幅值相位分析

    英飞凌PSoC 6 RTT开发板试用信号处理前端之谐波分析

    3.1 电能质量,谐波分析 添加命令行 在电能检测应用中,电能质量一项分析即谐波分析,谐波分量大,说明电能质量不好, 基于本板信号处理前端也实现了该功能。 shell_fun.h中 void
    的头像 发表于 07-13 20:49 1187次阅读
    【<b class='flag-5'>英飞凌</b><b class='flag-5'>PSoC</b> 6 <b class='flag-5'>RTT</b><b class='flag-5'>开发板</b><b class='flag-5'>试用</b>】<b class='flag-5'>信号</b><b class='flag-5'>处理</b><b class='flag-5'>前端</b>之谐波分析

    英飞凌PSoC 6 RTT开发板试用信号处理前端之极值检测

    在电力等行业,分析电压极值,是一项重要的参数分析,可以分析电压的波动;示波器中也有自动测量极值的功能更。
    的头像 发表于 07-11 14:33 1102次阅读
    【<b class='flag-5'>英飞凌</b><b class='flag-5'>PSoC</b> 6 <b class='flag-5'>RTT</b><b class='flag-5'>开发板</b><b class='flag-5'>试用</b>】<b class='flag-5'>信号</b><b class='flag-5'>处理</b><b class='flag-5'>前端</b>之极值检测

    英飞凌PSoC 6 RTT开发板试用】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS

    本文将会分别介绍——使用软件I2C和硬件I2C在PSoC开发板上点亮OLED屏,并进行屏幕刷新率对比测试,最后还会在硬件I2C的基础上继续优化屏幕刷新率。本文实验使用的OLED屏尺寸为0.96
    的头像 发表于 07-11 09:21 1272次阅读
    【<b class='flag-5'>英飞凌</b><b class='flag-5'>PSoC</b> 6 <b class='flag-5'>RTT</b><b class='flag-5'>开发板</b><b class='flag-5'>试用</b>】使用软件和硬件I2C点亮OLED屏,帧率从2FPS提升到51FPS

    英飞凌PSoC 6 RTT开发板试用】+USB测试

    参考《Infineon-PSoC_6_MCU_CY8C6xx8_CY8C6xxA_Architecture_Technical_Reference_Manual_(TRM)-AdditionalTechnicalInformation-v08_00-EN.pdf》的33.
    发表于 06-16 23:32

    英飞凌PSoC 6 RTT开发板试用】机器人机械臂控制原创开源(2) 试用英飞凌产品介绍

    接上篇:【英飞凌PSoC 6 RTT开发板试用】机器人机械臂控制原创开源(1) 开箱(产品介绍)
    发表于 06-10 15:28

    英飞凌PSoC 6 RTT开发板试用】+开箱测试

    英飞凌PSoC 6 RTT开发板试用】+开箱测试 硬件资源介绍
    发表于 06-05 01:06

    英飞凌PSoC 6 RTT开发板试用】以搭积木方式实现简单的互联型家庭网关

    本文基于RT-Studio,采用搭积木的方式实现一个简单的互联型家庭网关,采集各类传感器数据并传输至云端。硬件除了Psoc6-evaluationkit-062S2开发板之外,还有一块RW007
    发表于 05-31 22:19

    英飞凌PSoC 6 RTT开发板试用

    单周期乘法和MPU,可以充分发挥 PSoC6 双核芯片性能。 该开发板核心 板载资源 如下: MCU:CY8C624ABZI-S2D44,Cortex-M4主频 150MHz,Cortex-M0主频
    发表于 05-30 20:47