Xilinx的FIR IP核产生的.coe文件的格式如下:
radix = RADIX;
coefdata = VECTOR;
RADIX为数据进制类型,包括十进制、二进制、十六进制。
VECTOR为数据,数据以","为间隔进行分开,最后以"; "结尾。
下面以产生匹配滤波器的系数为例:
信号位线性调频信号,信号取反共轭(因为这里原信号为对称信号,所以只需要共轭)后得到匹配滤波器的冲激响应,取实部得到I通道的滤波器,取虚部得到Q通道的匹配滤波器,这里以Q通道的滤波器系数产生为例。
matlab代码如下:
fs = 20e6; % sample frequency 采样率
B = 4e6;
T = 16e-6; %时宽
C = 3e8;
K = B/T;
t_wav = ([1:T*fs]-T*fs/2)/fs;
wav_ref = exp(-1i*pi*K*t_wav.^2); %信号取反共轭
wav_ref = wav_ref(1:2:end);
wav_ref_cos=round((2^(14-1)-1)*real(wav_ref)); %转换成定点数
wav_ref_sin=round((2^(14-1)-1)*imag(wav_ref));
%产生coe文件
fid = fopen('fir_q.coe','w');
fprintf(fid,'radix = 10;\n');
fprintf(fid,'coefdata =\n');
y=zeros(1,256);
for i=1:1:160
y(i)=wav_ref_sin(i);
if i == 160
fprintf(fid,'%d;',y(i));
else
fprintf(fid,'%d,',y(i));
end
if mod(i,8)==0 && i ~= 0
fprintf(fid,'\n');
end
end
fclose(fid);
因为最后存入ROM的是二进制文件,所以首先将数据从浮点数转换成定点数,N_ADC为数据的位数,M_ADC为数据的个数,为了使数据更加直观,coe文件中一行有8个数据。
得到160个系数的coe文件,如下所示:
最后就可以利用产生的系数文件来产生想要的FIR滤波器。
除了这种方式外,还可以用matlab中的 Filter Designer 工具直接产生coe文件来用于FIR IP核的配置。具体方式为:
对于FIR IP核的使用,可以参考 该文章