在 MATLAB 中,可以将滤波器系数保存为 .coe 文件,这种文件格式通常用于 FPGA 中,特别是在 Xilinx 的 FPGA 系统中。.coe 文件是一个文本文件,包含了滤波器系数的16进制或二进制表示。

一般我们通过如下的方式生成FPGA中所需的COE文件格式:

现在我们通过代码形式生成:

(此代码为多级HB滤波器的代码之一,切滤波器进行了优化,与之前直接生成的滤波器有点区别,仅供参考)


clear;
fp=20;%前5级半带滤波器和最后一级FIR的通带上限频率fp=20HZ
fs=25;%最后一级滤波器阻带下限频率fs=25HZ
F0=3200;%输入信号抽样频率
Fout=50;%输出信号抽样频率
dev=0.001;%整体系统的通、阻带容限
Q=12;%12位量化
D=log2(F0/Fout);%系统的总抽取倍数为F0/Fout,D为多少级数
devi=dev/D;%每一个HBF的通、阻带容限

%先用kaiserord求取最小滤波器阶数
%再用函数firpm设计最优滤波器
%抽样频率100Hz,wp=20Hz,ws=25Hz,阶数95阶
fc=[20 25];mag=[1 0];devk=[devi,dev];%通、阻带容限
[n,wn,beta,ftype]=kaiserord(fc,mag,devk,Fout*2); %获取最后一级滤波器的阶数
fpm=[0 fc(1)*2/Fout/2 fc(2)*2/Fout/2 1];         %firpm函数的频段向量
magpm=[1 1 0 0];                                 %firpm函数的幅值向量
b6=firpm(n,fpm,magpm); L6=length(b6)%最大误差,最小准则下的最优滤波器

%将FIR滤波器进行12位量化后存入coe文件中
bb=round(b6/max(abs(b6))*(2^(Q-1)-1));
I = find(bb < 0); bb(I) = 4096 + bb(I);
c = [ dec2hex(bb)]; 
fid = fopen('D:\User\Administrator\Desktop\hf_12bit.coe','w');
fprintf(fid,'; XILINX CORE Generator(tm)Distributed Arithmetic FIR filter coefficient (.COE) File \n'); 
fprintf(fid,'Radix = 16;\n'); 
fprintf(fid,'Coefficient_Width = 12;\n');  
fprintf(fid,'CoefData = \n');  
for i = 1 : length(b6)-1  
    fprintf(fid,'%s,\n',c(i,end-2:end));%获取每一行的最后三个元素    
end 
fprintf(fid,'%s;\n',c(end,end-2:end));   
fclose(fid);

生成之后的COE文件如下:

更多推荐