FIR滤波器

1.原理

FIR滤波器是非递归型滤波器的简称,又叫有限长单位冲激响应滤波器。带有常系数的FIR滤波器是一种LTI(线性时不变)数字滤波器。冲激响应是有限的意味着在滤波器中没有发反馈。长度为N的FIR输出对应于输入时间序列x(n)的关系由一种有限卷积和的形式给出,具体形式如下:

                                                             

直接形式FIR滤波器图解:

                                                       

上式表达的是一个N-1阶的FIR滤波器,它有N个抽头(系数)。因此有N个乘法器,N-1个累加器组成。每一个抽头需要消耗逻辑资源的乘法器累加器( Mac )单元。

输入信号是有时间性的,随着时间的改变而改变,FIR滤波器最终的输出是各个时刻的输入乘以相应的权重(系数),然后进行叠加输出:

           


FIR数字滤波器“移动平均数”为例子:

“移动平均数”就是按我们事先设定的信号个数将输入信号加以平均。譬如,如果我们按每4个信号就做一次平均,那么这个4点的“移动平均数”滤波器就如下图所示:

                             

下图是经过11点和51点“移动平均数”滤波器过滤的信号图:

                                       

“移动平均数”滤波器的频率响应如下图所示:

                                       

如上图所示,随着点数的增加,滚降(ROLLOFF)变陡了,但对旁瓣(sidelobe,衰减部分)的高低影响不大。但是如果我们考虑对滤波器的每个系数采用不同的权重(加权),而不是像“移动平均数”滤波器那样,用相同的权重(1/4,对4点“移动平均数”滤波器来说),那么可以期待旁瓣的大小会大大的降低。

对系数采用不同权重的滤波器,我们可以用下面的数学公式来表达:

                              

2.FPGA实现fir滤波器

2.1在MATLAB中输入fdatool即可打开滤波器设计工具,如图7所示。里面可以设置滤波器的类型,采样频率,截止频率等。本设计设置的参数如图所示。

然后将此滤波器系数导出,然后用以下命令将系数放大、取整:

>> Num=round(Num*256)//将系数放大并取整

num=[ 5    17    43    63    63    43    17     5]; 

本设计用于仿真的输入波形是2个正弦波叠加而成,分别是5HZ、45HZ。

Fs = 1000; %采样频率决定了两个正弦波点之间的间隔
N = 256; %采样点数
N1 = 0 : 1/Fs : N/Fs-1/Fs;
s = cos(5*2*pi*N1) + cos(45*2*pi*N1) ;%
fidc = fopen('mem.txt','wb');  %将结果写入mem.txt文件,便于modesim使用

for x = 1 : N
    A = round(s(x)*20);%放大
   if (A >= 0)
      bin_x = dec2bin(A, 8);        % 正数的反码和补码都和原码一样,转换位8位
      fprintf(fidc,'%s\n',bin_x);
   else
      bin_x = dec2bin(2^8 + A, 8);
      fprintf(fidc,'%s\n',bin_x);
   end
end 

fclose(fidc);

2.verilog

module fir(clk,rst,din,dout,ordy);
 input clk;
 input rst;
 input [7:0] din;
 output [15:0] dout;
 output ordy;
 //matlab fir生成系数 * 256  该滤波器采样率为100Hz,截止频率为10Hz
 parameter coeff1=8'd5,coeff2=8'd17,coeff3=8'd43,coeff4=8'd63,coeff5=8'd63,coeff6=8'd43,coeff7=8'd17,coeff8=8'd5;
 //8个寄存器
 reg  signed [7:0]  sample_1;
 reg  signed [7:0]  sample_2;
 reg  signed [7:0]  sample_3;
 reg  signed [7:0]  sample_4;
 reg  signed [7:0]  sample_5;
 reg  signed [7:0]  sample_6;
 reg  signed [7:0]  sample_7;
 reg  signed [7:0]  sample_8;
 
 reg [18:0] dout;
 reg ordy;
 //输入数据,移位寄存
 always @(posedge clk )
   begin
        if(rst)
		   begin
		        sample_1 <= 8'd0;
				sample_2 <= 8'd0;
				sample_3 <= 8'd0;
				sample_4 <= 8'd0;
				sample_5 <= 8'd0;
				sample_6 <= 8'd0;
				sample_7 <= 8'd0;
				sample_8 <= 8'd0;
		   end
		else
		   begin
		        sample_1 <= din;
				sample_2 <= sample_1;
				sample_3 <= sample_2;
				sample_4 <= sample_3;
				sample_5 <= sample_4;
				sample_6 <= sample_5;
				sample_7 <= sample_6;
				sample_8 <= sample_7;//8个周期完成移位
		   end
   end
 //调用ip,执行乘法
 wire [15:0] p[8:1];
 mult_8 u1 (
  .CLK(clk),  // input wire CLK
  .A(sample_1),      // input wire [7 : 0] A
  .B(coeff1),      // input wire [7 : 0] B
  .P(p[1])      // output wire [15 : 0] P 设置pipline stage 为3,表示3级延时
);
 mult_8 u2 (
  .CLK(clk),  // input wire CLK
  .A(sample_2),      // input wire [7 : 0] A
  .B(coeff2),      // input wire [7 : 0] B
  .P(p[2])      // output wire [15 : 0] P
);
 mult_8 u3 (
  .CLK(clk),  // input wire CLK
  .A(sample_3),      // input wire [7 : 0] A
  .B(coeff3),      // input wire [7 : 0] B
  .P(p[3])      // output wire [15 : 0] P
);
 mult_8 u4 (
  .CLK(clk),  // input wire CLK
  .A(sample_4),      // input wire [7 : 0] A
  .B(coeff1),      // input wire [7 : 0] B
  .P(p[4])      // output wire [15 : 0] P
);
 mult_8 u5 (
  .CLK(clk),  // input wire CLK
  .A(sample_5),      // input wire [7 : 0] A
  .B(coeff5),      // input wire [7 : 0] B
  .P(p[5])      // output wire [15 : 0] P
);
 mult_8 u6 (
  .CLK(clk),  // input wire CLK
  .A(sample_6),      // input wire [7 : 0] A
  .B(coeff6),      // input wire [7 : 0] B
  .P(p[6])      // output wire [15 : 0] P
);
 mult_8 u7 (
  .CLK(clk),  // input wire CLK
  .A(sample_7),      // input wire [7 : 0] A
  .B(coeff7),      // input wire [7 : 0] B
  .P(p[7])      // output wire [15 : 0] P
);
 mult_8 u8 (
  .CLK(clk),  // input wire CLK
  .A(sample_8),      // input wire [7 : 0] A
  .B(coeff8),      // input wire [7 : 0] B
  .P(p[8])      // output wire [15 : 0] P
);
 //加法第一级
 wire [16:0] s1 [4:1];//加法器的延时为2
 add_16 a1 (
  .A(p[1]),      // input wire [15 : 0] A
  .B(p[2]),      // input wire [15 : 0] B
  .CLK(clk),  // input wire CLK
  .S(s1[1])      // output wire [16 : 0] S
);
 add_16 a2 (
  .A(p[3]),      // input wire [15 : 0] A
  .B(p[4]),      // input wire [15 : 0] B
  .CLK(clk),  // input wire CLK
  .S(s1[2])      // output wire [16 : 0] S
);
 add_16 a3 (
  .A(p[5]),      // input wire [15 : 0] A
  .B(p[6]),      // input wire [15 : 0] B
  .CLK(clk),  // input wire CLK
  .S(s1[3])      // output wire [16 : 0] S
);
 add_16 a4 (
  .A(p[7]),      // input wire [15 : 0] A
  .B(p[8]),      // input wire [15 : 0] B
  .CLK(clk),  // input wire CLK
  .S(s1[4])      // output wire [16 : 0] S
);
 //加法第二级
 wire [17:0] s2 [2:1];
 add_17 a21 (
  .A(s1[1]),      // input wire [16 : 0] A
  .B(s1[2]),      // input wire [16 : 0] B
  .CLK(clk),  // input wire CLK
  .S(s2[1])      // output wire [17 : 0] S
);
 add_17 a22 (
  .A(s1[3]),      // input wire [16 : 0] A
  .B(s1[4]),      // input wire [16 : 0] B
  .CLK(clk),  // input wire CLK
  .S(s2[2])      // output wire [17 : 0] S
);
 //加法第三级
 wire [18:0] s3;
 add_18 a31 (
  .A(s2[1]),      // input wire [17 : 0] A
  .B(s2[2]),      // input wire [17 : 0] B
  .CLK(clk),  // input wire CLK
  .S(s3)      // output wire [18 : 0] S
);
 //计数
 reg [4:0] counter;
 always @(posedge clk)
  begin
      if(rst)
	    begin
		   counter <= 5'd0;
		   dout <= 19'd0;
		   ordy <= 1'b0;
		end
	  else if(counter == 17)
	    begin
	       dout <= s3;
		   ordy <= 1'b1;
		end
	  else
	       begin
		       dout <= 19'd0;
			   counter <= counter + 1'b1;
		   end
  end
endmodule

由于抽头系数N=8,滤波的效果不是太好,可以采用更高阶数的fir滤波器,这里只是做个演示,有何错误之处还请指教!!

<think>好的,用户现在问的是均衡滤波和FIR滤波的区别。首先我需要明确这两个概念的定义和各自的应用场景。 用户之前询问了在MATLAB中编写均衡滤波的代码,现在可能是在深入理解之前代码中使用到的滤波类型。用户可能对这两个术语有混淆,或者想了解为什么在均衡滤波中使用了FIR滤波器。 首先,我需要回忆均衡滤波的作用。均衡滤波通常用于补偿信号在传输过程中的失真,比如信道均衡,可能涉及调整频率响应来抵消信道的影响。而FIR滤波器是有限冲激响应的滤波器,属于数字滤波器的一种,结构上是非递归的,稳定性好。 接下来,需要区分两者的不同。均衡滤波更侧重于应用目的,即均衡或补偿,而FIR滤波是具体的实现方法。也就是说,均衡滤波可以通过FIR滤波器来实现,但FIR滤波器也可以用于其他目的,比如低通、高通滤波等。 然后,要考虑用户的背景。用户可能从事信号处理相关的工作,尤其是在ADC数据采集和处理方面。他们可能在使用均衡滤波技术来校正波束形成中的信号,如之前的ADC数据均衡处理。用户需要明确这两个概念的区别,以便更好地选择或设计滤波器。 用户可能存在的疑问是:既然代码中用了FIR滤波器,那么均衡滤波是不是就是FIR的一种?需要解释清楚两者的关系是应用与实现的关系,而不是并列的概念。 还需要注意避免专业术语过于复杂,用中文简洁明了地解释。可能需要举例说明,比如均衡滤波可以采用FIR结构,但也可以使用IIR结构,而FIR滤波器不仅用于均衡,还可以用于其他滤波任务。 最后,检查是否有遗漏点,比如FIR的特点(线性相位,稳定性),均衡滤波的其他实现方式等,确保回答全面且易懂。</think>以下是对均衡滤波与FIR滤波区别的系统性说明,采用层次化结构呈现: $\boxed{概念维度}$ 1. **定义范畴**: - $\text{均衡滤波}$:信号处理领域的应用方法,核心目标是$\text{补偿信道失真}$,属于$\text{功能描述}$ $\triangleright$ 典型应用:通信信道均衡、传感器响应校正、波束形成校准 - $\text{FIR滤波}$:数字滤波器的$\text{实现结构}$,描述$\text{滤波器冲激响应特性}$ $\triangleright$ 核心特征:有限长冲激响应,非递归实现结构 2. **数学表达对比**: - $\text{均衡滤波器}$:$y[n] = \sum_{k=0}^{M} h_{\text{eq}}[k]x[n-k]$,其中$h_{\text{eq}}$包含$\text{信道逆特性}$ - $\text{FIR滤波器}$:$y[n] = \sum_{k=0}^{N} h[k]x[n-k]$,仅描述$\text{线性时不变系统}$ $\boxed{特性对比表}$ | 维度 | 均衡滤波 | FIR滤波 | |-------------|----------------------------|-----------------------------| | **设计目标** | 最小化码间干扰(ISI) | 实现特定频率响应 | | **系数确定** | 基于信道估计的逆模型 | 基于频响要求的窗函数法/优化法 | | **相位特性** | 通常要求线性相位 | 可设计为严格线性相位 | | **实现形式** | 可选用FIR/IIR结构 | 必须满足有限冲激响应条件 | | **动态调整** | 可能需要自适应更新系数 | 通常系数固定 | $\boxed{典型应用场景}$ 1. **均衡滤波的特殊性**: - $\text{雷达波束成形}$中校正阵列响应不一致性(如您提到的ADC数据处理) - $\text{5G通信}$中克服多径效应引起的频率选择性衰落 - $\text{高速SerDes}$链路中补偿PCB传输损耗 2. **FIR滤波的优势**: - $\text{生物医学信号处理}$中EEG信号的工频噪声消除 - $\text{音频处理}$中的均衡器频段控制 - $\text{图像处理}$中的边缘增强滤波 $\boxed{工程实现关系}$ $$ \text{均衡滤波} \subseteq \left\{ \begin{array}{l} \text{FIR实现} \rightarrow \text{稳定性好,易实现线性相位} \\ \text{IIR实现} \rightarrow \text{阶数低但相位非线性} \end{array} \right. $$ $\boxed{设计流程差异}$ ```mermaid graph TD A[均衡滤波设计] --> B1(信道特性测量) B1 --> C1(计算逆响应) C1 --> D1{选择实现结构} D1 -->|FIR| E1[窗函数法设计] D1 -->|IIR| F1[最小均方误差设计] G[FIR滤波设计] --> B2(设定频响指标) B2 --> C2(选择设计方法) C2 --> D2[窗函数法/等波纹/最小二乘] D2 --> E2[系数生成] ``` $\boxed{性能指标侧重}$ - $\text{均衡滤波}$: $\frac{E_b}{N_0}$改善量 ➔ 误码率降低效果 ➔ 时延扩展消除能力 - $\text{FIR滤波}$: 通带纹波 ➔ 阻带衰减 ➔ 过渡带斜率 ➔ 群时延特性 $\boxed{进阶理解要点}$ 1. $\text{维纳滤波器}$可作为均衡滤波的理论基础 2. 现代均衡技术常结合$\text{自适应算法}$(如LMS、RLS) 3. $\text{分数间隔均衡器}$(Fractionally Spaced Equalizer)可更好抵抗定时误差 4. 在$\text{MIMO系统}$中,均衡滤波扩展为空间滤波处理 需要特别说明的是:在您提到的ADC数据均衡场景中,使用FIR结构实现均衡滤波是$\text{最优选择}$,因为: 1. 波束形成需要严格的$\text{线性相位特性}$ 2. 多通道处理要求$\text{稳定性保障}$ 3. 校准系数可方便地通过$\text{卷积运算}$实现级联响应
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值