主要内容

信号处理使用fgoalattain

考虑设计一个线性相位有限脉冲响应(FIR)滤波器。问题是要设计一个低通滤波器,在0到0.1 Hz之间的所有频率上,幅值为1,在0.15到0.5 Hz之间,幅值为0。

频率响应Hf),这样的过滤器定义为

H f n 0 2 h n e j 2 π f n 一个 f e j 2 π f 一个 f n 0 1 一个 n 因为 2 π f n (1)

在哪里一个f)为频率响应的大小。一种解决方法是将目标实现方法应用于频率响应的大小。给定一个计算大小的函数,fgoalattain试图改变大小系数一个n),直到幅值响应在一定容许范围内与期望响应匹配。文中给出了计算振幅响应的函数filtmin.m.这个函数使用一个,大小函数系数,和w,感兴趣的频域离散化。

要设置目标实现问题,您必须指定目标权重对于这个问题。对于0到0.1之间的频率,目标是1。对于0.15到0.5之间的频率,目标是零。频率在0.1和0.15之间没有指定,所以在这个范围内不需要目标或权重。

这个信息存储在变量中目标传递给fgoalattain.的长度目标与函数返回的长度相同吗filtmin.所以目标通常是相同的重量将被设置为abs(目标).但是,由于一些目标是零,使用的效果重量= abs(目标)是否将强制目标与重量0以满足为硬约束,并与目标配合重量可能达到不足的(见目标实现方法).因为所有的目标在大小上都很接近重量为所有目标而团结一致将给予它们同等的优先地位。(使用abs(目标)对于权重更重要时,大小目标更重要的是不同的。)同时,设置

选择= optimoptions(‘fgoalattain’,‘EqualityGoalCount’,长度(目标);

指定每个目标应该尽可能接近它的目标值(既不大于也不小于)。

步骤1:写入文件filtmin.m

函数y = filtmin(a,w) n = length(a);Y = cos(w'*(0:n-1)*2*pi)*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))); weight = ones(size(goal)); % Call fgoalattain options = optimoptions('fgoalattain','EqualityGoalCount',length(goal)); [a,fval,attainfactor,exitflag]=fgoalattain(@(x)filtmin(x,w0),... a0,goal,weight,[],[],[],[],[],[],[],options); % Plot with the optimized (final) coefficients y = filtmin(a,w); hold on, plot(w,y,'r') axis([0 0.5 -3 3]) xlabel('Frequency (Hz)') ylabel('Magnitude Response (dB)') legend('initial', 'final') grid on

将计算得到的震级响应与初始系数和最终系数进行比较(具有初始和最终幅度系数的幅度响应).注意,您可以使用firpm(信号处理工具箱)函数在Signal Processing Toolbox™软件中设计此滤波器。

具有初始和最终幅度系数的幅度响应

另请参阅

相关的话题