信号处理使用fgoalattain
考虑设计一个线性相位有限冲击响应(FIR)滤波器。问题是设计一个低通滤波器,其震级为1,在0到0.1 Hz之间,震级为0,在0.15到0.5 Hz之间。
频率响应H(f)为这样的过滤器定义为
(1) |
在哪里一个(f)为频率响应的大小。一种解决方法是对频率响应的幅度应用一种目标实现方法。给定一个计算大小的函数,fgoalattain
会尝试改变幅度系数吗一个(n)直到震级响应在一定公差范围内与所需响应匹配为止。文中给出了计算震级响应的函数filtmin.m
.这个函数使用一个
,模函数系数和w
,即感兴趣频域的离散化。
要设置目标实现问题,必须指定目标
而且权重
对于这个问题。对于0到0.1之间的频率,目标是1。对于介于0.15和0.5之间的频率,目标是零。在0.1到0.15之间的频率没有指定,因此在这个范围内不需要目标或权重。
此信息存储在变量中目标
传递给fgoalattain
.的长度目标
是否与函数返回的长度相同filtmin
.这样目标通常都能得到满足重量
会被设定为abs(目标)
.然而,由于有些目标是零,使用的效果重量= abs(目标)
将强迫目标与重量
0以满足为硬约束,以目标为伴重量
1 .可能达不到(见目标实现方法).因为所有的目标在大小上都很接近,使用a重量
对所有目标的团结将给予它们同等的优先地位。(使用abs(目标)
的大小时,权重更重要目标
更重要的是不同的。)同时,设置
选择= optimoptions (“fgoalattain”,“EqualityGoalCount”长度(目标));
指定每个目标应尽可能接近其目标值(不大于也不小于)。
步骤1:写入文件filtmin.m
函数Y = filtmin(a,w) n =长度(a);Y = cos(w'*(0:n-1)*2*)*a;
步骤2:调用优化例程
用初始系数绘图a0 = 1(15日1);增加= 50;w = linspace(0、0.5、增加);y0 = filtmin (a0, w);clf、情节(w, y0,“。b”);drawnow;设定实现目标的问题W1 = linspace(0,0.1,incr);w2 = linspace(0.15, 0.5,增加);W0 = [w1 w2];目标=[1.0 * 1(1,长度(w1)) 0(1,长度(w2)));重量= 1(大小(目标));%叫fgoalattain选择= optimoptions (“fgoalattain”,“EqualityGoalCount”长度(目标));[a fval attainfactor, exitflag] = fgoalattain (@ (x) filtmin (x, w0),...a0,目标,重量 ,[],[],[],[],[],[],[], 选项);用优化的(最终)系数绘图y = filtmin (w);持有在、情节(w, y,“r”([0 0.5 -3 3]) xlabel(的频率(赫兹)) ylabel (“级响应(dB)”)传说(“初始”,“最后一次”网格)在
比较计算的震级响应与初始系数和最终系数(具有初始和最终震级系数的震级响应).注意,您可以使用firpm
(信号处理工具箱)函数来设计该滤波器。
具有初始和最终震级系数的震级响应