内容发布更新时间 : 2024/11/15 18:44:40星期一 下面是文章的全部内容请认真阅读。
QQ:290632690 肤浅。。。制作
MATLAB设计,FPGA实现,联合ISE和Modelsim仿真的FIR滤波器设计
摘要:本文首先利用MATLAB产生两个频率不一样的正弦信号,并将这两个正弦信号相加,得到一个
混叠的波形;然后利用MATLAB设计一个FIR低通滤波器,并由Verilog实现,联合ISE和Modelsim仿真,实现滤除频率较高的信号,并将滤波后的数据送到MATLAB中分析。
本文首先介绍FIR滤波器的基本原理,然后从目前最流行的的设计方式入手,逐步介绍FIR滤波器的设计,其流程图如图1所示:
MATLAB产生仿真所需要的输入信号在Modelsim中用Verilog编写仿真测试文件以十六进制的格式存放到.txt格式的文本文件中通过系统函数$readmemh读入.txt格式的仿真数据在Modelsim中做功能仿真和时序仿真调用$fopen函数打开另外一个数据文件在MATLAB中将仿真输出输出读入一个数组做分析调用$fdisply函数将仿真的结果写入上述打开的文件 图1
一、
FIR滤波器的基本原理:
数字滤波器是从分析信号中提取用户需要的信息,滤去不需要的信号成分或者干扰成分。
数字滤波器的数学模型:线性时不变数字滤波器的数学模型在时域中可以用线性常系数差分方程给出:
y[n]???dky[n?k]??pqx[n?q]
k?1q?0NM?p其等效的Z变换为:H(z)?q?0Nk?1Mqz?q
1??dkz?k当dk 全为0时,Z域系统函数只有零点,数字滤波器的单位脉冲响应有限,通常
1
QQ:290632690 肤浅。。。制作
这用滤波器被称为有限冲激响应(FIR)滤波器。它的输出只与当前的输入和过去的输入有关,跟过去的输出无关。FIR滤波器的一个重要特性是具有线性相位,即系统的相异和频率成正比,可达到无失真传输。
更加详细的介绍FIR滤波器的理论算法知识,请参考别的先关书籍资料、 二、
FIR滤波器的设计及验证:
1) 由MATLAB产生FIR滤波器的输入数据,并存放到.txt文件中
用MATLAB产生两个频率分别为:0.5MHz和2MHz的正弦信号,并将这两个正弦信号叠加,得到一个混叠的信号,并将这个混叠信号的波形数据存放到C盘根目录下面的matlab_wave_data.txt文件中。MATLAB实现代码如下: clear all;
fs = 25000000; % 25M 采样率
t = 0:1/fs:0.0002; % 共0.0002 * 25000000 = 5000个点 f1 = 500000; f2 = 2000000;
signal1 = sin(2*pi*f1*t); % 频率为 0.5MHz 的正弦信号
2
QQ:290632690 肤浅。。。制作
signal2 = sin(2*pi*f2*t); % 频率为 2.0MHz 的正弦信
% 由于正、余弦波形的值在[0,1]之间,需要量化成16bit,先将数值放大 y2 = fix(16384 + (2^14 - 1) * signal1); % 量化到 15bit y3 = fix(16384 + (2^14 - 1) * signal2); % 量化到 15bit y1 = y2 + y3; % 量化到 16bit
% 再将放大的浮点值量化,并写道到存放在C盘的文本中 fid = fopen('c:/matlab_wave_data.txt', 'wt');
fprintf(fid, '%x\\n', y1); % 以16进制的格式将数据存放到.txt文件中。如果不用16进制,后面
% 读数会出错。
fclose(fid); plot(y2, 'b'); hold on; plot(y3, 'b'); hold on; plot(y1, 'r');
legend('0.5MHz正弦','2MHz正弦','两者叠加'); title('MATLAB产生的两个正弦信号的叠加波形'); 信号波形图如图2所示:
图2
3