目录
FIR滤波器
1、dB的含义
dB(分贝是一个表征相对值大小的单位),两种功率之比或者电压/电流/声量之比。
功率之比:
d
B
=
10
l
g
X
dB =10lgX
dB=10lgX。由于
10
l
g
0.5
=
−
3
10lg0.5=-3
10lg0.5=−3,因此半功率点是-3dB,相当于功率下降为原来的1/2。
电压/电流/声量之比:
d
B
=
20
l
g
X
dB =20lgX
dB=20lgX。原来在-3dB下变化为原来赋值增益的
2
/
2
\sqrt{2}/2
2/2,也就是即
20
l
g
2
/
2
=
−
3
20lg\sqrt{2}/2=-3
20lg2/2=−3.
2、滤波器的类型
类型 | 作用 |
---|---|
高通滤波器 | 衰减或消除指定频率以下的频率 |
低通滤波器 | 衰减或消除指定频率以上的频率 |
带通滤波器 | 允许指定频率范围内的信号通过 |
带阻滤波器 | 去除指定范围内的信号频率 |
3、各种滤波器的特点(FIR、IIR)
1、IIR使用滤波器的输出作为输入;而FIR不使用。
2、相对于FIR滤波器,IIR能使用相对较低的阶数和项数。
3、FIR与IIR相比,IIR的计算速度更快,但同样具有稳定问题以及非线性相位的问题。因此,IIR多用于实时的滤波器应用。
4、FIR在不同频率下的延迟一致;IIR在不同频率的延迟不同。
4、实现FIR滤波器
①仿真实现正弦激励的输入(200KHz以及15MHz正弦波)
使用matlab仿真实现正弦激励的输入(200KHz以及15MHz正弦波),采样后激励波形的值,记录在txt文档中,供testbench文件进行读取。matlab代码如下所示:
%将一个频率大小为200k以及15M的波形进行合成,模拟得出采样后的波形大小,间隔采
%后输入testbench测试文件,当作激励输入。
f1=200e3; %设置第一个波的频率为200KHz
f2=15e6; %设置第二个波的频率为15MHz
Fs=50e6; %设置采样频率
L=1000; %数据长度大小为1000,采样点数
N=8; %数据位宽(决定每一个数据采集的精度)
t=0:1/Fs:(L-1)*(1/Fs);%设置采样间隔;采样频率越高,采样的间隔越短
y1= fix(63*(cos(2*pi*f1*t) + cos(2*pi*f2*t)));
%量化合成两种频率的波形(200KHz以及15MHz)
plot(t,y1);
title('输入信号');
xlabel('时间');
ylabel('幅度');
fid=fopen('C:\路径\sin_data.txt','w'); %数据写入
for k=1:length(y1)%二进制变换
B_s=dec2bin(y1(k)+((y1(k))<0)*2^N,N);
for j=1:N
if B_s(j)=='1'
tb=1;
else
tb=0;
end
fprintf(fid,'%d',tb);
end
fprintf(fid,'\r\n');
end
fprintf(fid,';');
fclose(fid);
②仿真FIR滤波器
参考文档: FIR滤波器的FPGA实现.
可以使用文中两种方式实现FIR滤波器,分别是直接实现,以及使用量化后的实现方式。下面放出自己使用matlab仿真后的效果图。(7阶的滤波器的8位量化的系数:4、28、46、61、61、46、28、4。)
滤波前的时域和频域:
滤波后的时域和频域:
③Vivado配置
Tips1:配置Vivado与vscode的联调环境,使用vscode作为Vivado的编辑器。
选择setting,选择文本编辑器为Custom Editor,并点击选中vscode安装目录下的Code.exe文件。
将路径输入Editor中:E:/路径/Code.exe [file name] -[line number],如下图所示。
配置完成后就可以自动使用vscode打开Vivado中的.v文件、仿真文件等,配置vscode中的相关代码补齐、高亮插件,编辑十分好用。
Tips2:使用vscode中的Testbench插件,直接生成仿真文件框架
安装testbench插件,使用ctrl+shift+p可以唤出。
运行Testbench后,可以直接在终端生成Testbench代码框架。对Testbench的使用十分方便。(如果遇到不能运行的情况,可以退出Vscode,并且在外面使用vscode打开.v文件,不适用Vivado的内部链接打开)
④Vivado配置FIR滤波器
具体代码可以参考参考文档: FIR滤波器的FPGA实现.
下面就不放出具体代码文本,本文参考直接实现的方式。将量化后的波形数据量,逐一输入至滤波器中,根据这个7阶的滤波器得其8位量化的系数:4 28 46 61 61 46 28 4。与系数相乘后,求和(相当于一次卷积操作)。得到滤波之后的结果。
⑤Vivado的Testbench文件
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/09/25 13:36:51
// Design Name:
// Module Name: tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
`timescale 1ns / 1ps
module tb_lpf_direct;
// lpf_direct Parameters
parameter PERIOD = 20;
// lpf_direct Inputs
reg clk ;//时钟
reg reset ;//复位信号
reg [7:0] x_in ;//输入信号
// lpf_direct Outputs
wire [24:0] y_out; //输出信号
integer i;
initial begin
clk = 0 ;
reset = 0 ;
x_in = 0 ;
i = 0;
end
initial begin
forever #(PERIOD/2) clk=~clk; //产生时钟
end
initial begin
#(PERIOD*2) reset = 1; //复位信号
end
parameter data_num = 32'd10000;
reg [7:0] data_men[data_num:1];//采用的是8位的数字,并且数据的长度为10000
initial begin
$readmemb("C:/路径/sin_data.txt",data_men); //每一个数据的读取
end
always @(posedge clk) begin //每一个时钟周期输入一个采样数据,放入x_in中
x_in <= data_men[i];
i <= i+1;
end
lpf_direct u_lpf_direct (
.clk ( clk ),
.reset ( reset ),
.x_in ( x_in [7:0] ),
.y_out ( y_out [24:0] )
);
endmodule
⑥Vivado运行仿真文件
1、选择波形为模拟波形显示,选择类型为有符号类型数据。
2、进行滤波仿真,x_in为输入的滤波波形数据,y_out为输出的滤波波形数据。
FIR仿真后的结果,低通滤波器将高频信号滤除,保留低频信号。