FIR滤波器可以说是FPGA数字信号处理设计的敲门砖。记录直接型FIR设计的流程与方法。
(一)MATLAB设计需求的FIR滤波器
使用MATLAB中的FDATool,在命令行输入fdatool:
之后便弹出fdatool滤波器设计工具:
随后我们可以在界面中设计我们需要的滤波器特性,如本示例将用窗函数法设计一个截止频率15k采样率48k的FIR低通滤波器,设置好各项参数后,点击Design Fitter,得下图滤波器设计完成:
最后,我们将生成MATLAB设计文件,用于我们的设计仿真。在菜单栏中file->Generate MATLAB Coder,便可生成我们需要的m文件。
m文件中包含了函数fir_Design(),函数开始时对滤波器各项参数进行设置,最后生成了我们所需FIR滤波器的系数。代码如下:
function config_parameter = fir_Design();
%*******************************************************
% file : fir_Design.m
% desp : FIR matlab design code
% author : lovejlx2006@163.com
% date : 2011.5.3
% version : 0.1
%*******************************************************
%FIR_DESIGN Returns a config parameter object.
%
% M-File generated by MATLAB(R) 7.6 and the Signal Processing Toolbox 6.9.
%
% Generated on: 27-Apr-2011 21:38:49
%
% FIR Window Lowpass filter designed using the FIR1 function.
% All frequency values are in Hz.
Fs = 48000; % Sampling Frequency
Fpass = 15000; % Passband Frequency
Fstop = 16000; % Stopband Frequency
Dpass = 0.057501127785; % Passband Ripple
Dstop = 6.3095734448e-005; % Stopband Attenuation
flag = 'scale'; % Sampling Flag
% Calculate the order from the parameters using KAISERORD.
[N,Wn,BETA,TYPE] = kaiserord([Fpass Fstop]/(Fs/2), [1 0], [Dstop Dpass]);
% Calculate the coefficients using the FIR1 function.
b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag);
in_word_len = 8;
coef_word_len = 16;
addr_word_len = ceil(log2(length(b)/2));
out_word_len = in_word_len + ceil(log2(length(b)));
b_fixed = round(b*(2^(coef_word_len-1)-1));
% output magnitude and phase
figure
freqz(b);
%Hd = dfilt.dffir(b);
config_parameter.Fs = Fs;
config_parameter.coef_float = b;
config_parameter.coef_fixed = b_fixed;
config_parameter.coef_len = length(b);
config_parameter.in_word_len = in_word_len;
config_parameter.coef_word_len = coef_word_len;
config_parameter.addr_word_len = addr_word_len;
config_parameter.out_word_len = out_word_len;
config_parameter.simdata_len = 100*length(b);
end
% [EOF]
文件中自己添加部分是为了给FPGA设计定义参数,便于之后我们做算法仿真时调用该函数。并输出了FIR滤波器的频率特性:
用户418919 2012-4-25 13:51