用matlab的fdatool设计滤波器,导出参数,然后在FPGA中设计滤波器的方法。

1、设计fir插值滤波

2、设计半带滤波器

3、CIC滤波器

4、频谱相关

111111111111111111111111111111111111111111111111111

1、设计fir插值滤波

MATLAB 中fir插值滤波

MATLB产生系数的方法:在命令行中输入fdatool

MATLAB与FPGA设计滤波器2-1

MATLAB与FPGA设计滤波器2-1

MATLAB与FPGA设计滤波器2-1

注意:creat a multirate filter 设置中,其实设计的是一个多相滤波器。不管怎么更改这里的插值倍数和采样率,其实滤波器的系数是不改变的。原因是,这里的滤波器参数只是多相滤波器中原型滤波器的系数,

所以,滤波器系数不变。但是,为什么滤波器系数不变,反而在调用改滤波器的时候还能实现插值呢?这是因为,你已经设计了该滤波器是多相插值滤波器,在数据处理中,实际上已经按多相插值来操作了,

多相插值的结构本来就可以实现插值/抽取。

至此,整个滤波器就设计完成了。需要生成滤波器的FIR文件和滤波系数。

MATLAB与FPGA设计滤波器2-1

ISE 中fir插值滤波

采用FIR滤波器中第一个版本的

MATLAB与FPGA设计滤波器2-1MATLAB与FPGA设计滤波器2-1

 说明:这里输出精度的截尾其实是有技巧的。如果是全精度输出,则高几位经常都是符号位。但是怎么截取才能不导致有效数据丢失呢?以前的做法是,把数据放在MATLAB里找一下最大值,然后,通过最大值来设计位宽。后来,周弘告诉我,可以直接用全精度输出的位数 - 系数扩大的位数即可。上面的 例子,全精度输出36位,则截尾为36 - 18 = 18即可满足要求。

FIR滤波器输出结果,应该为有符号数。将该数据和matlab中的数据对比,高几位差别不是很大,说明正确。 需要注意的是,FIR滤波器的前几位数据是无效数据,不弄用于和matlab对比。通常,在N/2(N为滤波器的阶数)个时钟延迟之后的数据才是真正的FIR输出,可以用于和MATLBA 对比。

2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222

2、设计半带滤波器

MATLAB 中半带滤波器


MATLAB与FPGA设计滤波器2-1

1是由2来自动确定阶数,也可以通过kaiser窗的公式,根据要求来计算滤波器阶数。现在用的方法是,如上图所示,不停的更改Apass的值,看频谱图。

还有一种是确定阶数,设置采样频率,截止频率自动为采样频率的一半。

注意,这个界面设计完成之后,还要进行2倍插值的配置。否则,这只是一个简单的低通滤波器,而不是插值滤波器。

ISE 中半带滤波

1、首先,你导入的COE文件要是半带滤波器的格式。

2、如果你导入的文件是半带滤波器的格式,那么第二个配置界面会有如下变换.注意,差值倍数设置为2

MATLAB与FPGA设计滤波器2-1

FPGA直接调用IP核就可以用这个滤波器了,那MATLAB怎么用呢?

1、用滤波器系数,滤波器的本质就是卷积。所以:Ipulse= conv(Izero,ht); %ht就是滤波器系数,和输入数据卷积即可。----这种方法只适用于没有插值/抽取的滤波器

2、调用matlab生成的M文件。如果该滤波器中有插值或者抽取,就不能用方法1.因为在配置插值的那个界面的时候,其滤波器系数是不变的。只有用下面的方法调用滤波器的时候才能实现插值或者滤波

%---------------------------这个比较麻烦,下面的简单-----------------

% N= 32; %%滤波器阶数
% da = Izero (: , N/2 +1 : end - N/2); %%是为了和xilinx中的数据对应。
% Hd = fir_cos; %%FIR滤波器,在fdatool中产生
% d2= filter ( Hd , [da , zeros(1, N/2) ]); %%将数据通过FIR滤波器。

%---------------------------下面的简单-----------------

Hd = fir_cos; %%FIR滤波器,在fdatool中产生

d2 = filter (Hd,da ); %da是需要滤波器的数据。

如果只知道滤波器的系数,怎么用系数来操作呢?

I_DATA = filter(fir_c,1,I_Symbols);

MATLAB产生的系数基本上都是小数,且位数特别宽。可以尝试进行归一化为整数之后再用。归一化的代码为(以归一化16位为例):

ht_16 = round (ht/max(abs(ht))*(2^15-1));

在真正使用的时候发现,将系数按照上面方式归一化之后,FPGA结果和MATALB结果对不上。最后还是放弃了这种方法。还是按照上面将的那种系数带小数点的方法好。不过,输入输出数据要对应经过一定的放大或缩小之后 FPGA结果和MATALB结果 才能对的上。

3、CIC滤波器

在MATLAB中使用CIC滤波器的方法很简单。打开fdatool,直接点击这个:

MATLAB与FPGA设计滤波器2-1MATLAB与FPGA设计滤波器2-1

至此,设计完毕.

用这种方法设计好滤波器之后,发现用psd不能画频谱。把滤波之后的数据 double 一下再用就可以了

在FPGA中,直接点击插值滤波器即可.



相关文章: