CIC滤波器基于MATLAB/FPGA的数字CIC滤波器的设计
Posted fpga&matlab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CIC滤波器基于MATLAB/FPGA的数字CIC滤波器的设计相关的知识,希望对你有一定的参考价值。
FPGA代码:
module down(
i_clk,//输入时钟
i_rst,//输入复位信号
i_M, //抽取值
i_data,//输入信号
o_data,//输出信号
r_clk
);
input i_clk;//输入时钟
input i_rst;//输入复位信号
input [7:0] i_M; //抽取值
input signed[31:0] i_data;//输入信号
output signed[31:0]o_data;//输出信号
output r_clk;//输出信号
reg [7:0] r_cnt =8'd0;
reg signed[31:0]o_data=32'd0;
reg r_clk =1'b0;
always @(posedge i_clk)
begin
if(!i_rst)//系统复位
begin
r_cnt<=8'd0;
r_clk<=1'b0;
end
else begin
if(r_cnt==i_M/2-1)//分频
begin
r_clk<=~r_clk;
r_cnt<=8'd0;
end
else begin
r_cnt<=r_cnt+1'b1;
r_clk<=r_clk;
end
end
end
always @(posedge r_clk)
begin
if(!i_rst)//系统复位
begin
o_data<=32'd0;
end
else begin
o_data<=i_data;//抽取
end
end
endmodule
MATLAB代码:
clc;
clear;
close all;
%CIC又称为梳状滤波器,所以这里首先给出其梳状波形。。。。
%积分滤波器的响应
b1=1;
a1=[1 -1];
D=9;
b2=[1 zeros(1,D-1) -1];
a2=1;
b3=b2;
a3=a1;
b4=conv(b3,b3);
a4=conv(a3,a3);
b5=conv(b4,b3);
a5=conv(a4,a3);
b6=conv(b4,b4);
a6=conv(a4,a4);
b7=conv(b6,b3);
a7=conv(a6,a3);
figure(1);
freqz(b7/D^5,a7,'whole');
%CIC抽取滤波器
% 抽取因子
r = 2;
hm = mfilt.cicdecim(r);
%原始的采样率 44.1kHz.
fs = 44.1e3;
%10240个采样点
n = 0:10239;
%原始信号
x = sin(2*pi*1e3/fs*n);
%得到抽取后的5120个采样点
y_fi = filter(hm,x);
x = double(x);
y = double(y_fi);
y = y/max(abs(y));
figure(2);
stem(n(1:44)/fs,x(2:45)); hold on;
stem(n(1:22)/(fs/r),y(3:24),'r','filled');
xlabel('时间(sec)');ylabel('信号值');
title('CIC抽取滤波器');
%CIC内插滤波器
%插值因子
R = 2;
hm = mfilt.cicinterp(R);
% 原始采样频率:22.05 kHz.
fs = 22.05e3;
% 5120个采样点
n = 0:5119;
%原始信号
x = sin(2*pi*1e3/fs*n);
y_fi = filter(hm,x);
x = double(x);
y = double(y_fi);
y = y/max(abs(y));
figure(3);
stem(n(1:22)/fs,x(1:22),'filled'); hold on;
stem(n(1:44)/(fs*R),y(4:47),'r');
xlabel('时间(sec)');ylabel('信号值');
title('CIC内插滤波器');
仿真与说明
1.1 MATLAB设计说明
这个CIC滤波器的频率特性,如果上图,上图和梳子比较相似。所以称为梳状滤波器。
这个是CIC抽取滤波器,如图可以看到,每2个点抽取一个点,达到抽取效果。
这个是CIC内插滤波器,如图可以看到,每2个点插入一个点,达到抽取效果。
1.2 FPGA设计说明
一般在实际应用中,我们多半设计抽取滤波器用的更多,一般抽取滤波器如下所示:
在这里,我们将其中一些参数具体化,设计一个具体参数的CIC滤波器。
我们将这个系统模块话,然后在实际应用的时候,我们只要改变其中的参数就可以了。
系统分为如下三个模块。
模块一的设计:
delay_one(
i_clk,//输入时钟
i_rst,//输入复位信号
i_data,//输入信号
o_data//输出信号
);
模块二的设计:
down(
i_clk,//输入时钟
i_rst,//输入复位信号
i_M, //抽取值
i_data,//输入信号
o_data//输出信号
);
模块三的设计:
delay_M(
i_clk,//输入时钟
i_rst,//输入复位信号
i_data,//输入信号
o_data//输出信号
);
那么其在顶层,我们只要调用这些模块就行了。
其中CIC积分器输出结果如下所示:
系统滤波输出结果如下所示:
可以看到,滤波后的效果。
当改变CIC级数的时候,就能得到不同效果的CIC滤波器
检验CIC滤波器最快的方法就是输入一个阶跃信号,这里我们输入的阶跃信号是00FFFFFF,最终通过CIC滤波器的效果如dataout,通过查看相关文献资料,阶跃信号信号通过CIC滤波器后的效果为:
其效果和我们FPGA设计得到的效果基本相同。
以上是输入随机信号后滤波效果,显然,其波形特性得到了改善。
A01-23
以上是关于CIC滤波器基于MATLAB/FPGA的数字CIC滤波器的设计的主要内容,如果未能解决你的问题,请参考以下文章
FPGA教程案例13基于vivado核的CIC滤波器设计与实现
中文数藏与CIC国信公链等有关机构顺利召开国内数字藏品规划标准研讨会