You are on page 1of 26



A seismic source pulse, when transmitted through the earth, gets reflected from every
interface across which there is an acoustic impedance contrast. Such seismic data are
acquired during geophysical surveys. The methods to process these data are based on
statistical techniques. One of the ways of extracting useful signal from the
contaminated seismic reflection is through deconvolution. In this dissertation work
the scope of deconvolution methods which help in distinguishing the reflections
which are otherwise lost in the reverberatory energy will be dealt with. New optimum
digital filters with a wide range of applications will be designed for this purpose.

The stability of the filter is obtained by incorporating the prewhitening parameter in

the algorithm. The block toeplitz matrix consisting of the auto and cross correlation
for the two signals under consideration. The block toeplitz matrix associated with the
digital filter has been stabilized by a process of normalization and then incorporating
the prewhitening parameter in the algorithm. The prewhitening parameter has been
selected using the criterion of arithmetic mean. The effect of the length of the filter on
the condition number is studied and the stability versus accuracy of the estimated
filter is bought out. The best optimum filter length is obtained for which the solution
is both stable and accurate.


1. INTRODUCTION……………………………………………………………..1

1.1. GENERAL CONSIDERATION………………………………………1

1.2. REFLECTION SEISMICS………………………………………….....1

1.2.1. DATA ACQUISITION……………………………………..1

1.2.2. DATA PROCESSING……………………………………....2
1.2.3. DATA INTERPRETATION………………………………..2


1.4. MATLAB-LITERATURE SURVEY………………………………….3

1.4.1. ABOUT MATLAB…………………………………………3

1.4.2. MATLAB SYSTEM………………………………………..3
1.4.3. MATLAB OPERATORS………………………..…………5
1.4.4. CURRENT DIRECTORY………………………………….6
1.4.5. ADVANTAGES OF MATLAB……………………………6
THIS PROJECT…………………………………………….6


2.1. INTRODUCTION……………………………………………………..9


3.1. PROGRAM FLOW…………………………………………………...14

3.2. TEST CASES…………………………………………………………16


4.1. CONCLUSION……………………………………………………….22
4.2. FUTURE SCOPE OF THE WORK…………………………………..22

5. REFERENCES……………………………………………………………… ..23



Seismology is a branch of science dealing with earthquakes and the study of seismic
waves, the energy waves which travel through the earth. Seismic signals can be
originated by various phenomena, including a sudden explosion or movement of
rocks. Seismic waves are also used to determine the structures of various geographies.
The analysis of seismic data poses several problems because of the assumptions and
limitations of the existing techniques of data acquisition, data processing and

Earthquake is one of the worst natural disasters which are capable of smashing
anything anywhere. Detection and cautious techniques are thus required in this
scenario. This requires analysis of earthquake which includes its strength and scope.
Thus, continuous monitoring of earthquake data is required in order to detect any
earthquake before its occurrence, or at least at the initial stages of its occurrence.
Seismic signals are very sensitive that, they react to all most all the events that take
place in and on the earth. This event can be any movement of any object or it can be
even the foot steps of a man walking on the surface. But analysis of earthquake does
not require all these events. In other words, these small events are the sources of noise
to the seismic wave. Generally, seismic waves travel through the interfaces between
formations having different physical properties before reaching the receiver. This may
also lead to occurrence of unwanted signal in the recorded data. Thus the seismic data
recorded, contains a lot of noise.

The main objective in the processing of these data is to remove the background noise
and unwanted signals from the data recorded, and thereby improving the resolution of
the seismic signal, before interpreting the data in terms of meaningful real time


Reflection seismics is one of the most widely used geophysical technique for
explorations. Seismic exploration can be divided into three main parts:
1. data acquisition,
2. data processing, and
3. data interpretation
which are like the three legs of a stool. A seismic operation does not support much
unless all the three legs are sturdy, showing the contribution and importance of all the
three legs.

1.2.1 Data Acquisition

Acquisition of good, interpretable seismic data starts in the field and the processing
strategies and results are strongly affected by the quality of data acquired. Main
modules required for a seismic system are: detectors and recording instruments. These
subsystems are of equal importance in recording
1 accurate seismic information. There
will be always a possibility for the occurrence of noise through these modules.
Preparing all these modules with immunity towards noise is one of the solution to
avoid noise in recorded data, but is not possible practically for which we require
filters to suppress noise from the recorded data.

1.2.2 Data Processing

The objective of data processing is to analyse and decode the acquired data for a
meaningful interpretation. To achieve this objective, there are different data
processing steps that are carried out.

A seismogram contains a lot of coherent noise such as the multiples and other random
noise. To remove this unwanted information, different data processing tools should be
used in such a way that the final section obtained after processing the data reveals the
actual information regarding the earthquake to a large extent.

1.2.3 Data Interpretation

The main objective of data interpretation is to analyze the filtered data. It may include
the analysis of the frequency and amplitudes of the signal at different instances.
Filtering must be such that the processed data can be readily interpreted. Thus the data
which is ready for interpretation is the final result of the whole filtering process.


Before coming to the central theme of the project, it is desirable to discuss the time-
invariant deconvolution. One of the main stages in seismic data processing is
deconvolution. The concept of deconvolution was developed by Robinson. The
deconvolution operator obtained by the most widely used least-squares estimation
method, has its ramifications in a large number of problems, both stochastic and

Here a deconvolution method is used, where the later part of the seismic trace is
deconvolved by the use of information from the early part of the same seismic trace,
thereby removing the reverberations of the surface layers successfully. Ford suggested
that the deconvolution of a given mixed delay wavelet and the reversal of this given
wavelet can be combined to estimate the complete variable delay suite of spiking
filter performance of the given mixed delay wavelet. The zero delay spiking
emphasizes on the minimum phase portion of the wavelet, whereas the deconvolution
of the reversed wavelet emphasizes the maximum phase portion of the original
wavelet. Deconvolution problems are generally solved using different matrix
inversion techniques. It has been shown that the maximum likelihood filters as
applied to seismic data, have identical filter equations as that of Wiener deconvolution
operators and the same inversion technique can be applied to solve these
deconvolution operators.
In case of time-varying systems, the solution of the system requires an empirical
division of the seismic trace into a number of gates and hence a time invariant filter is
obtained for each such gate.

1.4.1 About MATLAB

MATLAB is a high-performance language for technical computing. It integrates

computation, visualization, and programming in an easy-to-use environment where
problems and solutions are expressed in familiar mathematical notation. Typical uses

 Math and computation

 Algorithm development
 Data acquisition
 Modeling, simulation, and prototyping
 Data analysis, exploration, and visualization
 Scientific and engineering graphics
 Application development, including Graphical User Interface building

MATLAB is an interactive system whose basic data element is an array that does not
require dimensioning. This allows you to solve many technical computing problems,
especially those with matrix and vector formulations, in a fraction of the time it would
take to write a program in a scalar non interactive language such as C or FORTRAN.
The name MATLAB stands for Matrix Laboratory.

1.4.2 MATLAB system

The MATLAB system basically consists of five parts:

 Development Environment: This is the set of tools and facilities that help us
to use MATLAB functions and files. Many of these tools are Graphical User
Interfaces. It includes the MATLAB desktop and Command Window, a
command history, an editor and a debugger, and browsers for viewing help,
the workspace, files, and the search path. MATLAB window is shown in the
following figure.

 The MATLAB Mathematical Function Library: This is a vast collection of

computational algorithms ranging from elementary functions like sum, sine,
cosine, and complex arithmetic, to more sophisticated functions like Matrix
Inverse, Matrix Eigen Values, Bessel Functions, and Fast Fourier Transforms.

 The MATLAB language: This is a high-level language with control flow

statements, functions, data structures, input/output, and object-oriented
programming features. It allows both “programming in the small” to rapidly
create quick and dirty throw-away programs, and “programming in the large”
to create complete large and complex application programs.

 Graphics: MATLAB has extensive facilities for displaying vectors and

matrices as graphs, as well as annotating and printing these graphs. It includes
high-level functions for two-dimensional and three-dimensional data
visualization, image processing, animation, and presentation graphics. It also
includes low-level functions that allow you to fully customize the appearance
of graphics as well as to build complete graphical user interfaces on your
MATLAB applications.

 The MATLAB Application Program Interface (API): This is a library that

allows you to write C and FORTRAN programs that interact with MATLAB.
It includes facilities for calling routines from MATLAB (dynamic linking),
calling MATLAB as a computational engine, and for reading and writing

Fig 1: MATLAB window screenshot with all its fields labled

1.4.3 MATLAB operators

Special Characters
: Specifies the range of the array/matrix elements
() Pass function arguments
[] Construct an array
{} Construct Cell Array
. Decimal point or structure field separator
, Array row element separator
; Array column element separator
% Insert comment line into code
= Assignment

Arithmetic Operators
+ Plus
- Minus
* Matrix multiplication
/ Matrix right division
\ Matrix left division
^ Matrix power
‘ Matrix transpose
.* Array multiplication, element-wise
./ Array right division, element-wise
.\ Array left division, element-wise
.^ Array power, element-wise

Bit-wise Operators
bitand Bit-wise AND
bitcmp Bit-wise complement
bitor Bit-wise OR
bitmax Maximum floating-poing integer
bitset Set bit at specified position
bitxor Bit-wise XOR
bitget Get bit at specified position

Relational Operators
< Less than
<= Less than or equal to
> Greater than
>= Greater than or equal to
== Equal to
~= Not equal to

Logical Operators
&& Logical AND
|| Logical OR
~ Logical NOT
all Test to determine if all elements are nonzero
any Test for any nonzero elements
false False array
find Find indices and values of nonzero elements
true True array
xor Logical EXCLUSIVE OR
1.4.4 Current Directory

By default, MATLAB current directory path will be set to its own folder, which is
created while installing MATLAB. Any programs or files created will be saved into
this folder. This path can be changed, or new paths can be added, using the
appropriate options available in the MATLAB window. A file can be imported into
MATLAB, only if the file path is available in the current directory.

1.4.5 Advantages of MATLAB

 Entrance time to start using MATLAB is low. Only a few hours of training is
sufficient for a new MATLAB user to start developing simulation tools.
 Recent version of the MATLAB compiler can compile to C, C++, and binary
code, allowing the use of different optimization options for high-speed
 As a consequence, performance of the MATLAB linear-algebraic solvers has
been drastically improved in the latest versions of the software, which include
additional accelerators for operations with vector/matrix data types.
 The open architecture allows for very rapid extension of the range of
functionality of MATLAB by developing and sharing new toolboxes.
 Using MATLAB tools and toolboxes, it is possible to develop a prototype of
an application for a relatively very short time.
 It is easy to exchange toolboxes and parts of code within a team and between
teams working in the same area.

1.4.6 MATLAB in-built functions used in this project

max( )
m = max(array/matrix name)
it is the function used to find the maximum value in an array or a matrix. Name of the
array or matrix is passed as parameter to max(). The function returns the maximum
value, which will be stored into the target variable, ‘m’ here.

size( )
d = size(A)
d = size(A, s)
Suppose A is an m-by-n symbolic or numeric matrix. The statement d = size(A)
returns a numeric vector with two integer components, d = [m,n].
The statement d = size(A, s) returns the length of the dimension specified by the
scalar ‘s’. For example, size(A,1) is the number of rows of A and size(A,2) is the
number of columns of A.

xcorr( )
c = xcorr(x,y)
c = xcorr(x)
xcorr estimates the cross-correlation sequence of a random process. Autocorrelation is
handled as a special case. c = xcorr(x,y) returns the cross-correlation sequence in a
length 2*N-1 vector, where x and y are length N vectors (N>1). If x and y are not the
same length, the shorter vector is zero-padded to the length of the longer vector.

sum( )
m = sum(s)
sum gives the algebraic sum of all the elements present in the array/matrix ‘s’.

ones( )
s = ones(m)
s = ones(m,n)
ones creates an n dimensional array or matrix with all its elements as 1, where n is the
number of parameters to ones, and the array length is given by the values of the
parameters. s = ones(m,n) creates a matrix of size m-by-n with all elements equal to 1.

zeros( )
s = zeros(m)
s = zeros(m,n)
zeros creates an n dimensional array or matrix with all its elements as 0, where n is
the number of parameters to zeros, and the array length is given by the values of the
parameters. s=zeros(m,n) creates a matrix of size m-by-n with all elements equal to 0.

conv( )
w = conv(u,v)
w = conv(u,v) convolves vectors u and v. Algebraically, convolution is the same
operation as multiplying the polynomials whose coefficients are the elements of u and
v. If u is of length m, v is of length n, then w will be of size m+n-1.

subplot( )
subplot(x,y,z) 7
subplot(x,y,z) divides the figure window into x rows and y columns, and selects z th
part from that for current use.
plot( )
plot(y) plots the columns of y versus the index of each value when y is a real number.
For complex y, plot(y) is equivalent to plot(real(y),imag(y)), where real(y) gives the
real part of y, and imag(y) gives imaginary part of y.

MATLAB has a lot of in-built functions and libraries which can be directly imported
and used in the current program, and all the functions with their description are
available in the help window, which facilitates programmers to learn MATLAB
individually and quickly, without anyone’s help and support.



The role of deconvolution as an important step in seismic data processing has been
discussed in chapter I. it is designed mainly to suppress the noise present in the
seismogram. The deconvolution operators are designed for time-invariant seismic
sequence using least squares criterion. However, when the seismic trace is not
stationary the least squares criterion is not valid. In such cases, either absolute error
criterion or dividing the sequence into segments such that each segment is time-
invariant should be used. A study on the design of time-varying deconvolution
operators obtained by dividing the input seismic trace into a number of sections is
dealt with in this chapter. The conventional method of dealing with nonstationary
seismic trace is to divide the input seismic trace into a number of stationary sections
based on some optimum criterion, and to compute the filter for each section separately
and the segmented outputs are combined together to form the actual output, whereas
in this chapter a combined filter for the entire sectioned input is computed and its
importance brought out.


Given a stationary seismic trace x(t) and a desired output d(t), Wiener (1949) and
Robinson and Treitel (1967) have designed a least squares filter in such a way that it
minimizes the error energy or the error power existing between the desired output d(t)
and the actual output y(t).

Mathematically it is given as

I = E [ (d(t) – y(t)2 ] → (3.1)

where E is the expectation and y(t) is the actual output and is defined as the
convolution of the input with the filter coefficients

wherein f(s) is the unknown filter coefficients to be determined.

Substituting equation (3.2) in equation (3.1) gives

Minimizing the error energy implies minimizing equation (3.1) and this is achieved
by setting all the partial derivatives of equation (3.3) with respect to f(s) (s=0,1,….m)
equal to zero. Then a set of (m+1) normal equations in the unknown filter coefficients
f(s) is obtained and is given by Robinson (1954) as

→ (3.4)

where = E [ x(t) d(t+ )] is the cross correlation function of the desired

output d(t) and the input x(t)

= E [ x(t) d(t+ )] is the autocorrelation function of the input

x(t) of length (n+1)
is the lag

These set of normal equations (3.4) are called the discrete form of Wiener-Hopf
integral equations for the single channel input output system. These system of
equations are called normal because the error vector is perpendicular or normal to y.
Equation (3.4) can be written in a convenient abbreviated form as

f R = g → (3.5)

where f is the row vector of length (m+1) of Wiener filter coefficients to be obtained,
R is the autocorrelation matrix which is Toeplitz and g is the row vector of cross
correlation coefficients.

The solution of equation (3.5) is written as

f = R-1 g → (3.6)

Let us now consider the case when the input seismic trace is nonstationary. In such
case equation (3.4) is no longer valid since both the autocorrelation and cross-
correlation are time-varying in nature. However, Booten (1952) has given the
modified Wiener-Hopf integral equations for the time-varying inputs as

→ (3.7)

where is the time-varying cross-correlation between the desired output

and the input
is the time-varying auto-correlation function of the input
are the unknown filter coefficients
= + t where is the lag time and t is the observation time

In discrete form the above set of equations is written as

→ (3.8)

The above equation is obtained by minimizing equation (2.1) when y(t) takes the form

y(t) = →(3.9)

Let us now divide the input seismic trace into a number of sections, say N.
Mathematically this can be expressed as

x(t) = →(3.10)

where xi(t) = xi{u[t-(i-1)T] – u(t-iT)}

in which u(t) is the step function defined as

u(t) = 1 if t>=0
= 0 if t<0
T is the gate length for which xi(t) can be assumed to be time invariant

For stationary sections, time-varying autocorrelation functions and filter coefficients



One can also consider the filter coefficients to be a function of time.

The actual output y(t) given in equation (3.9) now takes the form

y(t) = →(3.11)
For convenience, let us divide the input seismic trace into three sections, i.e., i=1,2,3
and let us consider a two length filter. Hence equation (3.11) can be written as

y(t) = →(3.12)

The filter coefficients are obtained by minimizing the total error energy which is
given as

which implies

s=0 i=1 s=1 i=1
s=0 i=2 s=1 i=2
s=0 i=3 s=1 i=3
the normal equations are obtained by setting the partial derivatives with respect to the
filter coefficients equal to zero, i.e.,

If s=0 and i=1, then

Which implies


This is obtained because, d(t) is not a dependent of ‘f’ but y(t) is a dependent of ‘f’.
Substituting the value of y(t) as given in equation (3.12) gives

This can be expressed as



Thus the above equation reduces to the form

ɸd x1(0) = f1(0)ɸx1 x1(0) + f2(0)ɸx2 x1(0)+f3(0)ɸx3 x1(0)+
f1(1)ɸx1 x1(-1)+f2(1)ɸx2 x1(-1)+f3(1)ɸx3 x1(-1) →(3.15)

Similarly the remaining five normal equations are derived. These can be written in
matrix form as

Solving these system of equations the unknown filter coefficients are obtained. Block
diagram is given for the proposed filter. The above equations can be generalised and
abbreviated as
F = R-1 G →(3.17)

Where R is the block toeplitz autocorrelation matrix, G is the crosscorrelation matrix,

and F contains the filter coefficients. This equation is similar to equation (3.5).

R and G can be found from the recorded seismic trace, and the above equation (3.17)
can be solved by applying matrix operations, which gives the values of F, filter
coefficients. These filter coefficients now can be applied for any other seismic trace
also, to remove the noise present in the seismic wave. Thus F is the matrix containing
wiener filter coefficients.

When any seismic trace is convolved with this filter, the resultant signal will be the
pure seismic response, without any noise. Hence, noise is filtered out from the data,
which is the main theme of this project.



The whole processing is done on digital data, though the seismic trace is analog. For
the purpose of computation, digital data is taken which represents the analog trace,
and all the filtering operations are done on that digital data.

Matlab is the simulation software, which works on matrices. All the data which we
process using Matlab are represented in form of a matrix. Here also, the seismic trace
is taken in form of a matrix, on which the corresponding filtering processes are


• The digital seismic trace is stored into a matrix.

• That sequence is divided into ‘n’ no. of parts, and the whole matrix is divided
by the maximum value of all the values of the sequence matrix. This is
required to achieve scaling of the seismic trace.
• Autocorrelation sequences are found for all the ‘n’ parts of the sequence.
• All these sequence values are added to get the corresponding sequence’s
expected values.
• Desired output can be defined, or a prewhitening parameter is considered.
• Crosscorrelation sequences for the seismic trace and desired sequence are
• These sequences are added, to ghe the corresponding expected values.
• Filter matrix is found by dividing the crosscorrelation matrix with
autocorrelation matrix. This matrix contains the filter coefficients.
• Now convolution is performed with the seismic trace and the filter
coeffecients, and its results are stored into the output matrix.
• This output matrix is multiplied by a scalar value, which is the maximum
value of the raw seismic trace. This is done for the sake of scaling.
• Output matrix values are plotted, which gives the filtered seismic wave.


%wiener filter code for seismic signal processing

clc; %clears screen
close all; %closes all opened figure window

seqq=aa(:,1)'; %taking input from the workspace into seq

seq=seqq/max(seqq); %scaling factor

lc=size(seq,2); %length of the sequence

n=2; %n gives the no of divisions of the given
l=lc/n; %length of each division
x=seq(1:l); %first sub sequence of the parent sequence

for i=1:n-1
[x]=[x;xi]; %appends the next sub sequences to the
%previous sub sequence

%x contains the sub sequences.each row in this matrix is a sub sequence

x11=xcorr(x(1,:)); %autocorrelation of x1
x22=xcorr(x(2,:)); %autocorrelation of x2
x12=xcorr(x(1,:),x(2,:)); %crosscorrelation of x1 and x2

sx11=sum(x11); %expected value of x1 x1

sx12=sum(x12); %expected value of x1 and x2
sx22=sum(x22); %expected value of x2 x2

d=[ones(1,1),zeros(1,size(seq,1))]; %required output

dx1=xcorr(d,x(1,:)); %crosscorrelation of d and x1

dx2=xcorr(d,x(2,:)); %crosscorrelation of d and x2

sdx1=sum(dx1); %expected value of d and x1

sdx2=sum(dx2); %expected value of d and x2

ax=[sx11,sx12;sx12,sx22]; %formation of autocorrelation matrix

xx=[sdx1;sdx2]; %formation of crosscorrelation matrix

f=ax\xx; %finding function filter matrix

y=conv(seq,f); %gives the filtered seismic data, un-scaled
y=y*max(seqq); %scaling

plot(seqq); %plotting original data
plot(y); %plotting filtered data

Pre-considerations for the above program is, the seismic trace must be available in
the workspace of MATLAB, in the variable ‘aa’. Or lese store the seismic trace in
any desired variable, and modify the above program according to that variable
name, i.e., replace ‘aa’ with the desired variable name, in the above program.


Test case 1: The seismic trace which is recorded when there is no earthquake

Fig 2: raw seismic trace with no earthquake

This is the screenshot of the waveform from MATLAB figure window, which is
the plot of the raw seismic data recorded at N.G.R.I, when no earthquake is
occurred. From the graph, the maximum amplitude of the seismic wave is
1.19X104 which is a huge value, and it is just because of noise.

Fig 3: filtered seismic trace with no earthquake

This is the screenshot of the waveform from MATLAB figure window, which is
the plot of the filtered data of the above raw seismic trace. From the graph,
maximum value is found to be 0.27 which is almost nothing, when compared to
1.19X104, the maximum value of the raw seismic trace.

Test case 2: Other seismic trace which also contains only noise

Fig 4: raw seismic trace with no earthquake

This is the screenshot of the waveform from MATLAB figure window, which is
the plot of the raw seismic data recorded at N.G.R.I, when no earthquake is
occurred. From the graph, the maximum amplitude of the seismic wave is 1.9X104
which is a huge value, and it is just because of noise.

Fig 5: filtered seismic trace with no earthquake

This is the screenshot of the waveform from MATLAB figure window, which is
the plot of the filtered data of the above noisy seismic trace. From the graph,
maximum value is found to be 0.42 which is very low, when compared to
1.9X104, the maximum value of the raw seismic trace.

Test case 3: Earthquake recorded at Koyna observatory

Fig 6: raw seismic trace with earthquake

This is the screenshot of the waveform from MATLAB figure window, which is
the plot of the raw seismic data recorded, when earthquake is occurred at Koyna.
From the graph, the maximum amplitude of the seismic wave is 3X10 6. It has both
earthquake and noise traces.

Fig 7: filtered seismic trace with earthquake

This is the screenshot of the waveform from MATLAB figure window, which is
the plot of the filtered data of the above noisy seismic trace. From the graph,
maximum value is found to be 1.5X106 which is a lower value, when compared to
1.9X104, the maximum value of the raw seismic trace.

Thus, the designed filter is applicable to any kind of seismic trace, and is
successful in removing the noise components from the recorded data.




In the present work, the seismic noise is filtered out, based on the statistical
analysis of the seismic trace with the help of auto-correlation and cross-correlation
operations, applied on the scaled seismic data. This work gives the practical
application of the basic principles and theories involved in statistical analysis of
signals and processing the signal.

The filtered seismic data is found to be helpful to extract the required information
from the raw seismic trace, and this is applicable for any kind of operation which
includes ground-water extraction, and earthquake analysis.

This project also gives the basic introduction to MATLAB, which is essential for
the Beginners to expose themselves to MATLAB development environment.


The present work is based on Wiener filter, which is applicable for only statistical
analysis, and it can not give better performance when applied in dynamic analysis.
To overcome this drawback, Wiener filter could be designed based on frequencies
rather than on correlation, which is very difficult and complex to achieve. Instead,
use of other filters like Kalman filter could delimit this limitation.

Developing the same filter with normalization factor and prewhitening parameters
could increase the efficiency of the filtering process.


1. Some Applications of time-varying deconvolution operators to seismic

signals, KirtiSrivastav, V.P. Dimri, 1991.




5. IEEE paper-2009 published by Thandan Babu Naik, Raghavan, on Seismic

data filtering.

6. Proschema : A Matlab application for processing strong motion records and

estimating earthquake engineering parameters, by M. Segou, N. Voulgaris

7. for Signal

Processing Using MATLAB.