主要内容

信号处理使用Fgoalattain

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

频率响应HF)对于这种过滤器是由

H F = σ. N = 0. 2 m H N E. - j 2 π F N = 一种 F E. - j 2 π F m 一种 F = σ. N = 0. m - 1 一种 N COS. 2 π F N (1)

在哪里一种F)是频率响应的幅度。一种解决方案是将目标获得方法应用于频率响应的大小。给定计算幅度的函数,Fgoalattain将尝试改变幅度系数一种N)直到幅度响应与某些容差内的所需响应匹配。给出计算幅度响应的功能filtmin.m..此功能使用一种,幅度函数系数,和W.,感兴趣的频域的离散化。

要设置目标达到问题,您必须指定目标重量对于问题。对于0到0.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 * 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

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

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

也可以看看

相关的话题