FC Coding is
One step from 1st Principles to Solution!

Home

Increased Productivity Example #3



Optimum Matched Filter (Transfer Function)

(Nested Processes ... Each Process controlled by a Solver)

The transfer function H(s) is the Laplace transform of the output signal Yout(s) divided by the Laplace transform of the input signal Yin (s): that is H(s) = Laplace Transform for Yout where each signal's transform is assumed to be a ratio of polynomials. Thus, H(s) can likewise be stated in the form:

General Polynomial for Laplace Transform

Assuming the numerator and denominator can be factored, yields H(s) in the general form:

Factoring Polynomial into Poless/Zeroes
where
each Zi is known as a "zero" and the Pi as a "pole" of the transfer function.
Zi and Pi are complex points in the Laplace domain.

A realizable transfer function must have poles and zeros with their conjugate point. That is, poles and zeros come in pairs. If a pole or zero is located at the complex point si + jwi, then its conjugate is located at si - jwi. Thus, a generalized transfer function is stated as
Generalized Transfer Function

Given n-data points from a Bode plot (see drawing below) that define the mainlobe of the desired transfer function, find the optimal Pole/Zero constellation such that H(s) has equal sidelobe peak amplitudes in a Bode plot and curve fits the following data in the mainlobe.


Bode Plot showing Main & Side lobes

Increased Productivity Example #3 Source Code:



A Calculus-level program for this optimal matched filter transfer function is as follows:

Problem .Matched.Filter.Transfer.Function
execute .Setup
for i = 0 to 1
sidelobes = i [Include Zeros On Omega Axis ? ]
Find gain, p.real, p.imag
In .Laplace.Domain To Match error

repeat
End
Model .Laplace.Domain
if sidelobes gt 0 AND omega.zeros gt 0 then
for ij = 1 to omega.zeros do
side.limits( ij) = x.zeros( ij) * (1 + move( ij)) * (2**(ij-2))
old.zeros( ij) = x.zeros( ij)
repeat
Find x.zeros In .Stopband By HERA
With Bounds side.limits
To Minimize peak.diff

for ij = omega.zeros, move( ij) = x.zeros( ij) - old.zeros( ij)
close
for ij = 1 to npoints do [ --- Calculate Transfer Function ---- ]
x2 = freq( ij) ** 2
execute .Transfer.Function
if den eq 0, den = 1e-8
h( ij) = gain * num / den
error( ij) = y.out( ij) - h( ij) * y.in( ij)
error( ij) = error( ij) / y.out( ij) [relative error ... line optional]
repeat
End
Model .Stopband [locate sidelobe peaks]
peak.diff = 0
for ijk = 1 to omega.zeros do
step.limit = side.limits( ijk)
Find x.peak In .Sidelobes By HERA
With Bounds step.limit
To Maximize y.peak

peaks( ijk) = x.peak peak.ampl( ijk) = y.peak
if ijk gt 1, peak.diff = peak.diff + (y.peak - peak.ampl( ijk-1))**2
repeat
peak.diff = peak.diff + (y.peak - peak.ampl( omega.zeros))**2
End
Model .Sidelobes [calculate sidelobe amplitude at frequency 'x.peak']
x2 = x.peak**2
execute .Transfer.Function
y.peak = num / den
End
Model .Transfer.Function
num = 1 den = 1
for ii = 1 to p.pairs, den = den * .Factor( x2, p.real( ii), p.imag( ii))
if omega.zeros gt 0 then
for ii = 1 to omega.zeros, den = den * .Factor( x2, 0, x.zeros(ii))
close
End
Function .Factor( x.sq, sigma, omega)
real.sq = sigma**2 Imag.sq = omega**2
sum = real.sq + imag.sq - x.sq
if omega eq 0, exit with sum / real.sq
temp.f = sum * sum - 4 * x.sq * imag.sq
End with temp.f / (real.sq + imag.sq)**2
Procedure .Setup
freq = .data( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)
y.in = .data( 51.31, 37.79, 28.26, 21.1, 15.37, 11.32, 8.06, 5.83, 3.91, 2.69,
1.78, .96, .52, .31, .25, .21, .18, .15, .12, .10, .08, .07, .06, .06, .05)
[y.out(w) = optimum response in the linear Van der Maas sense ]
y.out = .data(1, .981, .926, .836, .73, .609, .484, .365, .26, .173,
.105, .058, .027, .012, 7.2e-3, 4.4e-3, 2.7e-3, 1.7e-3,
1e-3, 6.2e-4, 3.8e-4, 2.3e-4, 1.4e-4, 8.8e-5, 5.4e-5)
fmax = freq( npoints)
npoints = 25 gain = 1 p.pairs = 5 omega.zeros = 3
allot h( npoints), error( npoints)
allot p.real( p.pairs), p.imag( p.pairs)
for i = 1 to p.pairs do [initial guess]
p.imag( i) = ((i-1) / p.pairs + .11) * fmax
p.real( i) = fmax
close
if omega.zeros gt 0 then
allot x.zeros( omega.zeros), old.zeros( omega.zeros), move( omega.zeros),
side.limits( omega.zeros), peaks( omega.zeros), peak.ampl( omega.zeros)
for i = 1 to omega.zeros, x.zeros(i) = (1 + 2**(i-1) /10)*fmax [initial guess]
close
End

Note: This is a multi-level optimization or nesting of optimizers example problem. Each 'find' statement starts a solver and at times has up to three Find statements executing at once (ie. nested). This nesting power should allow companies to optimizes at many levels and combine all optimizations for a true optimize company profits when necessary. Nice!

Note: Match-n-Freq application is exactly this multi-level optimization problem. Download Match-n-Freq application file. Give it a test run and see the nested solvers at work.

Increased Productivity Example #3 More Individual Process Examples:



Pulse Slimming


This Filter Designing problem is another increased productivity example do to using Calculus (level) programming.

Kost, R.E. and Brubaker, P.B., Arbitrary Equalization with Simple LC Structures, IEEE Transactions on Magnetics, Vol. MAG-17, No. 6,

HTML code for linking to this page:



<a href=""><img style="float:left; width:100px" src="https://goal-driven.net/image/transfer.png"/> <strong>Optimum Filter Design</strong> </a>, Bode Diagram, Transfer Function, Matched Filter, Modeling & Simulation.

< < Back

Next > >

 
Valid CSS! Calculus (level) Problem-Solving for Engineers & Scientists

Textbooks - Parameter Estimation 4 ODE/PDE - Signal Analysis / Spectral Estimation - Body Plasma - Solar Cell
Increasing Productivity Examples: AC Motor Design - Matched Filters - Pulse Slimming / InterSymbol Interference - Pilot (safe) Ejection - PharmacoKinetics Simulation - Business Strategies & War Gaming - BVP - Implicit Equations