好久没有写博文了,记录一下对于大带宽信号的低通滤波器的设计
宽带信号采样
对于大带宽信号,需要用极高的采样率对信号进行采样,那么采样后的数字信号数据速率极高,FPGA无法运行在如此高的频率下对高速率数字信号进行处理,所以对于宽带信号,采样后会分为多路并行的低速数据流进入FPGA,如下图所示:
宽带低通滤波器结构
以输入宽带信号为8路并行的形式为例,讨论宽带滤波器结构。我们以FIR滤波器为基础来设计宽带低通滤波器,并采用并行计算的方式实现高速信号处理。所以本例的宽带滤波器以多相滤波的形式,采用8个FIR滤波器,对8路输入信号进行并行计算。
在此例中,系统时钟频率设置为采样频率的1/8,所以输入信号延时一个系统时钟周期相当于延时了8个采样周期,所以用8个N-1阶的FIR滤波器并行滤波时,需要每一个滤波器的输入信号相位各自相差一个采样周期,这样既可得到滤波后相位也各自相差一个采样周期的并行输出信号。这8个FIR滤波器的并行计算公式如下:
根据上式设计的结构框图如下:
宽带低通滤波器的实现与仿真
根据上图滤波器结构实现的HDL核心代码如下:
assign din={data_in1,data_in2,data_in3,data_in4,data_in5,data_in6,data_in7,data_in8};
always @(posedge clk)
begin
if(en&nd)
begin
din_d0 <= din;
din_d1 <= din_d0;
din_d2 <= din_d1;
din_d3 <= din_d2;
din_d4 <= din_d3;
nd_d0 <= 1'b1;
end
else if(en)
begin
din_d0 <= din_d0;
din_d1 <= din_d1;
din_d2 <= din_d2;
din_d3 <= din_d3;
din_d4 <= din_d4;
nd_d0 <= 1'b0;
end
else
begin
din_d0 <= 'H0;
din_d1 <= 'H0;
din_d2 <= 'H0;
din_d3 <= 'H0;
din_d4 <= 'H0;
nd_d0 <= 1'b0;
end
end
always @(posedge clk)
begin
if(nd_d0)//
begin
data00 <= din_d0[ 159:140]; //x7(n)
data01 <= din_d0[ 139:120]; //x6(n)
data02 <= din_d0[ 119:100]; //x5(n)
data03 <= din_d0[ 99: 80]; //x4(n)
data04 <= din_d0[ 79: 60]; //x3(n)
data05 <= din_d0[ 59: 40]; //x2(n)
data06 <= din_d0[ 39: 20]; //x1(n)
data07 <= din_d0[ 19: 0]; //x0(n)
data10 <= din_d1[ 159:140]; //x7(n-1)
data11 <= din_d1[ 139:120]; //x6(n-1)
data12 <= din_d1[ 119:100]; //x5(n-1)
data13 <= din_d1[ 99: 80]; //x4(n-1)
data14 <= din_d1[ 79: 60]; //x3(n-1)
data15 <= din_d1[ 59: 40]; //x2(n-1)
data16 <= din_d1[ 39: 20]; //x1(n-1)
data17 <= din_d1[ 19: 0]; //x0(n-1)
data20 <= din_d2[ 159:140]; //x7(n-2)
data21 <= din_d2[ 139:120]; //x6(n-2)
data22 <= din_d2[ 119:100]; //x5(n-2)
data23 <= din_d2[ 99: 80]; //x4(n-2)
data24 <= din_d2[ 79: 60]; //x3(n-2)
data25 <= din_d2[ 59: 40]; //x2(n-2)
data26 <= din_d2[ 39: 20]; //x1(n-2)
data27 <= din_d2[ 19: 0]; //x0(n-2)
data30 <= din_d3[ 159:140]; //x7(n-3)
data31 <= din_d3[ 139:120]; //x6(n-3)
data32 <= din_d3[ 119:100]; //x5(n-3)
data33 <= din_d3[ 99: 80]; //x4(n-3)
data34 <= din_d3[ 79: 60]; //x3(n-3)
data35 <= din_d3[ 59: 40]; //x2(n-3)
data36 <= din_d3[ 39: 20]; //x1(n-3)
data37 <= din_d3[ 19: 0]; //x0(n-3)
data40 <= din_d4[ 159:140]; //x7(n-4)
data41 <= din_d4[ 139:120]; //x6(n-4)
data42 <= din_d4[ 119:100]; //x5(n-4)
data43 <= din_d4[ 99: 80]; //x4(n-4)
data44 <= din_d4[ 79: 60]; //x3(n-4)
data45 <= din_d4[ 59: 40]; //x2(n-4)
data46 <= din_d4[ 39: 20]; //x1(n-4)
data47 <= din_d4[ 19: 0]; //x0(n-4)
nd_d1 <= 1'b1;
end
else
begin
data00 <= 20'H0;
data01 <= 20'H0;
data02 <= 20'H0;
data03 <= 20'H0;
data04 <= 20'H0;
data05 <= 20'H0;
data06 <= 20'H0;
data07 <= 20'H0;
data10 <= 20'H0;
data11 <= 20'H0;
data12 <= 20'H0;
data13 <= 20'H0;
data14 <= 20'H0;
data15 <= 20'H0;
data16 <= 20'H0;
data17 <= 20'H0;
data20 <= 20'H0;
data21 <= 20'H0;
data22 <= 20'H0;
data23 <= 20'H0;
data24 <= 20'H0;
data25 <= 20'H0;
data26 <= 20'H0;
data27 <= 20'H0;
data30 <= 20'H0;
data31 <= 20'H0;
data32 <= 20'H0;
data33 <= 20'H0;
data34 <= 20'H0;
data35 <= 20'H0;
data36 <= 20'H0;
data37 <= 20'H0;
data40 <= 20'H0;
data41 <= 20'H0;
data42 <= 20'H0;
data43 <= 20'H0;
data44 <= 20'H0;
data45 <= 20'H0;
data46 <= 20'H0;
data47 <= 20'H0;
nd_d1 <= 1'b0;
end
end
filter_paral filter_paral_ch8(
.clk (clk),
.en (en ),
// .fir_coe_sel(fir_coe_sel),
.din00 (data07), .fir_coe00(fir_coe00),
.din01 (data06), .fir_coe01(fir_coe01),
.din02 (data05), .fir_coe02(fir_coe02),
.din03 (data04), .fir_coe03(fir_coe03),
.din04 (data03), .fir_coe04(fir_coe04),
.din05 (data02), .fir_coe05(fir_coe05),
.din06 (data01), .fir_coe06(fir_coe06),
.din07 (data00), .fir_coe07(fir_coe07),
.din08 (data17), .fir_coe08(fir_coe08),
.din09 (data16), .fir_coe09(fir_coe09),
.din10 (data15), .fir_coe10(fir_coe10),
.din11 (data14), .fir_coe11(fir_coe11),
.din12 (data13), .fir_coe12(fir_coe12),
.din13 (data12), .fir_coe13(fir_coe13),
.din14 (data11), .fir_coe14(fir_coe14),
.din15 (data10), .fir_coe15(fir_coe15),
.din16 (data27), .fir_coe16(fir_coe16),
.din17 (data26), .fir_coe17(fir_coe17),
.din18 (data25), .fir_coe18(fir_coe18),
.din19 (data24), .fir_coe19(fir_coe19),
.din20 (data23), .fir_coe20(fir_coe20),
.din21 (data22), .fir_coe21(fir_coe21),
.din22 (data21), .fir_coe22(fir_coe22),
.din23 (data20), .fir_coe23(fir_coe23),
.din24 (data37), .fir_coe24(fir_coe24),
.din25 (data36), .fir_coe25(fir_coe25),
.din26 (data35), .fir_coe26(fir_coe26),
.din27 (data34), .fir_coe27(fir_coe27),
.din28 (data33), .fir_coe28(fir_coe28),
.din29 (data32), .fir_coe29(fir_coe29),
.din30 (data31), .fir_coe30(fir_coe30),
.din31 (data30), .fir_coe31(fir_coe31),
.din32 (data47), .fir_coe32(fir_coe32),
.nd (nd_d1),
.dout(data_out8),
.drdy()
);
filter_paral filter_paral_ch7(
);
filter_paral filter_paral_ch6(
);
....
filter_paral filter_paral_ch1(
);
其中模块filter_paral为常见的FIR滤波器,FIR滤波器为32阶对称型滤波器,滤波器系数由matlab Filter Design工具箱辅助设计,截止频率为500MHz。
Vivado完整代码与工程可在该链接中下载:
链接: https://download.csdn.net/download/wnazhe45/85740354
为了验证该滤波器能滤除高频信号,所以我们将输入信号设置为5MHz的正弦信号与550MHz的正弦信号叠加而成的信号,采样率为1.25GHz,并将信号以8*Ts为周期进行抽取,得到数据速率为156.25MHz的8路并行数据。然后对滤波后的8路并行信号合并为1路进行频谱分析,得到滤波前与滤波后的输入输出信号波形图与频谱图如下:
可见该宽带低通滤波器已经滤除了550MHz的高频分量,验证了设计的正确性。