1. 在TINA中进行带阻网络仿真:
2.对带阻网络进行幅频特性测试:
3. 对生成幅频特性曲线参数进行设置:
扫描类型(Sweep type)选择线性,此类型对低频区分度不够;选择对数型对低频段区分度较好但是在Matlab中计算会出现震荡,慎重选取。
4. 生成幅频特新曲线并导出数据:
5. 导出生成的TXT文件修改里面的内容:
将首行的“*Frequency VF1-abs VF1-phase”删除,最后行的空行也可以删掉,保存退出。
6.将幅频特性数据导入到Matlab的WorkSpace中:
选择导入数据,选择先前的TXT文件确认就可,不同Matlab版本操作有些区别。
7. 使用Matlab计算此幅频特性FIR滤波器的抽头系数:
代码如下:
f=0:0.002:0.998;
hh=VarName2;
hh=hh';
hh=1./hh;
c = firpm(500,f,hh);
[h2,f2]=freqz(c);
f2=f2/pi;
hl=abs(h2);
plot(f2,hl);
xlabel('归一化频率 ');
ylabel('增益');
此代码中c表示的是FIR滤波器的抽头系数。
8. 导出FIR滤波器的系数:
9. 在Quartus II中建立FIR IP核:
确认后选择Step 1,在Browser中导入刚刚生成的cfc文件操作如下:
对生成的FIR滤波器的参数进行设置:
依次选择AD采集数据的编码类型,输入数据宽度,在Cofficients Scaling中的Bit Width选择浮点型转成定点型数据所需的位宽,合适的参数设置会使Floating Coeff.Respose和FixedCoeff.Response曲线基本重合,减小了数据转化时产生的误差,最后选择确认。
在Step2和Step3中直接Finish完成FIR IP核的设置。
10. 原理图中调出FIR IP进行如下连接:
到此步,整个IP核的设计基本完成了,编译整个工程可能得花几分钟时间。
总结:
数字滤波器的设计借鉴了大量网络资源并与周同学讨论最后试出来的,由于时间仓促此设计方法难免会有些纰漏,希望被指正,对此FIR滤波器的设计提出五个改进意见:
1:带阻网络元件的参数跟实际制作的元件的实际值要保持一直,可以通过修改参数值得到想要的带阻网络幅频特性;
2:Matlab的FIR滤波器计算方法有很多种,我们只尝试了FIRPM和FIR2两个函数,其中FIR2低频段滤波效果不好,但是在高频处稳定性较好,幅频特性是平滑的,如果使用不同的窗函数和滤波阶数可能得到更好的效果,有待尝试;
3: 带阻网络的幅频特性只能以线性频率导入到Matlab中,更好的做法是使用对数频率,这样能够做到更加理想的区分度,但是Matlab计算会出现震荡,至今没有找到解决办法,我想这是可以做的到的。
4. Matlab中滤波器设计工具FDATool也能够导入数据,如果能够用FDATool生成滤波系数就不必要编写.m文件了,尝试了几次到那时没有成功。
5. 由于FPGA的资源有限,当想得到较好的滤波效果时经常会出现资源不足,若使用串行数据算法就是在步骤9中structure进行选择串型模式,那么需要的硬件资源将大大减少,得到的FIR IP核有一定的时序关系,但是由于时间关系没有调通,如果此处问题解决将对FPGA设计数字滤波器提供很大的便利。