<< Chapter < Page Chapter >> Page >

An implementation of soewito's quasilinearization

The following is the author's implementation of Soewito's linearization. This program is based on the theoretical development presented in [link] , and is designed to be used by other programs in this work. For the original implementation (which includes a number of additions to handle numerical issues) the reader should consult the original work by A. Soewito [link] .

function [bb,aa] = l2soe(b,a,D,varargin)% This program is an implementation of Soewito's quasilinearization % to design least squares filters using a solution error criterion.% This implementation accepts arbitrary samples between 0 and pi, % and requires an initial filter guess.% % [B,A]= L2SOE(Bo,Ao,D) designs an optimal L2 approximation to a % complex response D that is specified over a uniform frequency% grid between 0 and PI, using as initial point the vector {Bo,Ao}. %% [B,A] = L2SOE(Bo,Ao,D,F) designs an optimal L2 approximation to a% complex response D that is specified over a nonuniform frequency % grid F defined between 0 and PI.% % [B,A]= L2SOE(Bo,Ao,D,F,W) designs a weighted L2 approximation, % with weighting function W.% % [B,A]= L2SOE(Bo,Ao,D,F,W,ITER) finds a solution in at most ITER % iterations (the default for this value is 30 iterations).% % [B,A]= L2SOE(Bo,Ao,D,F,W,ITER,TOL) defines convergence when the % norm of the updating vector is less than TOL (default is 0.01).% % [B,A]= L2SOE(Bo,Ao,D,...,'diags') plots the desired and current % spectra at each iteration and displays error measurements.% Author: R. A. Vargas, 4-20-08error(nargchk(3,8,nargin))if isempty(varargin), fdiags = false; elsefdiags = varargin(length(varargin)); if (ischar(fdiags{1})&&strcmp(fdiags,'diags')), fdiags = true; varargin(length(varargin)) = []; else fdiags = false; endend if length(varargin)<4 % pad varargin with []'svarargin{4} = [];end [f,W,mxit,etol]= deal(varargin{:}); if isempty(W), W = ones(size(D)); end; W = W(:);if isempty(mxit), mxit = 30; end if isempty(etol), etol = 0.01; endM = length(b); N = length(a); % Numerator and denominator lengthsd = D(:); % Form conjugate symmetric desired response and weights if (~(isreal(d(1))&&isreal(d(length(d))) )), error('Real filters have real spectra values at 0 and Pi');end D = [d; flipud(conj(d(2:length(d)-1)))]; W = [W; flipud(conj(W(2:length(W)-1)))]; % Define frequencies over whole unit circleif isempty(f), f = [0:2*pi/length(D):2*pi*(length(D)-1)/length(D)]';else f = [f; 2*pi-flipud(f(2:length(f)-1))]; end% Initialize relevant variables h = [b; a(2:N)]; F = [exp(-i.*(f*[0:M-1])) -diag(D)*exp(-i.*(f*[1:N-1]))]; b0 = zeros(size(b)); a0 = zeros(size(a)); c = 0;% Iterative loopwhile (norm([b0;a0]-[b;a],2)>= etol&&c<mxit), c = c+1; b0 = b; a0 = a;% Vector update V = diag(W.*freqz(1,a,f));H = freqz(b,a,f); G = [exp(-i.*(f*[0:M-1])) -diag(H)*exp(-i.*(f*[1:N-1]))]; h = (V*G)\(V*(D+H-F*h));b = h(1:M); a = [1; h(M+1:length(h))]; % Diagnosticsif fdiags, sprintf(strcat('Iteration = %g,',' Error norm = %g '),...c,norm(D-freqz(b,a,f),2)) [hh,ff]= freqz(b,a,1024,'whole'); plot(f./(2*pi),abs(D),'.',ff./(2*pi),abs(hh))title(strcat('Iteration:',int2str(c))); pause endend%if fdiags, if c==mxit, disp('Maximum number of L2 iterations reached')else sprintf('L2 convergence reached after %g iterations',c) endbb = real(b); aa = real(a);

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Iterative design of l_p digital filters. OpenStax CNX. Dec 07, 2011 Download for free at http://cnx.org/content/col11383/1.1
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Iterative design of l_p digital filters' conversation and receive update notifications?

Ask