• Menu
  • Product
  • Email
  • PDF
  • Order now
  • 数字 IIR 滤波器

    • ZHCADU5 February   2024 MSPM0G1505 , MSPM0G1506 , MSPM0G1507 , MSPM0G3505 , MSPM0G3505-Q1 , MSPM0G3506 , MSPM0G3506-Q1 , MSPM0G3507 , MSPM0G3507-Q1

       

  • CONTENTS
  • SEARCH
  • 数字 IIR 滤波器
  1.   1
  2. 1说明
  3. 2所需外设
  4. 3兼容器件
  5. 4设计步骤
  6. 5设计注意事项
  7. 6软件流程图
  8. 7应用代码
  9. 8其他资源
  10. 9E2E
  11. 重要声明
search No matches found.
  • Full reading width
    • Full reading width
    • Comfortable reading width
    • Expanded reading width
  • Card for each section
  • Card with all content

 

Subsystem Design

数字 IIR 滤波器

下载最新的英语版本

1 说明

该子系统演示了如何使用 MSPM0G 系列器件中的内部 ADC 和数学加速器 (MATHACL) 模块对模拟信号实施简单的流式 IIR 滤波器。在此配置中,使用单极 IIR 滤波器对模拟信号上的噪声进行滤波。可以调整定义的 β 值以控制 IIR 滤波器随频率的衰减。

GUID-20240122-SS0I-MTJQ-R7LG-RWV6HG2WR5DF-low.svg图 1-1 IIR 滤波器功能方框图

2 所需外设

所需外设

该应用需要一个集成式 ADC、MathACL 和 DAC12 模块。

表 2-1 所需外设
子块功能 外设使用 注释
模拟信号捕获 1 个 ADC 在代码中显示为 ADC12_0_INST
IIR 滤波器 1 个 MathACL 在代码中显示为 MATHACL
模拟信号输出(可选) 1 个 DAC12 在代码中显示为 DAC12_0_INST

3 兼容器件

根据表 2-1 中的要求,该示例与表 3-1 中列出的器件兼容。相应的 EVM 可用于原型设计。

表 3-1 兼容器件
兼容器件 EVM
MSPM0G35xx、MSPM0G15xx LP-MSPM0G3507

4 设计步骤

  1. 确定所需的最小 ADC 采样频率。这必须至少是输入信号带宽的两倍。
  2. 确定所需的抑制系数。单极 IIR 滤波器中的抑制系数决定了滤波器随频率变化的衰减速率。抑制系数有时被称为 β 值或衰减值。
    1. 有不同的工具可用来计算 IIR 滤波器系数,本文档不讨论这些工具。
  3. 将滤波器系数转换为定点值。
    1. 在示例代码中,使用 Q8(八个小数位)表示形式。使用 IQMath 库 或通过将系数乘以 2n 来执行此转换,其中 n 是所需的小数位数。验证所选数据类型是否可以保留这些值而不会溢出。
    2. 滤波器系数是常数值,可根据需要包含在闪存中以节省 SRAM 中的空间。

5 设计注意事项

  1. 输入信号带宽:
    必须解析的信号带宽决定 ADC 采样频率和代码必须处理的数据量。
  2. ADC 基准电压:
    选择 ADC 基准电压时,必须能够以良好的分辨率完全捕捉信号幅度。
  3. 衰减系数:
    在单极 IIR 滤波器中,衰减值是衡量新样本对当前结果的贡献的单个系数。衰减系数的范围介于 0 到 1 之间。衰减值越高,截止频率就越早。

6 软件流程图

GUID-20240122-SS0I-W6KK-JCSQ-3HN1TDQZWD4D-low.svg图 6-1 示例软件序列

7 应用代码

volatile bool gCheckADC;
/* Filtered Result */
uint32_t gResult = 0;
/* ADC Value Output */
uint32_t gADCResult = 0;

/* Scaling Factor, Q8 value (0-255) */
uint32_t gBeta = 16;
const DL_MathACL_operationConfig gMpyConfig = {
    .opType      = DL_MATHACL_OP_TYPE_MAC,
    .opSign      = DL_MATHACL_OPSIGN_SIGNED,
    .iterations  = 0,
    .scaleFactor = 0,
    .qType       = DL_MATHACL_Q_TYPE_Q8};
int main(void)
 {
    SYSCFG_DL_init();
    NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
    gCheckADC = false;
    DL_ADC12_startConversion(ADC12_0_INST);

    /* Configure MathACL for Multiply and Accumulate */
    DL_MathACL_configOperation(MATHACL, &gMpyConfig, 0, 0 );
    DL_MathACL_enableSaturation(MATHACL);

    while (1) {
        while (false == gCheckADC) {
            __WFE();
        }
        gCheckADC = false;

        /* Calculate IIR Filter Output */
        gADCResult = DL_ADC12_getMemResult(ADC12_0_INST, DL_ADC12_MEM_IDX_0);
        /* Set Operand One last */
        DL_MathACL_setOperandTwo(MATHACL, gADCResult - gResult);
        DL_MathACL_setOperandOne(MATHACL, gBeta);
        DL_MathACL_waitForOperation(MATHACL);
        gResult = DL_MathACL_getResultOne(MATHACL);
        DL_DAC12_output12(DAC0, gResult);

    }
}
/* Set the ADC Result flag to trigger our main loop to process the new data */
void ADC12_0_INST_IRQHandler(void)
{
    switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) {
        case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
            gCheckADC = true;
            break;
        default:
            break;
    }
}

 

Texas Instruments

© Copyright 1995-2025 Texas Instruments Incorporated. All rights reserved.
Submit documentation feedback | IMPORTANT NOTICE | Trademarks | Privacy policy | Cookie policy | Terms of use | Terms of sale