% 设计高通最优FIR滤波器,过渡带为1000~1500Hz,采样频率为8000Hz,通带容限为0.01,阻带容限为0.001
% 将滤波器系数12bit量化,与无量化时的幅度响应曲线比较
clear
close all;
fs=8000; %采样频率
fc=[1000 1500]; %过渡带
mag=[0 1]; %窗函数的理想滤波器幅度
dev=[0.001 0.01]; %纹波
[n,wn,beta,ftype]=kaiserord(fc,mag,dev,fs); %获取凯塞窗参数
fpm=[0 fc(1)*2/fs fc(2)*2/fs 1]; %firpm函数的频段向量
magpm=[0 0 1 1]; %firpm函数的幅值向量
h_pm=firpm(n,fpm,magpm); %设计最优滤波器
h_pm12=round(h_pm/max(abs(h_pm))*(2^11-1)); %12bit量化
m_pm=20*log(abs(fft(h_pm,1024))); m_pm=m_pm-max(m_pm); %求幅频响应
m_pm12=20*log(abs(fft(h_pm12,1024))); m_pm12=m_pm12-max(m_pm12);
x_f=0:(fs/length(m_pm)):fs/2; %设置幅频响应的横坐标单位为Hz
mf_pm=m_pm(1:length(x_f)); %只显示正频率部分的幅频响应
mf_pm12=m_pm12(1:length(x_f));
%绘制幅频响应曲线
plot(x_f,mf_pm,'-',x_f,mf_pm12,'-.');
xlabel('频率(Hz)');ylabel('幅度(dB)');
legend('未量化','12位量化');
grid;
% 设计一个低通滤波器。采样频率fs=8MHz,过渡带fc=[1MHz 2MHz];
% 绘出滤波器第数量化前后的幅频响应图
clear
close all;
fs=8*10^6; %采样频率
qm=12; %滤波器系数量化位数
fc=[1*10^6 2*10^6]; %过渡带
mag=[1 0]; %窗函数的理想滤波器幅度
%设置通带容限a1及阻带容限a2
%通带衰减ap=-20*log10(1-a1)=0.915dB,阻带衰减为as=-20*log10(a2)=40dB
a1=0.1;
a2=0.01;
dev=[a1 a2];
%采用凯塞窗函数获取满足要求的最小滤波器阶数
[n,~,~,ftype]=kaiserord(fc,mag,dev,fs);
%采用firpm函数设计最优滤波器
fpm=[0 fc(1)*2/fs fc(2)*2/fs 1]; %firpm函数的频段向量
magpm=[1 1 0 0]; %firpm函数的幅值向量
h_pm=firpm(n,fpm,magpm); %设计最优滤波器
q_pm=round(h_pm/max(abs(h_pm))*(2^(qm-1)-1)); %量化滤波系数
m_pm=20*log10(abs(fft(h_pm,1024))); m_pm=m_pm-max(m_pm); %求幅频响应
q_pm=20*log10(abs(fft(q_pm,1024))); q_pm=q_pm-max(q_pm);
x_f=[0:(fs/length(m_pm)):fs/2]/10^6; %设置幅频响应的横坐标单位为MHz
mf_pm=m_pm(1:length(x_f));
mf_qm=q_pm(1:length(x_f));
%绘制幅频响应曲线
plot(x_f,mf_pm,'--',x_f,mf_qm,'-');
xlabel('频率(MHz)');ylabel('幅度(dB)');
legend('未量化','12位量化');
grid;
对滤波器系数进行量化处理一定会带来有限字长效应,但是有限字长效应影响的大小需要根据实际情况而定。对比图1与图2可以看出,12bit量化之后图1对性能的影响比图2对性能影响大很多。这是为什么呢?因为在设计高通滤波器时,过渡带很窄,滤波器的长度为61;在设计低通滤波器时,过渡带较宽,滤波器的长度为19。由于FIR滤波器其实是一个乘积累计运算,显然滤波器长度越长,则相同的量化位数所造成的累加运算误差越大。