信号处理应用fgoalattain
考虑设计一个线性相位有限脉冲响应(FIR)滤波器。问题是设计一个低通滤波器,在0到0.1 Hz之间的所有频率上震级为1,在0.15到0.5 Hz之间震级为0。
频率响应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 = length(a);Y = cos(w'*(0:n-1)*2*)*a;
步骤2:调用优化例程
用初始系数绘制A0 = ones(15,1);Incr = 50;W = linspace(0,0.5,incr);Y0 = filtmin(a0,w);clf、情节(w, y0,“。b”);drawnow;设定目标达成问题W1 = linspace(0,0.1,incr);W2 = linspace(0.15,0.5,incr);W0 = [w1 w2];目标=[1.0 * 1(1,长度(w1)) 0(1,长度(w2)));体重= ones(大小(目标));打电话给goalattain选项= optimoptions(“fgoalattain”,“EqualityGoalCount”长度(目标));[a fval attainfactor, exitflag] = fgoalattain (@ (x) filtmin (x, w0),...a0,目标,重量 ,[],[],[],[],[],[],[], 选项);用优化的(最终的)系数绘制Y = filtmin(a,w);持有在、情节(w, y,“r”xlabel([0 0.5 -3])的频率(赫兹)) ylabel (“震级响应(dB)”)传说(“初始”,“最后一次”网格)在
比较计算的震级响应与初始系数和最终系数(初始和最终震级系数的震级响应).注意,您可以使用firpm
(信号处理工具箱)信号处理工具箱™软件中的函数来设计该滤波器。
初始和最终震级系数的震级响应