System Generator中的FIR Compiler模块在信号处理中有着广泛的应用,其不仅可以通过在配置页中的Coefficient Vector中直接写入滤波系数,还可以通过模块提供的接口进行动态重加载。
FIR Compiler模块提供了两种滤波器系数重加载方法,一种是reload方法,利用reload接口写入新系数,另一种是config方法,提前将系数分组后写到Coefficient Vector中,再通过config接口写入系数组编号,选择相应的滤波器系数。以下分别介绍。
Reload 方法
Reload方法配置步骤:
Step1: 利用fdatool生成初始滤波器系数,填入coefficient vector中。(注意,生成的滤波器系数的个数是fdatool中order(阶数)加1)
Step2: 勾选Use Reloadable Coefficients选项,点击Apply按钮,这时FIR Compiler模块会自动添加reload信号接口。
Step3: 搭建逻辑,提供reload接口信号和config信号,各个信号的定义及说明如下:
名称
定义及说明
Config_tvalid
config有效信号,由Reload_tlast信号延时几个周期实现
Config_tdata_data
config参数,此处固定写0
Reload_tvalid
Reload有效信号,高电平clk个数应等于reload数据长度
Reload_tlast
Reload数据结尾指示,1个clk宽度
Reload_tdata_data
Reload数据,即要配置的新系数
仿真与测试设计:
为测试config方法,利用DDS模块产生两个不同的点频(20MHz、40MHz),相加后输出给FIR Compiler模块。FIR Compiler模块初始滤波器截止频率设置为20MHz。
利用matlab生成要配置的滤波器系数,该新滤波器截止频率设为60MHz,阶数设置为51(与FIR Compiler模块初始滤波器阶数一致);仿真结果及主要信号波形如下。
由图可以看出,在reload前,输入的20MHz和40MHz信号仅20MHz可以输出,40MHz信号被初始滤波器(截止频率40MHz)滤掉,在reload后,由于新滤波器系数的截止频率为60MHz,因此两个频率的信号都可以正常输出。达到了动态reload滤波器系数的功能。
2. config 方法
与reload方法相比,config方法较为简单,缺点是灵活性不够,需要提前规划好所有需要重配置的滤波器系数。其步骤为:
Step1:提前在matlab中生成所需要的多组滤波器系数,并按顺序写入coefficient Vector中,在Number of Coefficient Sets填入组数。
Step2:点击了Apply后,FIR Compiler模块会自动添加Config信号接口。
Step3: 搭建逻辑,提供config接口信号,各个信号的定义及说明如下:
名称
定义及说明
Config_tvalid
config有效信号,高有效
Config_tdata_fsel
滤波系数组编号,0对应第1组,1对应第2组,以此类推。
仿真与测试设计:
与config方法相同,利用DDS模块产生两个不同的点频(20MHz、40MHz),相加后输出给FIR Compiler模块。
利用matlab生成两组要配置的滤波器系数,第1组滤波器截止频率设为60MHz,第2组滤波器截止频率设为30MHz,阶数设置都为51;仿真结果及主要信号波形如下。
由图可以看出,由于第1组滤波器系数的截止频率为60MHz,因此输入的20MHz和40MHz信号都可以输出,在config后,40MHz信号被第2组滤波器(截止频率30MHz)滤掉,因此只有20MHz信号可以正常输出。达到了动态config滤波器系数的功能。
两种方法涉及到的滤波器生成代码如下。
%%
n = 51; % 滤波器阶数
wn = 0.2; % 通过频率为 fs/2*0.2 = 30MHz
coef_0p1=fir1(n,wn); % 滤波器系数
coef_0p1 = round(coef_0p2*(2^16-1000)); % 滤波器系数量化
%%
n = 51; % 滤波器阶数
wn = 0.4; % 通过频率为 fs/2*0.4 = 60MHz
coef_0p2=fir1(n,wn); % 滤波器系数
coef_0p2 = round(coef_0p2*(2^16-1000)); % 滤波器系数量化
文章来源: blog.csdn.net,作者:戴斯班克,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/fooleyou/article/details/110878538