/[dtapublic]/to_be_filed/uculib01/doc/manual/c_lfi0/c_lfi0.tex
ViewVC logotype

Annotation of /to_be_filed/uculib01/doc/manual/c_lfi0/c_lfi0.tex

Parent Directory Parent Directory | Revision Log Revision Log


Revision 30 - (hide annotations) (download) (as text)
Sat Oct 8 07:22:17 2016 UTC (7 years, 8 months ago) by dashley
File MIME type: application/x-tex
File size: 18468 byte(s)
Initial commit.
1 dashley 30 %$Header: /home/dashley/cvsrep/uculib01/uculib01/doc/manual/c_lfi0/c_lfi0.tex,v 1.10 2010/02/24 19:37:49 dashley Exp $
2    
3     \chapter{Linear Filter Functions}
4    
5     \label{clfi0}
6    
7     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10     \section{Introduction and Overview}
11     %Section tag: iov0
12     \label{clfi0:siov0}
13    
14     This chapter describes functions that approximate linear filters.
15     Here, \emph{linear} filter means a filter which satisfies
16     additive and homogeneity properties.
17    
18     In order to satisfy the additive property, given two input signals $x_1(k)$ and $x_2(k)$, $\forall k>0$:
19    
20     \begin{equation}
21     \label{eq:clfi0:siov0:01}
22     y(x_1(k) + x_2(k)) = y(x_1(k)) + y(x_2(k)).
23     \end{equation}
24    
25     \noindent{}In order to satisfy the homogeneity property,
26    
27     \begin{equation}
28     \label{eq:clfi0:siov0:02}
29     y(\alpha x_1(k)) = \alpha y(x_1(k)).
30     \end{equation}
31    
32     \noindent{}A filter that does not satisfy both
33     (\ref{eq:clfi0:siov0:01}) and (\ref{eq:clfi0:siov0:02}) is by
34     definition a non-linear filter (see Chapter
35     \ref{cnfi0}, p. \pageref{cnfi0}).
36    
37     It is hard to find appropriate names for linear filters (especially if
38     filters differ from each other only in precision of arithmetic or the
39     size and range of input arguments), so for now the filters
40     are simply named using letters of the alphabet (\emph{Linear Filter A}, for
41     example).
42    
43    
44     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47     \section{Linear Filter A}
48     %Section tag: lfa0
49     \label{clfi0:slfa0}
50    
51    
52     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55     \subsection{Design}
56     %Subsection tag: dsn0
57     \label{clfi0:slfa0:dsn0}
58    
59     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60    
61     \paragraph{General Design}
62    
63     \emph{Linear Filter A} approximates the
64     discrete time difference equation
65    
66     \begin{equation}
67     \label{eq:clfi0:slfa0:dsn0:01}
68     y_{k} = \frac{2^{16}-h}{2^{16}}x_k + \frac{h}{2^{16}}y_{k-1},
69     \end{equation}
70    
71     \noindent{}where $x_k$ is the input and $y_k$ is the output
72     of the filter at discrete time $k$.
73     $h$ specifies the ``stiffness'' of the filter---a
74     larger value of $h$ causes the filter to attenuate high frequencies more
75     aggressively.
76    
77     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
78    
79     \paragraph{Design Equivalence}
80    
81     In technical discussions, a filter of the design
82    
83     \begin{equation}
84     \label{eq:clfi0:slfa0:dsn0:01a}
85     y_{k} = y_{k-1} + \frac{x_k - y_{k-1}}{c}
86     \end{equation}
87    
88     \noindent{}was discussed, where $c$ specifies the
89     stiffness of the filter.
90    
91     (\ref{eq:clfi0:slfa0:dsn0:01a}) can be rearranged to
92    
93     \begin{equation}
94     \label{eq:clfi0:slfa0:dsn0:01b}
95     y_{k} =
96     x_k \left( \frac{1}{c} \right)
97     + y_{k-1} \left( {1-\frac{1}{c}} \right).
98     \end{equation}
99    
100     \noindent{}It can be seen by comparing
101     (\ref{eq:clfi0:slfa0:dsn0:01}) with
102     (\ref{eq:clfi0:slfa0:dsn0:01b}) that the substitution
103    
104     \begin{equation}
105     \label{eq:clfi0:slfa0:dsn0:01c}
106     c = \frac{1}{1-h/2^{16}}
107     \end{equation}
108    
109     \noindent{}equates (\ref{eq:clfi0:slfa0:dsn0:01}) with
110     (\ref{eq:clfi0:slfa0:dsn0:01b}), i.e. the filter described by
111     (\ref{eq:clfi0:slfa0:dsn0:01}) and the filter
112     described by (\ref{eq:clfi0:slfa0:dsn0:01b}) are
113     mathematically equivalent.
114    
115     (\ref{eq:clfi0:slfa0:dsn0:01c}) can also be solved for $h$:
116    
117     \begin{equation}
118     \label{eq:clfi0:slfa0:dsn0:01d}
119     h = 2^{16}\left( 1 - \frac{1}{c} \right).
120     \end{equation}
121    
122     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
123    
124     \paragraph{Time Constant}
125    
126     The filter time constant $\tau$ can be expressed as
127    
128     \begin{equation}
129     \label{eq:clfi0:slfa0:dsn0:02}
130     \tau = \frac{h \Delta t}{2^{16} - h} ,
131     \end{equation}
132    
133     \noindent{}where $\Delta t$ is the discrete time interval.%
134     \footnote{(\ref{eq:clfi0:slfa0:dsn0:02}) comes from the
135     \emph{Discrete-time realization} section of the Wikipedia
136     entry on low-pass filters \cite{bibref:w:wikipedialowpassfilter}---at this
137     time I do not
138     know how it is derived.}
139    
140     Alternatively, (\ref{eq:clfi0:slfa0:dsn0:02}) may be solved for $h$:
141    
142     \begin{equation}
143     \label{eq:clfi0:slfa0:dsn0:03}
144     h = \frac{2^{16} \tau}{\Delta t + \tau} .
145     \end{equation}
146    
147     For example, at 100Hz ($\Delta t$=0.01 seconds) with a desired time constant
148     of 100ms ($\tau$=0.1 seconds), the required value of $h$ is:
149    
150     \begin{equation}
151     \label{eq:clfi0:slfa0:dsn0:04}
152     h = \frac{(65536) (0.1)}{0.01 + 0.1} = 59578 .
153     \end{equation}
154    
155     \begin{table}
156     \caption{Values of $h$ for Common Choices of $\Delta t$ and $\tau$}
157     \label{tbl:clfi0:slfa0:dsn0:01}
158     \begin{center}
159     \begin{tabular}{|c|c|c|c|}
160     \hline
161     & \small{$f$=100Hz} & \small{$f$=400Hz} & \small{$f$=1000Hz} \\
162     \small{$\tau$} & \small{$\Delta t$=0.01} & \small{$\Delta t$=0.0025} & \small{$\Delta t$=0.001} \\
163     \hline
164     \hline
165     \small{0.01} & \small{32,768} & \small{52,429} & \small{59,578} \\
166     \hline
167     \small{0.05} & \small{54,613} & \small{62,415} & \small{64,251} \\
168     \hline
169     \small{0.1} & \small{59,578} & \small{63,938} & \small{64,887} \\
170     \hline
171     \small{0.2} & \small{62,415} & \small{64,727} & \small{65,210} \\
172     \hline
173     \small{0.3} & \small{63,422} & \small{64,994} & \small{65,318} \\
174     \hline
175     \small{0.4} & \small{63,938} & \small{65,129} & \small{65,373} \\
176     \hline
177     \small{0.5} & \small{64,251} & \small{65,210} & \small{65,405} \\
178     \hline
179     \small{1.0} & \small{64,887} & \small{65,373} & \small{65,470} \\
180     \hline
181     \end{tabular}
182     \end{center}
183     \end{table}
184    
185     Table \ref{tbl:clfi0:slfa0:dsn0:01} provides the correct values of $h$ for common
186     choices of $\Delta t$ and $\tau$.
187    
188     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
189    
190     \paragraph{Numeric Implementation}
191    
192     The software uses large integers to implement the filter. The filter state
193     ($y_k$) is implemented as a 48-bit fixed-point integer with the radix point after the first
194     16 bits. An upper-case ``y'' ($Y_k$ rather than $y_k$) is used to denote the
195     48-bit integer corresponding to $y_k$.
196    
197     The implementation of the filter can be described by the following steps:
198    
199     \begin{enumerate}
200     \item $Y_k$ is calculated:
201     \begin{equation}
202     \label{eq:clfi0:slfa0:dsn0:05}
203     Y_k = \left\lfloor \frac{2^{32}(2^{16}-h)x_k + h Y_{k-1}}{2^{16}} \right\rfloor .
204     \end{equation}
205     \item $y_k$ is calculated from $Y_k$:
206     \begin{equation}
207     \label{eq:clfi0:slfa0:dsn0:06}
208     y_k = \left\lfloor \frac{Y_k + 2^{31}}{2^{32}} \right\rfloor .
209     \end{equation}
210     \end{enumerate}
211    
212     The steps are implemented differently than directly suggested by
213     (\ref{eq:clfi0:slfa0:dsn0:05}) and (\ref{eq:clfi0:slfa0:dsn0:06}). For example,
214     the division by $2^{16}$ and the floor function
215     in (\ref{eq:clfi0:slfa0:dsn0:05}) are implemented by discarding the last two bytes of
216     an integer multiplication. As a second example, the
217     addition of $2^{31}$ and the floor function in (\ref{eq:clfi0:slfa0:dsn0:06}) are implemented
218     by testing bit 31 of $Y_k$ and conditionally incrementing $y_k$ rather than by adding.
219    
220     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
221    
222     \paragraph{Overflow}
223    
224     It needs to be verified that the filter cannot state $Y_k$ cannot overflow
225     (exceed $2^{48}-1$).
226     In order overflow to occur, the numerator of
227     (\ref{eq:clfi0:slfa0:dsn0:05}) would have to reach $2^{64}$\@. Guaranteeing that the
228     filter cannot overflow is equivalent to guaranteeing that $\forall h$,
229     $\forall x_k$, $\forall Y_{k-1}$:
230    
231     \begin{equation}
232     \label{eq:clfi0:slfa0:dsn0:10}
233     2^{32}(2^{16}-h)x_k + h Y_{k-1} < 2^{64} .
234     \end{equation}
235    
236     We can substitute the worst cases of $x_k = 2^{16}-1$ and $Y_{k-1} = 2^{48}-1$ into
237     (\ref{eq:clfi0:slfa0:dsn0:10}):
238    
239     \begin{equation}
240     \label{eq:clfi0:slfa0:dsn0:11}
241     2^{48}(2^{16}-1) + (2^{32}-1)h < 2^{64} .
242     \end{equation}
243    
244     The worst case of $h=2^{16}-1$ can be substituted into
245     (\ref{eq:clfi0:slfa0:dsn0:11}) to yield:
246    
247     \begin{equation}
248     \label{eq:clfi0:slfa0:dsn0:12}
249     2^{64} - 2^{32} - 2^{16} + 1 < 2^{64} .
250     \end{equation}
251    
252     By inspection, (\ref{eq:clfi0:slfa0:dsn0:12}) is met, so filter overflow is not
253     possible.
254    
255     In addition to the analysis above, as part of the unit test plan,
256     the filter was tested extensively to be
257     sure it could not roll over beyond $Y_k = 2^{48}-1$\@.
258    
259     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
260    
261     \paragraph{Convergence}
262    
263     By \emph{convergence} of the filter I mean that, given enough time with
264     a constant $x_k$, $y_k$ will reach the same value.
265    
266     Convergence wasn't formally analyzed (it should be), but there are three
267     clues that the filter will probably always converge.
268    
269     \begin{enumerate}
270     \item In unit testing with typical values of $h$, the filter always converged.
271     \item In unit testing, one test performed (not in the test plan) was to set
272     the initial value of the filter to 65534, the input to $x_k=65535$, and
273     $h=65535$. The filter output did reach 65535. The fact that the filter
274     will close a gap of $\Delta x_k = 1$ with $h=65535$ implies that the filter will probably
275     always converge.
276     \item In unit testing, a second test performed (not in the test plan) was to
277     set the initial value of the filter to 65000, $h=65535$,
278     $x_k = 65535$ and to measure the number of discrete time
279     quanta required to reach $65535 - (65535-65000)/e = 65338.18$ (i.e.
280     to measure the time constant).
281    
282     The number of time quanta required can be predicted from
283     (\ref{eq:clfi0:slfa0:dsn0:02}) by removing the $\Delta t$ term:
284    
285     \begin{equation}
286     \label{eq:clfi0:slfa0:dsn0:20}
287     n = \frac{h}{2^{16} - h} = \frac{65535}{65536-65535} = 65535.
288     \end{equation}
289    
290     In testing, this was the exact number of quanta required. This suggests
291     that the precision of the filter (32 bits after the radix point) is
292     adequate even with the largest valid $h$.
293     \end{enumerate}
294    
295     Convergence should still be formally analyzed.
296    
297    
298     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
299     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
300     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
301     \subsection[\emph{UcuLfU16FiltAInitRxn(\protect\mbox{\protect$\cdot$})}]
302     {\emph{UcuLfU16FiltAInitRxn(\protect\mbox{\protect\boldmath $\cdot$})}}
303     %Section tag: lcp0
304     \label{clfi0:slai0}
305    
306     \index{UcuLfU16FiltAInitRxn()@\emph{UcuLfU16FiltAInitRxn($\cdot$)}}%
307    
308     \noindent\textbf{PROTOTYPE}
309     \begin {list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
310     \item
311     \begin{verbatim}
312     void UcuLfU16FiltAInitRxn(UCU_UNION48 *in_fs,
313     UCU_UINT16 in_x_k_initial)
314     \end{verbatim}
315     \end{list}
316     \vspace{2.8ex}
317    
318     \noindent\textbf{SYNOPSIS}
319     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
320     \item Initializes the state \texttt{in\_fs} of a Linear Filter A
321     to the passed value \texttt{in\_x\_k\_initial}. This consists of
322     setting the most significant two bytes of the state to \texttt{in\_x\_k\_initial}
323     and the least significant four bytes to zero.
324     \item This function is typically used to either:
325     \begin{itemize}
326     \item Set the filter state to be the same as the input value (for example,
327     at software startup).
328     \item Eliminate filtering lag on a one-time basis and cause the filter output to track a step jump
329     in the filter input (for example, when the software makes a major mode change
330     or wishes to produce a step jump in output).
331     \end{itemize}
332     \end{list}
333     \vspace{2.8ex}
334    
335     \noindent\textbf{INPUTS}
336     \begin{list}{}{\setlength{\leftmargin}{0.5in}\setlength{\itemindent}{-0.25in}\setlength{\topsep}{0.0in}\setlength{\partopsep}{0.0in}}
337     \item \emph{\textbf{in\_fs}}\\
338     The filter state.
339     \item \emph{\textbf{in\_x\_k\_initial}}\\
340     The value to initialize the filter state to.
341     \end{list}
342     \vspace{2.8ex}
343    
344     \noindent\textbf{OUTPUTS}
345     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
346     \item None.
347     \end{list}
348     \vspace{2.8ex}
349    
350     \noindent\textbf{INTERRUPT CONSIDERATIONS}
351     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
352     \item This function can be used from both ISR and non-ISR software.
353     \item This function does not ensure atomic access to \texttt{in\_fs}, so it is
354     not thread-safe when processes in different threads use this function
355     to access the \emph{same} filter state.
356     \end{list}
357     \vspace{2.8ex}
358    
359     \noindent\textbf{EXECUTION TIME}
360     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
361     \item TBD.
362     \end{list}
363     \vspace{2.8ex}
364    
365     \noindent\textbf{FUNCTION NAME MNEMONIC}
366     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
367     \item \emph{U16}: the data type to be filtered is UCU\_UINT16.
368     \emph{FiltA}: Linear Filter A.
369     \emph{Init}: initialize.
370     \end{list}
371    
372     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
373     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
374     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
375     \subsection[\emph{UcuLfU16FiltAFiltRxn(\protect\mbox{\protect$\cdot$})}]
376     {\emph{UcuLfU16FiltAFiltRxn(\protect\mbox{\protect\boldmath $\cdot$})}}
377     %Section tag: lcp0
378     \label{clfi0:slaf0}
379    
380     \index{UcuLfU16FiltAFiltRxn()@\emph{UcuLfU16FiltAFiltRxn($\cdot$)}}%
381    
382     \noindent\textbf{PROTOTYPE}
383     \begin {list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
384     \item
385     \begin{verbatim}
386     UCU_UINT16 UcuLfU16FiltAFiltRxn(
387     UCU_UNION48 *in_fs,
388     UCU_UINT16 in_x_k,
389     UCU_UINT16 in_h
390     )
391     \end{verbatim}
392     \end{list}
393     \vspace{2.8ex}
394    
395     \noindent\textbf{SYNOPSIS}
396     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
397     \item Filters the data input \texttt{in\_x\_k} using the specified
398     time constant specifier \texttt{in\_h} and filter state
399     \texttt{in\_fs}, and returns the filtered value.
400     The filtering applied is defined by
401     (\ref{eq:clfi0:slfa0:dsn0:05}) and (\ref{eq:clfi0:slfa0:dsn0:06}).
402     \end{list}
403     \vspace{2.8ex}
404    
405     \noindent\textbf{INPUTS}
406     \begin{list}{}{\setlength{\leftmargin}{0.5in}\setlength{\itemindent}{-0.25in}\setlength{\topsep}{0.0in}\setlength{\partopsep}{0.0in}}
407     \item \emph{\textbf{in\_fs}}\\
408     The filter state.
409     \item \emph{\textbf{in\_x\_k}}\\
410     The input value to be filtered (i.e. $x_k$).
411     \item \emph{\textbf{in\_h}}\\
412     The time constant of the filter as defined by (\ref{eq:clfi0:slfa0:dsn0:03}).
413     \end{list}
414     \vspace{2.8ex}
415    
416     \noindent\textbf{OUTPUTS}
417     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
418     \item The filtered value, as defined by
419     (\ref{eq:clfi0:slfa0:dsn0:05}) and (\ref{eq:clfi0:slfa0:dsn0:06}).
420     \end{list}
421     \vspace{2.8ex}
422    
423     \noindent\textbf{USAGE NOTES}
424     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
425     \item The filter state is a fixed-point number, and this function
426     implements a simple difference equation. It is safe to modify
427     $h$ on the fly without unexpected effects (although this would be very
428     rare, as most applications would always apply the same time constant to
429     a given filter state). There is no state retained beyond the filter state block
430     and no requirement
431     that $h$ be the same value on every function call involving the same filter
432     state block.
433     \end{list}
434     \vspace{2.8ex}
435    
436     \noindent\textbf{INTERRUPT CONSIDERATIONS}
437     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
438     \item This function can be used from both ISR and non-ISR software.
439     \item This function does not ensure atomic access to \texttt{in\_fs}, so it is
440     not thread-safe when processes in different threads use this function
441     to access the \emph{same} filter state.
442     \end{list}
443     \vspace{2.8ex}
444    
445     \noindent\textbf{EXECUTION TIME}
446     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
447     \item TBD.
448     \end{list}
449     \vspace{2.8ex}
450    
451     \noindent\textbf{FUNCTION NAME MNEMONIC}
452     \begin{list}{}{\setlength{\leftmargin}{0.25in}\setlength{\topsep}{0.0in}}
453     \item \emph{U16}: the data type to be filtered is UCU\_UINT16.
454     \emph{FiltA}: Linear Filter A.
455     \emph{Filt}: filter.
456     \end{list}
457    
458    
459     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
460     \noindent\begin{figure}[!b]
461     \noindent\rule[-0.25in]{\textwidth}{1pt}
462     \begin{tiny}
463     \begin{verbatim}
464     $RCSfile: c_lfi0.tex,v $
465     $Source: /home/dashley/cvsrep/uculib01/uculib01/doc/manual/c_lfi0/c_lfi0.tex,v $
466     $Revision: 1.10 $
467     $Author: dashley $
468     $Date: 2010/02/24 19:37:49 $
469     \end{verbatim}
470     \end{tiny}
471     \noindent\rule[0.25in]{\textwidth}{1pt}
472     \end{figure}
473    
474     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
475     %$Log: c_lfi0.tex,v $
476     %Revision 1.10 2010/02/24 19:37:49 dashley
477     %Linear Filter A documentation corrected and enhanced.
478     %
479     %Revision 1.9 2010/01/28 21:18:32 dashley
480     %a)Chapter start quotes removed.
481     %b)Aesthetic comment line added at the bottom of most files.
482     %
483     %Revision 1.8 2010/01/28 02:45:46 dashley
484     %Information about Linear Filter A completed.
485     %
486     %Revision 1.7 2010/01/27 16:08:53 dashley
487     %Formatting difficulties corrected.
488     %
489     %Revision 1.6 2010/01/27 16:04:16 dashley
490     %Formatting difficulty corrections.
491     %
492     %Revision 1.5 2010/01/27 00:26:33 dashley
493     %Name change of Linear Filter A functions.
494     %
495     %Revision 1.4 2010/01/26 21:49:44 dashley
496     %Edits.
497     %
498     %Revision 1.3 2010/01/26 21:10:26 dashley
499     %Linear Filter A design section completed.
500     %
501     %Revision 1.2 2010/01/24 05:40:22 dashley
502     %Minor title changes.
503     %
504     %Revision 1.1 2010/01/24 05:38:26 dashley
505     %Initial checkin.
506     %End of $RCSfile: c_lfi0.tex,v $.
507     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
508    

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25