<div class="blogpost-body" id="cnblogs_post_body">
<p> 主要参照杜勇老师的《数字调制解调技术的MATLAB与FPGA实现》,在这里记录一下,并记录出现的问题</p>
<div>
<strong><span style="font-size:14pt;">1、先根据系统所需要的FIR滤波器的参数在Matlab中设计出FIR的参数,保存到txt文件内。</span></strong>
</div>
<div>
程序如下:
</div>
<div>
<div>
%E4_5_LpfDesign.m
</div>
<div>
%设计一个低通滤波器。采样频率fs=8MHz,过渡带fc=[1MHz 2MHz];
</div>
<div>
%绘出滤波器第数量化前后的幅频响应图;将量化后的滤波器系数写入指定的txt文本文件中
</div>
<div>
function h_pm=LpfDesign
</div>
<div>
fs=12.5*10^6; %采样频率
</div>
<div>
qm=12; %滤波器系数量化位数
</div>
<div>
fc=[2.5*10^6 3*10^6]; %过渡带
</div>
<div>
mag=[1 0]; %窗函数的理想滤波器幅度
</div>
<div>
%设置通带容限a1及阻带容限a2
</div>
<div>
%通带衰减ap=-20*log10(1-a1)=0.915dB,阻带衰减为as=-20*log10(a2)=40dB
</div>
<div>
a1=0.1;a2=0.01;
</div>
<div>
dev=[a1 a2];
</div>
<div>
%采用凯塞窗函数获取满足要求的最小滤波器阶数
</div>
<div>
%因为凯塞窗具有可调选项,因此可以根据过渡带和波纹参数等计算出凯塞窗的β值和滤波器阶数
</div>
<div>
%n:阶数 Wn:归一化频带边缘 beta:Kaiser窗beta参数 ftype:滤波器类型用于fir1函数
</div>
<div>
[n,wn,beta,ftype] = kaiserord(fc,mag,dev,fs)
</div>
<div>
</div>
<div>
%采用firpm函数设计最优滤波器
</div>
<div>
%因为用firpm函数(最优滤波器)和凯塞窗和海明窗滤波器比较,第一旁瓣电平比凯塞窗约低2.5db,且阻带波纹相同,而凯塞窗的阻带波纹却逐渐减少
</div>
<div>
fpm=[0 fc(1)*2/fs fc(2)*2/fs 1]; %firpm函数的频段向量
</div>
<div>
magpm=[1 1 0 0]; %firpm函数的幅值向量
</div>
<div>
h_pm=firpm(n,fpm,magpm); %设计最优滤波器
</div>
<div>
</div>
<div>
%量化滤波系数
</div>
<div>
a=abs(h_pm);
</div>
<div>
b=max(a);
</div>
<div>
c=h_pm/b;
</div>
<div>
q_pm=round(h_pm/max(abs(h_pm))*(2^(qm-1)-1));
</div>
<div>
</div>
<div>
%将生成的滤波器系数数据写入FPGA所需的txt文件中
</div>
<div>
<span style="color:#ff0000;"> fid=fopen('E:\毕设\4、code\2、FIR\FIR滤波器_YH\MATLAB图例\lpf.txt','w');</span>
</div>
<div>
<span style="color:#ff0000;"> for k=1:length(h_pm)</span>
</div>
<div>
<span style="color:#ff0000;"> fprintf(fid,'%12.12f\r\n',h_pm);</span>
</div>
<div>
<span style="color:#ff0000;"> if(k~=length(h_pm))</span>
</div>
<div>
<span style="color:#ff0000;"> fprintf(fid,'\r\n');</span>
</div>
<div>
<span style="color:#ff0000;"> end</span>
</div>
<div>
<span style="color:#ff0000;"> end</span>
</div>
<div>
<span style="color:#ff0000;"> fclose(fid);</span>
</div>
<div>
</div>
<div>
%获取量化前后滤波器的幅频响应数据
</div>
<div>
m_pm=20*log10(abs(fft(h_pm,1024))); m_pm=m_pm-max(m_pm);
</div>
<div>
q_pm=20*log10(abs(fft(q_pm,1024))); q_pm=q_pm-max(q_pm);
</div>
<div>
</div>
<div>
%设置幅频响应的横坐标单位为MHz
</div>
<div>
x_f=[0:(fs/length(m_pm)):fs/2]/10^6;
</div>
<div>
%只显示正频率部分的幅频响应
</div>
<div>
mf_pm=m_pm(1:length(x_f));
</div>
<div>
mf_qm=q_pm(1:length(x_f));
</div>
<div>
</div>
<div>
%绘制幅频响应曲线
</div>
<div>
plot(x_f,mf_pm,'--',x_f,mf_qm,'-');
</div>
<div>
xlabel('频率(MHz)');ylabel('幅度(dB)');
</div>
<div>
legend('未量化','12位量化');
</div>
<div>
grid;
</div>
<div>
<img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-6cfde23f5fb45d5ba8c31f4482d98399.png">
<p></p>
</div>
<div>
上边红色部分:需要注意的就是最后一个系数后面不能有回车,否则导入系数文件的时候又会被FIR Complier识别为一个新的系数。
</div>
<div>
</div>
<div>
<div>
<span style="font-size:14pt;"><strong>2、产生测试激励信号文件</strong></span>
</div>
<div>
clear all;clc;
</div>
<div>
Fs=12500000;%设定采样频率
</div>
<div>
f1=2500000;%信号频率 2.5MHZ
</div>
<div>
f2=3100000;%信号频率 3.1MHZ
</div>
<div>
N=12; %量化位数 |
|