主要内容

信号处理使用fgoalattain

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

频率响应H(f)来定义这样的过滤器

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','secalitygoalcount',长度(目标));

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

步骤1:写入文件filtmin.m

函数y = filtmin(a,w) n = length(a);Y = cos(w'*(0:n-1)*2*pi)*a;

步骤2:调用优化例程

具有初始系数A0 =α(15,1)的%绘图;Incl = 50;w = linspace(0,0.5,Inc);y0 = filtmin(a0,w);CLF,情节(W,Y0,' - 。B');粗暴;%建立目标达到问题W1 = Linspace(0,0.1,Inc);W2 = Linspace(0.15,0.5,Inc);W0 = [W1 W2];目标= [1.0 *,(1,长度(W1))零(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(信号处理工具箱)功能在信号处理工具箱™软件来设计这个滤波器。

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

另请参阅

相关话题