信号处理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
函数n = length(a);Y = cos(w'*(0:n-1)*2*pi)*a;
步骤2:调用优化例程
%具有初始系数的图A0 = 1 (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)));体重= 1(尺寸(目标));叫我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
(信号处理工具箱)信号处理工具箱™软件中的功能来设计此滤波器。
具有初始和最终震级系数的震级响应