如何利用matlab代码来生成FIR低通滤波器系数呢?

描述

首先大概说一下这个工具的使用。

假设我们需要设计一个滤波器:

采样率Fs为30.72MHz。

通带Fpass: 9 MHz,

阻带Fstop: 10MHz

带内波动: Apass: 0.1

带外抑制: Apass: 80

matlab

定点化,将系数归一化,设置如下图,确保输入通带的波形和输出波形幅值基本不变。

matlab

生成的COE文件可以直接被XILINX的 IP核使用。

如果上述生成滤波器系数的步骤,可以通过matlab代码来实现,则会更加的事半功倍。

例如,假如有一个这样的需求

采样率Fs为80MHz。

通带Fpass: 9+n0.5 MHz, (0<=n<=40)

阻带Fstop: 10+n0.5MHz (0<=n<=40)

带内波动: Apass: 0.1

带外抑制: Apass: 80

需要生成41组COE,每次都通过fdatool工具来进行生成,那将是繁琐的。而我们可以通过以下代码来简化工作:


figure(1);
 
Apass = 0.1;
Astop = 80;
Fs = 30.72;
Fpass = 9;
Fstop = 10;
 
dev = [(10^(Apass /20)-1)/(10^(Apass /20)+1)  10^(-Astop/20)];
[n,fo,ao,w] = firpmord([Fpass Fstop] ,[1 0],dev,Fs);
b = firpm(n,fo,ao,w,{20});
bb = round(b*2^15);
plot(bb);
grid;
hold on;
I = find(bb < 0); bb(I) = 65536 + bb(I);
c = [ dec2hex(bb)]; 
fid1 = fopen('d:filter1.coe','w');  
fprintf(fid1,';Create by gzy de tool 
'); 
fprintf(fid1,'Radix = 16;
'); 
fprintf(fid1,'Coefficient_Width = 16;
');  
fprintf(fid1,'CoefData = 
');  
for i = 1 : length(b)-1  
    fprintf(fid1,'%s,
',c(i,end-3:end));    
end;  
fprintf(fid1,'%s;
',c(end,end-3:end));   
fclose(fid1);

上面的代码与fdatool生成的定点化系数完全一致。

 



 

审核编辑:刘清
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分