如何消除实时信号FIR带通滤波器的瞬态响应
瞬态上升现象的产生原因
你观察到的起始段瞬态是FIR滤波器的固有特性,本质是卷积运算的初始状态不匹配导致的:
- FIR滤波器的输出由输入信号与滤波器抽头(冲击响应)的卷积计算得到,阶数为N的FIR滤波器,完成一次有效卷积需要覆盖N个连续的输入采样点
- 滤波启动时,存储历史输入的延迟缓存默认初始化为0,前N个输出点的计算仅用到了部分有效输入信号、剩余参与计算的是初始的0值,输出会从0逐渐上升到稳态幅值,瞬态时长恰好等于N个采样点对应的时间
- 模拟滤波无该问题的原因是模拟器件的初始状态(电容电压、电感电流)天然匹配输入信号的偏置,且不会在运行过程中被主动复位;而数字方案如果每次处理数据时主动清零延迟缓存,就会重复触发该瞬态。
实时场景下的瞬态消除方案
针对你的水声时差测量场景,可根据你的系统设计选择以下方案:
- 跨数据块保留延迟线状态:如果是分块处理连续ADC数据流,不要每次处理完一个数据块就清零延迟缓存,而是将当前块最后(N-1)个输入采样值保存,作为下一个数据块处理的初始缓存值,即可完全避免连续流处理中的重复瞬态问题,该方案是实时系统的首选方案。
- 延迟线预充:如果系统需要在指定时刻启动测量,不要清零缓存后立刻开始输出有效结果,先预采集N个采样点填充延迟缓存再正式输出,第一个输出点即为稳态结果,仅第一次启动时存在N个采样点的启动延迟,不影响后续测量精度。
- 舍弃瞬态段+群延迟修正:如果无法改动滤波逻辑,直接舍弃滤波后前N个输出点,剩余输出均为稳态值。FIR滤波器为线性相位,群延迟固定为(N-1)/2个采样点,计算两个水听器的信号到达时间差时,将测量结果偏移该固定群延迟即可得到准确的时间差。
- 优化FIR阶数:在满足通带20-40kHz、阻带衰减、通带波纹的要求前提下,采用等波纹滤波器设计(MATLAB的
firpm函数)替代窗函数设计,相同指标下可降低滤波器阶数,缩短瞬态时长。
内容的提问来源于stack exchange,提问作者Kyle Donoghue
相关产品推荐
相关产品推荐

