We define a signal as data that measures either time-varying or spatially varying phenomena. Sound or electrocardiograms are excellent examples of time-varying quantities, while images embody the quintessential spatially varying cases. Moving images (movies or videos) are treated with the techniques of both types of signals, obviously.
The field of signal processing treats four aspects of this kind of data – its acquisition, quality improvement, compression, and feature extraction. SciPy has many routines to treat tasks effectively in any of the four fields. All these are included in two low-level modules (scipy.signal
being the main one, with an emphasis in time-varying data, and scipy.ndimage
, for images). Many of the routines in these two modules are based on Discrete Fourier Transform of the data.
In this chapter, we will cover the following things:
scipy.fftpack
Additional details on the subject can be found in Python for Signal Processing, Unpingco José, Springer Publishing.
Discrete Fourier Transform (DFT) transforms any signal from its time/space domain into a related signal in frequency domain. This allows us not only to analyze the different frequencies of the data, but also enables faster filtering operations, when used properly. It is possible to turn a signal in frequency domain back to its time/spatial domain, thanks to the Inverse Fourier Transform (IFT). We will not go into details of the mathematics behind these operators, since we assume familiarity at some level with this theory. We will focus on syntax and applications instead.
The basic routines in the scipy.fftpack
module compute the DFT and its inverse, for discrete signals in any dimension – fft
, ifft
(one dimension); fft2
, ifft2
(two dimensions); fftn
, ifftn
(any number of dimensions). All of these routines assume that the data is complex valued. If we know beforehand that a particular dataset is actually real valued, and should offer real-valued frequencies, we use rfft
and irfft
instead, for a faster algorithm. All these routines are designed so that composition with their inverses always yields the identity. The syntax is the same in all cases, as follows:
fft(x[, n, axis, overwrite_x])
The first parameter, x
, is always the signal in any array-like form. Note that fft
performs one-dimensional transforms. This means that if x
happens to be two-dimensional, for example, fft
will output another two-dimensional array where each row is the transform of each row of the original. We can use columns instead, with the optional parameter, axis
. The rest of the parameters are also optional; n
indicates the length of the transform and overwrite_x
gets rid of the original data to save memory and resources. We usually play with the integer n
when we need to pad the signal with zeros, or truncate it. For a higher dimension, n
is substituted by shape
(a tuple), and axis
by axes
(another tuple).
To better understand the output, it is often useful to shift the zero frequencies to the center of the output arrays with fftshift
. The inverse of this operation, ifftshift
, is also included in the module. The following code shows some of these routines in action when applied to a checkerboard image:
>>> import numpy >>> from scipy.fftpack import fft,fft2, fftshift >>> import matplotlib.pyplot as plt >>> B=numpy.ones((4,4)); W=numpy.zeros((4,4)) >>> signal = numpy.bmat("B,W;W,B") >>> onedimfft = fft(signal,n=16) >>> twodimfft = fft2(signal,shape=(16,16)) >>> plt.figure() >>> plt.gray() >>> plt.subplot(121,aspect='equal') >>> plt.pcolormesh(onedimfft.real) >>> plt.colorbar(orientation='horizontal') >>> plt.subplot(122,aspect='equal') >>> plt.pcolormesh(fftshift(twodimfft.real)) >>> plt.colorbar(orientation='horizontal') >>> plt.show()
Note how the first four rows of the one-dimensional transform are equal (and so are the last four), while the two-dimensional transform (once shifted) presents a peak at the origin and nice symmetries in the frequency domain.
In the following screenshot, which has been obtained from the previous code, the image on the left is fft
and the one on the right is fft2
of a 2 x 2 checkerboard signal:
The scipy.fftpack
module also offers the Discrete Cosine Transform with its inverse (dct
, idct
) as well as many differential and pseudo-differential operators defined in terms of all these transforms – diff
(for derivative/integral); hilbert
, ihilbert
(for the Hilbert transform); tilbert
, itilbert
(for the h-Tilbert transform of periodic sequences); and so on.
3.140.197.136