6.1
Matlab and Parameter Optimization:
You should develop equations that relate your design parameters to the error criteria. If you can solve for the parameters directly from the equation, you are finished - you have the optimal performance for the circuit you proposed. Unfortunately in many cases, the large number of parameters or the nonlinear relationship between them , makes this solution very difficult or impossible.
The performance equations, however, can be examined though a program such as Matlab, and optimization can be done though a creative strategy for iterating though the critical performance parameters until the error is at a practical minimum.
Matlab functions: Available Matlab functions can be combined together in a program to create a custom function.
Example: Create a Matlab function that will evaluate points of a transfer function of a first-order low-pass filter given an array for the frequency axis points (in Hz), the cutoff frequency (in Hz), and the gain at DC (in dB).
1) Use a text editor to create a file lpf1.m (functions in Matlab always end in .m).
2) Then enter the following text.
function h = lpf1(f,fc,gdb)
% This function evaluates complex points of a first
% order low-pass filter with cut-off frequency fc
% in Hertz, and a gain in dB at DC of gdb. The
% function syntax is:
%
% tflp = lpf1(f, fc, gdb)
%
% where f is an array of points in Hertz where the
% function is eavluated at, and tfpl is the array of
% complex evaluation points.
%
j = sqrt(-1);
p = j*2*pi*f;
gdc = 10^(gdb/20);
h = gdc./(p/(2*pi*fc) + 1 );
3) Save the file in your “working directory” and execute in Matlab just like any other function. If you type help lpf1 in Matlab, the first sequence of comments willprint to the screen.
4) All variables defined inside the function will be undefined when the function is through (local variables).
Create an analogous function for a high-pass filter:
1) Create file with a text editor called hpf1.m and enter:
function h = hpf1(f,fc,gdb)
% This function evaluates complex points of a first
% order high-pass filter with cut-off frequency fc
% in Hertz, and a gain in dB at infinity of gdb.
% The function syntax is:
%
% tfhp = hpf1(f, fc, gdb)
%
% where f is an array of points in Hertz where the
% function is evaluated at, and tfhp is the array of
% complex evaluation points.
%
j = sqrt(-1);
p = j*2*pi*f;
ginf=10^(gdb/20);
h = ginf*(p/(2*pi*fc))./(p/(2*pi*fc) + 1 );
Matlab Scripts: Matlab functions can be combined together to create a series of commands to be executed.
Example: Create a Matlab script to examine the mean and variance error between a cascaded low-pass and high-pass filter, and a band-pass-like transfer function with a flat 10 dB passband extending from 5 kHz to 50 kHz with a 20 dB per decade roll-off at either end of the passband. The gain in the passband is 10 dB. Only consider the error from 500 Hz to 500 kHz.
1) Strategy: Consider the major portion of overlap between the passbands of the LPF and HPF to exist, so set the gains equal about 5.6 dB each, so now we only will consider minimizing the error with respect to 2 parameters - the cutoff frequencies of the LPF and the HPF. The gain can be adjusted later if our assumption is not very accurate.
2) Create a file in a text editor called ex6.m, and enter:
f =logspace(log10(500),log10(500e3), 512); % define axis for evaluation
% Create target function (Described in Example)
ht = zeros(1,512); % Set up array to fill with function points
for k=1:512
% For points less than 5kHz create a line on a log scale
if( f(k) < 5e3) ,
ht(k) = -10 + 20*log10(f(k)/500);
% For points greater than 5kHz and less than 50kHz
elseif(f(k) < 5e4),
ht(k) = 10;
% for points greater than 50kHz create a line on a log scale
else
ht(k) = 10 - 20*log10(f(k)/5e4);
end
end
figure(1)
semilogx(f,ht) % Check to see if it did what we wanted it to
grid
title('Target TF')
xlabel('Hertz')
ylabel('dB')
pause % Script will pause until the keyboard is struck
% Set up nested loops to vary the cutoff frequencies for HPF and LPF
% Try a neighborhood of frequencies around f= 5 kHz and 50 kHz.
fhc = linspace(3500,7500,25); % Select a set of high-pass cut-offs
flc = linspace(35000, 55000, 25); % Select a set of low-pass cut-offs
% Set up arrays to store computed error terms
em = zeros(25,25); % mean error (bias)
ev = zeros(25,25); % variance error (consistency of fit)
% Fix Gain at 5.6 dB => 10^(5.6/20) = 1.9055 and optimize for low-pass
% and high-pass cutoff
% Note, this may not be the best gain, but is just an initial guess.
for k=1:25,
for n=1:25,
h = lpf1(f,flc(k),5.6).*hpf1(f,fhc(n),5.6); % Compute Resultant TF
% Compute errors
em(k,n) = mean(ht-20*log10(abs(h)));
ev(k,n) = std(ht-20*log10(abs(h))); %This is actually square root of the
% variance, which is just as good in terms of finding a minimum point.
end
end
[k,n] = find(abs(em) == min(min(abs(em))))%find mean error index close to 0
% look at optimal TF
h = lpf1(f,flc(k),5.6).*hpf1(f,fhc(n),5.6); % Compute Resultant TF
% points at optimum
semilogx(f,20*log10(abs(h)),'g')
hold on
semilogx(f, ht,':r')
hold off
title('Compare target with design TF for minimum mean error')
xlabel('Hertz')
ylabel('dB')
flcmm = flc(k) % Convert index to frequency value
fhcmm = fhc(n) % Convert index to frequency value
pause
[k,n] = find(ev == min(min(ev))) % find index of minimum variance error
h = lpf1(f,flc(k),5.6).*hpf1(f,fhc(n),5.6); % Compute Resultant TF points at optimum
figure(2)
semilogx(f,20*log10(abs(h)),'g')
hold on
semilogx(f, ht,':r')
hold off
title('Compare target with design TF for minimum variance error')
xlabel('Hertz')
ylabel('dB')
flcsd = flc(k) % Convert index to frequency value
fhcsd = fhc(n) % Convert index to frequency value
pause
figure(3)
mesh(fhc, flc, abs(em)) % Look at graphic distribution of error.
title('mean error')
figure(4)
mesh(fhc, flc, ev)
title('standard deviation error')
pause
% To get a better view, try an intensity plot of the same data:
figure(3)
imagesc(fhc, flc, abs(em))
colormap('gray')
colorbar
title('mean error')
xlabel(' High-pass cut-off')
ylabel(' Low-pass cut-off')
figure(4)
imagesc(fhc, flc, ev)
colormap('gray')
colorbar
xlabel(' High-pass cut-off')
ylabel(' Low-pass cut-off')
title('standard deviation error')
3) Save file and type ex6 at Matlab prompt. These commands will execute and when finished, all variables defined in the script will still be available in the Matlab workspace.
4) The results of this program should yield a variance error at k=3 and n=16, which corresponds to cutoffs at 6000 Hz and 41667 Hz. Further improvement can be obtained by fixing the cutoffs and varying the gain.
The following is the output of the previous script:
Mean Error
k =
12
n =
8
flcmm =
4.4167e+004
fhcmm =
4.6667e+003
Variance Error
k =
9
n =
16
flcsd =
4.1667e+004
fhcsd =
6000