作者:桂。

时间:2017-08-15  20:28:11

链接:http://www.cnblogs.com/xingshansi/p/7367738.html


前言

一、Fdatool基本操作

  Command输入fdatool,例如FIR采用窗函数法设计16阶低通filter,fc(frequency cutoff) = 10800Hz,fs = 48000Hz,输入参数:

fdatool的滤波器设计-LMLPHP

需要注意的是由于存在常数项,N阶Filter用N-1阶设计即可。

设计完滤波器并不是直接导出,通常需要两个后处理操作:

1)验证滤波器是否符合要求:幅频响应、相频响应,零极点图、群延迟等等,都可以通过上方的Analysis点击查看。

2)系数量化。通常DSP/FPGA需要定点操作,点击左方的量化,进行位数设定。

设计完成之后,可以File——Export,将滤波器参数导出,导出的滤波器格式可以自行选择。

左方的图标功能依次(自上而下)为:

1)Create a multi-rate filter:创建多速率滤波器;

2)Transform filter:滤波器转换;

3)Set quantization parameters:设置量化参数;

4)Realize Model:实现模型;

5)Pole-zero editor:零极点编辑器;

6)import filter:导入滤波器;

7)Design filter:设计滤波器;

二、定点/浮点转化

  定点就是位数固定,浮点通常表示为:2.2e8,即xyz的形式,x:常数,y:基底,z:指数。浮点转换为定点在MATLAB中称为量化,使用quantizer和quantize两个函数完成,通常为了便于表示,也会使用num2bin,num2int,num2hex等指令。

1-quantizer

  用于定义数据的量化属性,具体可doc fixedpoint/quantizer,参数详细设定可参考描述:

fdatool的滤波器设计-LMLPHP

2-quantize

按照quantizer定义的量化属性量化浮点数据。

以上文的16阶滤波器为例:

fdatool的滤波器设计-LMLPHP

有符号数,先放大100倍,整数最大为41:2^6 > 41,最小需要6位整数,又希望扩大100倍后的数据,小数点后精确到0.01(即原数据精度:1e-4),2^-7 < 0.01,即需要7位小数。

共需要位数N = 1符号位+6整数位+7小数位 = 14位,

其中小数m = 7位。

N = 14;
m = 7;
q = quantizer('fixed','round','saturate',[N,m]);
fix_fir = quantize(q,fir_coef*100);
[fix_fir;fir_coef*100]

结果可以看出,量化的数据达到了精度要求(上为量化数据,下为原始数据):

fdatool的滤波器设计-LMLPHP

有时候为了表示方便,习惯了二进制的表达方式(有符号数,负数用补码表示):

num2bin(q,fix_fir)

  这一操作也为含有小数的负数求解补码提供了思路,打印信息如下(类似指令num2int,num2hex类似):

fdatool的滤波器设计-LMLPHP

05-18 03:09