FIR 滤波器之输出位宽和位宽增加(Output Width and Bit Growth)

本文深入探讨了滤波处理过程中位宽增加的原因,详细解析了位宽增加的上限计算公式,并提供了考虑小数位情况下的输出全精度位宽计算方法。

滤波处理时产生的位宽增加是基于滤波的乘累加运算造成的;位宽增加的上限是非零乘法运算系数以2位底的对数向上取整再加上原始系数位宽,如下公式;

 但是实际当中系数较小,不会达到最大位宽;

实际增长的位宽如上是式3-3所示;

 

3-4给出了输出的全精度位宽;上面的式子是在没有考虑小数位的情况下计算得到的最终位宽,下面给出考虑小数位的情况:

 

<think> 我们正在讨论的是滤波器输出增加的原因。这个问题涉及到数字信号处理(DSP)和硬件设计(如FPGA)中的一些关键概念。下面我将详细解释原因,并尽量结合硬件实现的角度。 ### 一、滤波器输出增加的核心原因 在数字滤波器中,输出通常比输入要大,主要原因如下: 1. **防止运算溢出(Overflow Protection)** 数字滤波器(特别是FIR滤波器)的运算过程涉及多个乘累加操作。每个乘法操作都会增加(两个N数的乘积是2N),而累加操作则进一步扩展。如果输出增加,累加结果可能会超出输出范围,导致溢出。例如: - 输入数据:$B_{in}$ - 滤波器阶数:$N$ 阶 - 输出理论最小值:$B_{out} = B_{in} + \lceil \log_2 N \rceil$ 这里$\lceil \log_2 N \rceil$是为了容纳最坏情况下$N$个输入样本叠加产生的增长[^1]。 2. **保留运算精度(Preserving Precision)** 滤波器系数通常具有分数特性(如小数),在定点运算中,乘法会产生额外的分数。例如: - 输入数据:12整数 - 滤波器系数:16(其中10整数,6小数) - 乘法结果:12 + 16 = 28 如果不保留这些低,直接截断会导致精度损失,尤其是在多级滤波器中累积误差更大[^2]。 3. **适应系数动态范围(Coefficient Scaling)** 某些滤波器(如低通滤波器)的系数可能大于1(例如2.5),此时输出值会比输入值更大,需要额外的来表示。 ### 二、增长的数学原理 以FIR滤波器为例,输出$y[n]$的表达式为: $$y[n] = \sum_{k=0}^{N-1} h[k] \cdot x[n-k]$$ 其中$h[k]$是滤波器系数,$x$是输入信号。 1. **最坏情况分析** 假设输入$x$的最大绝对值为$A_x$,滤波器系数的最大绝对值为$A_h$,则输出的最大可能值为: $$|y_{\text{max}}| \leq A_x \cdot A_h \cdot N$$ 这意味着输出需要满足: $$B_{out} \geq B_{in} + \lceil \log_2 (A_h \cdot N) \rceil$$ 2. **实际硬件实现中的扩展** 在Verilog中,一个典型的FIR滤波器输出设置如下: ```verilog module fir_filter ( input clk, input signed [15:0] data_in, // 16输入 output reg signed [31:0] data_out // 32输出 ); // 内部累加器通常比输出更大 reg signed [47:0] accumulator; // 48累加器 always @(posedge clk) begin // 乘累加操作 accumulator <= accumulator + (coeff * data_in); // 输出截取高16(示例,实际根据需求) data_out <= accumulator[47:16]; end endmodule ``` 这里累加器(48)远大于输入(16),就是为了避免溢出和保留中间精度[^3]。 ### 三、增加的负面影响与优化 尽管增加是必要的,但也带来资源消耗: 1. **资源消耗增加** FPGA中乘法器(DSP单元)和寄存器消耗随平方增长。 2. **优化策略**: - **饱和处理(Saturation)**:输出前进行范围截断 - **舍入(Rounding)**:代替直接截断以减少误差 - **块浮点(Block Floating Point)**:对一组数据动态调整缩放因子 - **压缩模块**:如本文开头讨论的归一化压缩模块[^4] ### 四、典型应用场景 1. **多级滤波器系统** 每级滤波器输出保留额外,在最后一级统一压缩: ``` 输入 → FIR1 (32输出)FIR2 (40输出) → 归一化压缩模块 → 16输出 ``` 2. **自适应滤波器** 当滤波器系数动态更新时,输出需要适应系数的变化范围[^5]。 ### 结论 滤波器输出增加本质上是信号处理系统对精度和动态范围的保障措施。在硬件设计中,需平衡: - **精度要求** → 增加 - **资源限制** → 压缩输出 §§相关问题§§ 1. 如何确定FIR滤波器输出的理论最小值? 2. 在FPGA中实现滤波器时有哪些优化技术? 3. 多级滤波器系统中如何传递信息? 4. 数字滤波器中的饱和处理如何实现? </think> ### 滤波器输出增加的原因详解 在数字信号处理系统中,滤波器输出增加是常见的设计策略,主要原因如下(按重要性排序): #### 1. **防止运算溢出(核心原因)** 滤波器运算(尤其是乘累加操作)会导致数值动态范围扩大: - **数学原理**:两个$N$数的乘法会产生$2N$结果 $$x \times y \rightarrow \text{} = B_x + B_y$$ - **累加效应**:$K$次累加需要额外$\lceil \log_2 K \rceil$ $$\text{总和} = B_{\text{输入}} + \lceil \log_2 K \rceil + B_{\text{系数}}$$ 例如:16输入 × 16系数,经128次累加后,理论最小需$16+7+16=39$[^1]。 #### 2. **保留运算精度(关键需求)** - **分数保留**:滤波器系数常为小数(如0.75),乘法会产生分数部分 ``` 输入:16整数 (0x2000 = 8192) 系数:0.75 (Q1.15格式: 0x6000) 乘积:8192 × 0.75 = 6144 (需保留低: 0x1800) ``` - **截断误差累积**:多级滤波器中,每级截断会导致误差数增长 $$E_{\text{总}} = \sum_{i=1}^{N} E_{\text{截断}_i} \times \prod_{j=i+1}^{N} |H_j|$$[^2] #### 3. **适应系数缩放(设计灵活性)** 当滤波器系数未归一化时: - 低通滤波器可能含$>1.0$的系数(如2.5) - 高通滤波器可能有负系数 - 扩展确保系统增益$G$满足: $$G = \max \left| \sum h[k] \right| \times 2^{B_{\text{extend}}} > 1$$ #### 4. **支持后续处理(系统级考虑)** - 级联滤波:下一级滤波器需要高输入 - 非线性运算:如$\sqrt{x}$需要输入$x$保留足够精度 - 动态范围调整:为归一化模块提供操作空间(如您的32→16压缩模块) ### 硬件实现示例(Verilog片段) ```verilog module fir_filter ( input clk, input signed [15:0] data_in, // 16输入 output reg signed [31:0] data_out // 32扩展输出 ); reg signed [15:0] delay_line [0:7]; reg signed [31:0] acc; // 40累加器 always @(posedge clk) begin // 移寄存器更新 delay_line[0] <= data_in; for(int i=7; i>0; i--) delay_line[i] <= delay_line[i-1]; // 乘累加(保留所有中间) acc <= 0; for(int j=0; j<8; j++) acc <= acc + delay_line[j] * coeff[j]; // 16x16b=32b乘积 end // 饱和输出(保留高) assign data_out = (acc[39:32] != 0) ? (acc[39] ? 32'h80000000 : 32'h7FFFFFFF) : acc[31:0]; endmodule ``` *注:此实现将16输入扩展为32输出,累加器使用40防止溢出[^3]* ### 扩展的代价与优化 | 优化策略 | 资源节省 | 精度损失风险 | |-------------------|----------|--------------| | 直接截断低 | 高 | 严重 | | 对称舍入 | 中 | 低 | | 块浮点(Block FP) | 中高 | 可控 | | 自适应分配 | 高 | 需复杂控制 | **设计建议**:在最后输出级进行压缩(如您提到的32→16归一化),而非中间阶段[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值