主要内容

信号处理福格拉坦

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

频率响应H(F)对于此类过滤器,其定义如下:

H ( F ) = N = 0 2. M H ( N ) E J 2. π F N = A. ( F ) E J 2. π F M , A. ( F ) = N = 0 M 1. A. ( N ) 余弦 ( 2. π F N ) , (1)

哪里A.(F)是频率响应的大小。一种解决方案是对频率响应的幅度应用目标实现方法。给定一个计算震级的函数,福格拉坦将尝试改变震级系数A.(N)直到幅值响应在一定公差范围内与所需响应匹配。中给出了计算幅值响应的函数filtmin.m. 此函数使用A.,幅值函数系数,以及W,感兴趣的频域的离散化。

要设置目标达成问题,必须指定球门砝码对于这个问题。对于介于0和0.1之间的频率,目标是1。对于介于0.15和0.5之间的频率,目标为零。未指定0.1和0.15之间的频率,因此在此范围内不需要目标或权重。

此信息存储在变量中球门传给福格拉坦. 长度球门与函数返回的长度相同filtmin. 因此,通常情况下,目标都能得到同样的满足重量将设置为abs(目标).但是,由于一些目标是零,使用的效果体重=绝对值(目标)将以重量0作为硬约束得到满足,并且目标重量1可能未达到要求(参见目标达成法).因为所有的目标在数量上都很接近,所以使用重量所有目标的统一将给予它们同等的优先地位。(使用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(信号处理工具箱)信号处理工具箱中的函数™ 设计该滤波器的软件。

具有初始和最终震级系数的震级响应

另见

相关的话题