Fourier Analysis

Transcription

Fourier Analysis
ENGN/PHYS 225—Winter 2016
Fourier Series and Transforms: Real world applications
Due date: Monday, March 28, 2016, in class
Background
Why do two instruments sound different even when the same note is struck, sung, plucked?
How we can pluck out important data about how a vibrational modes of a structure based on
displacement vs. time data?
How can we distinguish between a brain thinking “move my foot” vs. “move my right hand”
via analysis of electrical recordings?
How can we enhance the quality of a signal corrupted by noise?
Survey says: Fourier series and transforms. Ding, ding, ding!
The purpose of this assignment to highlight real-world applications and implementation of
Fourier analysis, and connect those results back to theoretical results, thus completing the circle of
life.
Materials and Methods
We’ll make use of MATLAB to analyze real-world data. To help you navigate through this assignment, explicit directions and hints have been written in (excruciating?) detail. Please
read them carefully so you can follow along with ease.
Data Sets
Data sets are provided to you in .mat file format (biomedical data) or .wav format (sound files),
which can be fed directly into matlab using the provided matlab function: freqAnalysis.m.
You will need to download the .zip file with all necessary files at: http://home.wlu.edu/
ericksonj/engn225_w2016/probsets/fourier_matlab.zip.
Be sure to unzip (“extract”) the
~
files before proceeding. For instance, in the IQ center, use 7zip, right click and you should have a
menu option to unzip or extract. Keep all of these files in one folder. Note carefully the directory
(folder) where you unzipped these files.
1
MATLAB
You need to tell matlab where these files live, so that they can be accessed. The easiest way to do
this is to copy and paste the full path to the folder, then go to the matlab command window and
type for example:
>> addpath(‘h:\WandL\Courses2015\MathMethods\probsets\fourier’)
Of course, replace the directory in the example above to be the one on your account/hard drive.
Fourier Synthesizer
You will also need to use a digital fourier synthesizer. There is a really nice, full featured one to
download at: http://www.falstad.com/fourier/ Note: depending on your browser settings, this
java applet may run directly. I use google chrome and had to download the files and run them
locally. To do so, click on the link “Download zip archive of this applet.” Save the files to your
hard-drive. Unzip them. Then double click on the file fourier.jar to launch the synthesizer
(despite what the directions on falstad.com say, don’t double click index.html)
Problems/Experiments
1
Total Eclipse of the Heart
This mini-experiment uses actual electrocardiogram (ECG) data. What’s an ECG? You probably
already know the answer, as you’ve very likely seen in the movies and/or melodramatic NBC
dramas (I’m looking at you, “ER”), where a patient has electrodes connected to their torso and
the signal looks like blip....blip....blip. That’s the electrical signal generated by your heart as a
result of the nervous and muscular activity shuttling around a bunch of ions (aka electrical current
flow). The frequency content of the cardiac signal is used in hospital settings to diagnose abnormal
heart conditions and—near and dear to my heart—monitor the overall health of a prematurely
born baby, to name just a couple of applications. Let’s get started!
ANALYZING REAL WORLD DATA
Crack open the data in the matlab data file ecgdata.mat. The easiest way to do this is this is
go to the main matlab window. On the “Home” tab, near upper left, click “Import Data” (green
down-pointing arrow icon). Navigate to the ecgdata.mat file and select it. Matlab should offer to
“Create variables matching preview” with the variables of t and v1. Click “finish”. The variables
should now be loaded in the matlab workspace The former is a list of times (vector or array) at
which the heart signal was measured, the latter is the voltage varying over time. Also loaded into
the workspace is the variable Fs. This is the sampling rate of the data in units of Hz. It should be
F s = 30 Hz = 30 samples/s in this case.
2
Figure 1: Prototypical ECG data, correlated to phases of the heartbeat.
To verify, plot the signal. You can do this with the plot command like this:
>>plot(t, v1)
You should get a picture that looks like the one in Figure 2.
Figure 2: ECG data from human subject.
Assuming yes, time to chug full speed ahead. First of all, how many beats per minute (bpm)
was this person’s heart beating at?
Now it is time to perform a Fourier analysis: what frequencies are present in the ECG signal?
We’ll tackle this question first empirically, then theoretically.
The empirical part is done with matlab and the fft function. You can learn more about this
function by typing:
>> doc fft
The tutorial below is based off of the second example in this documentation.
Pay particular attention to the examples provided.
3
Specifically, you can compute the fourier transform of the signal v1 by doing the following:
>> L = length(v1)
The length() function returns the number of samples in v1.
>> NFFT = 2^nextpow2(L);
This computes the next power of of 2 from the length of v1. For instance, if L = 1000, then NFFT
will be 1024; This is needed as part of the fast fourier transform algorithm, which works by dividing
and conquering the data in half each pass through.
>> Y = fft(v1, NFFT)/L;
This computes the Fourier transform over a a discrete (but quasi-continuous) range of frequencies. Recall that Y acts like the cn ’s, which are complex numbers.
>> f = Fs/2*linspace(0, 1, NFFT/2+1);
This computes the discrete set of frequencies at which the FFT was computed. The factor of F s/2
is very important. It is known as the Nyquist frequency . Theoretically, it is not possible to
discern frequencies in the signal oscillating faster than F s/2, hence that value is the upper range
for f . You can learn more about linspace(.) by typing: >> help linspace
>> Ysub = Y(1: NFFT/2+1);
This grabs the subset of Y (the result returned from FFT), which correspond to frequencies
≤ F s/2.
>> magnY = 2*abs(Ysub);
This computes the magnitude of the Fourier transform coefficients; think of this essentially as
|cn | + |c−n | = 2|cn | that you are plotting.
>> plot(f, magnY);
>> xlabel(‘Frequency (Hz)’); ylabel(‘FFT(v1)’); title(‘FFT of ECG data’)
Plot the results, with axis labels.
If all went according to plan, you should end up with a figure that looks like that shown in
Figure 3. Note that you can use the “datatip” tool (plus sign along arc; top middle of tool bar) to
explore actual values at which the peaks occur.
MODEL AND THEORETICAL RESULT
Let’s come to grips with why the FFT looks the way it does by computing the Fourier Series
coefficients, modeling our heartbeat signal as follows. Let’s say the QRS begins at time t = 0, such
that the peak voltage occurs a short time afteward. The signal is periodic with T = 1.1 s. Then
4
Figure 3: FFT of ECG data. The fundamental frequency is 1.11 Hz (66 bpm). Many harmonics
strongly contribute.
we have 3 time domains to consider:


for t ≤ 0.067 s
7500 t,
f (t) = 502.5 − 7500 (t − 0.067), for ≤ 0.067 < t ≤ 0.134 s


0
otherwise up to t = 1.1 s
The factor of 7500 is the steep slope (units of muV/s) during the QRS complex. Note that this
triangular pulse width of the modeled QRS complex (0.134 s) is small compared to T (1.1 s).
Given this definition for f (t) compute the Fourier series coefficients cn , and then compute the total
contribution of the nth harmonic as |c−n | + |cn | = 2|cn |.
Make a stem plot of your answer. A stem plot is simply a graphical representation, in this
case, of 2|cn | vs. n (integer harmonic number).
Compare and contrast your answer obtained in MATLAB for real world data vs. the theoretical
result you just obtained given the model of the QRS complex above.
SYNTHESIZE ME
How do a bunch of harmonics add up to a pulse-like QRS complex. To get some intuition for the
results obtained fire up the Fourier synthesizer you previously downloaded from falstad.com. Add
in harmonics in the proper proportion, one at a time, noticing how each harmonic contributes to
the final waveform. Why should most (all) harmonics contribute equally in order to build up a thin
“pulse” waveform? 1
1
If the pulse gets infinitely thin and infinitely tall, we’ll end up with a Dirac delta function! These functions
are of great importance, especially useful in quantum and E&M.
5
2
Mind Reader
Figure 4: Electroencephalogram (EEG) scalp cap. Electrodes are distributed around the skull.
Don’t worry, this nice person isn’t getting her brains sucked out by a syringe. Rather, the experimenter is putting some electrolyte loaded gel beneath the electrode and her scalp to make for a
good electrical connection.
The electroencephalogram (EEG) is widely used for studies of brain and behavior. More recently, many labs are pursuing reading out brain activity for neuroprosthetic applications. The
EEG measures the electrical signal generated by brain activity associated with a certain state of
mind. In terms of neuroprosthetics the basic idea goes like this. The patient may have lost control
of limbs, but they can still think about moving an arm or a leg. These are distinct brain states—
”move arm” vs. “move leg”. This is termed a two class motor imagery task. Presumably, these two
states can be differentiated by their differing electrical activity. This could be done in automated
fashion using fancy AI techniques (that are actually must closer to your finger tips than you think,
especially now that you are nearing the end of math methods!). The computer would recognize
“Oh, we measured a signal associated with thinking about moving the arm forward and right, so
let’s make our robotic prosthetic arm do that!”. Then various motors are turned on, etc. You can
see more state-of-the-art prosthetics at: https://www.youtube.com/watch?v=flacabyMGQk. For
now, on with the Fourier analysis!
In the matlab command window, clear off your old results by doing:
>>clear all
Next, import the data stored in the data file eegdata.mat. It after clicking “finish” MATLAB you
may get a dialogue box warning you that variables in the workspace of the same name already exist.
It is safe to overwrite them, so click OK. At this point you should have varables in the workspace:
y1, y2, t, and Fs.
You can plot the data and should see signals that look like the ones in Figure 5:
The EEG data set you are about to work with is a two class motor imagery task from: http:
//bnci-horizon-2020.eu/database/data-sets. While the patient is donning the head cap, she
was asked to think about moving her foot or her arm (but not both). The recording from one
6
Figure 5: EEG trials for motor imagery of moving the hand (top) and foot (bottom). Is the
frequency content of these signals different enough to tell them apart?
electrode from the first trial (“move arm”) is stored in y1. The “move foot” trial EEG recording is
stored in y2. The time vector t specifies the times at which the voltage was sampled. The sampling
rate is stored in Fs (= 512 Hz).
The core question the authors of the study were trying to address is whether the FFT can be
used to discriminate between the two tasks. Can it? Let’s find out!
Compute and plot the FFT of the first and second trial results. Observe that a lot of the action
takes place at lower frequencies, so it will likely be very helpful to limit the range of frequencies
you are viewing. You can do this by typing in the matlab command window:
>>xlim([0 15])
This limits the x-axis to display between 0 and 15 Hz only.
Back to the addressing the main question: Based on the plots of voltage vs. time can you
discern any statistically significant differences between the recordings? How about for the FFTs
for trial 1 and trial 2, can you discern any real difference? What frequencies seem to be produced
more strongly for imaginging moving one’s hand vs. the foot, and vice-versa? Make a quantitative
argument stating whether and how a computer could tell apart the two motor tasks based on the
FFT. There is no single right answer, but build a case for whatever you ultimately claim.
7
3
Building vibrations: What’s all that noise?
You’ve just been hired as a young, hotshot mechanical engineer with USAID. The first assignment
is to analyze the vibrational modes of a 4-story building being constructed in downtown Lex. The
natural frequencies of vibration are crticially important to know. Prior to construction it must be
ascertained that there are no forces (perhaps wind or A/C fans on the top of the building) acting
at any of these freuqencies, else the building could resonate and then very bad things happen. So
you get out some handy strain gagues, attach them to the walls of the building and make some
measurements for displacement over time.
REAL WORLD DATA
Real world data is always corrupted by noise to some extent. Ideally, an experimenter would make
clean recordings with the underlying signal of interest having a much greater magnitude than the
noise. Ideally. There are many cases in the real-world when we are interested in knowing the
underlying frequency of the signal of interest—shooting lasers at high-speed airflow (hello, Prof
Kuehner’s lab), gigahertz optics for waveguides, and mechcanical vibrations of civil structures.
This problem focuses on the mechnical vibrations of a 4 story building, but could be generalized
to any number of real world scenarios. The building is assumed to have equal spring constants and
masses for all floors: k = 45698 N/m, and m = 5000 kg. Yours truly simulated this building, then
added Gaussian (random) noise to obscure the underlying vibrations of each of 4 floors.
Start by clearing off your matlab workspace (>> clear all), then loading the data in vibrationdata.mat.
You should see the variables t, Fs, and x in your workspace. In this case, the variable x is a 4×
542 matrix. Thus, displacement for the first floor is encoded in the first row, the second floor in
the second row, etc. You can parse out this data, like this:
>> x1 = x(1, :);
This is MATLAB shorthand notation for indexing the first row and all columns (that’s what
the colon does). Then you can plot the data, per standard operating procedure:
>>plot(t, x1);
Doing so should produce a figure that looks akin to that in Figure 6:
Figure 6: Simulated vibration data for a 4 story building. Noise has been added to obscure the
underlying vibrations over time.
8
Now the question becomes: If you saw this raw data, could you discern the underlying vibrational frequency(-ies) of the first floor? If yes: Teach me, oh master! In general, humans are really
bad at parsing out underlying frequencies by visual analysis. (Conversely, our ears/auditory are
exceptionally good at it!) Well, how can you tease out frequency content from what looks like a
really messy plot? Enter Fourier transforms. Compute and plot the FFT of the vibrational data.
You should do this for at least 2 floors.
Based on this FFT, what do you discern are the natural frequencies ωk (k = 1 − 4) at which
the building vibrates?
THEORETICAL CONSIDERATIONS
How does this compare to theory? To answer that, you must recall the halcyon days of matrix
math—eigenvalue problems applied to mechanical vibrations (It wasn’t so long ago was it?).
Compare and contrast your experimental and theoretical results.
Again, the main take home message is that even if your data looks really messy, there may be
some beautiful and very meaningful underlying structure to it, you just have to use the proper tool,
in this the FFT. File that away in your tricks-of-the-trade tool belt!
9
4
The Sound of Music–Choose your own adventure
Why does a violin have a different sound quality (timbre) than a piano? Put another way, if you
play an A on the piano, it sounds very differently than if you play an A on, say, the clarinet. Turns
out that our human ears and auditory system are very atuned to the precise recipe of harmonics
arriving at our ear drum. Our auditory system essentially performs a Fourier analysis, and what
we ultimately perceive in terms of sound quality depends on the how strongly each harmonic is
mixed in—-i.e, the relative magnitudes of the cn ’s in the Fourier seres.
Sounds waves are of course longitudinal pressure waves traveling through air. So, music is great
fodder for Fourier analysis.
Figure 7: Why does a piano sound different than a cell than a harp than a tuba? Image credit:
questgarden.com
10
4.0.1
THEORETICAL CONSIDERATIONS
To understand why, say a piano, has multiple modes excited when you strike a key causing a
hammer to hit a string inside the piano, let’s do a little Fourier by hand. Imagine you have a piano
string of length L. The hammer strikes the string at a distance d = L/8 from the end, causing it
to displace at that point a distance y(L/8) = h. Thus, the deformation of the string just as the
hammer strikes it is modeled as follows:
(
y(x) =
h
d
x
h
− L−d
for 0 ≤ x < d
(x − d) + h for d < x ≤ L
Plot the function y(x) (displacement of the string vs. distance down the string) for 0 ≤ x ≤ L,
then compute the Fourier series coefficients. Make a stem plot of the result. Which modes (harmonic
numbers) will be most strongly excited? Which are least excited? You can/should double check
your result makes sense by synthesizing a wave according to this recipe in the Falstad Fourier java
applet.
EXPERIMENT
Time to choose your own math-meets-music adventure! Pair up with a classmate to develop your
own little mini-project involving FFT analysis and musical instruments. Be creative and study a
musical aspect that is particularly interesting to you! If you are stuck (unlikely since most of you
are musically inclined!) consult the instructor for ideas. To help get the wheels turning, here a
few sample ideas. You could compare sound quality from various instruments (piano vs guitar).
Or compare sound quality on the different makes/models of the same instrument (e.g. an upright
piano vs a grand (your friend singing vs your own pipes); an acoustic guitar vs electric; different
playing styles on a bass or reed instrument; the same song by two different artists. Please run
your idea by the instructor for approval before plunging ahead.
For your report, describe what you studied, present and briefly discuss your main empirical
findings. You should definitely discuss what you heard in relation to how that manifested in the
frequency spectra.
Below are some very specific instructions about how to use computer software to record sound
files and analyze them in matlab.
1. Launch Audacity, plug in an external microphone (if needed; many modern day laptops come
with reasonably hi-fi mics built in). Record a data file using the big red record button. Save
the file as a .wav. Optionally, you may want to highlight and zoom in on the section of
interest. You’ll need to analyze only a single note or chord at a time, so something
like 100-400 msec worth of data should be plenty. Note that Audacity can play a highlighted
section only, such that you can verify you have captured a single note or chord being played
by the orchestra.
11
2. Export this cropped selection as a .wav format sound file for further analysis. To do this,
navigate to File >> Export Selection as WAV. Important: when saving the file, save to your
h: drive, or other network drive. It is strongly recommended to save this file into the folder
where all other Fourier series materials were originally unzipped.
3. For frequency analysis of the .wav file you will use MATLAB
4. Now, download the frequency spectra analysis script from the course webpage (it is a .m file).
Save this file to exactly the same folder where your .wav files are. Do NOT place it in a
subfolder/directory.
To test whether everything is working ok, type at the command prompt:
>> which freqAnalysis
You should see a directory/folder returned as text. Otherwise, if you get a message like
“freqAnalysis not found” something has gone wrong. Consult the instructor for help as
needed.
5. Now to use the function, you can type at the command prompt something like:
>> FFT = freqAnalysis(‘pianoE4.wav’, [0 3000]);
Note the single quote marks around the file name and the square brackets around 0 to 3000.
This command tells MATLAB: Please use the function freqAnalysis.m to analyze the audio
file pianoE4.wav, compute the Fourier transform, and display the results for all frequencies
between 0–3000 Hz. Of course you need to change the file name to whatever you named
your file. Also, you may want to change the frequency limits to something more conducive
for viewing, should you have mostly very low frequency content, or high frequency content.
Don’t forget the square brackets around 0 and 3000—they are essential! If all goes well, the
computer should think for a few seconds, then output a nice graph of the FFT, which you
can then analyze in detail. I highly recommend saving and/or printing out frequency spectra.
You’ll want them for discussion in your final report.
12
Appendix: Some Math Theory on Fourier Series and Transforms
Figure 8: Example of Fourier synthesis. Blue + green + red waves = brown wave. Image credit:
http://electron6.phys.utk.edu/optics421/modules/m5/Coherence.htm
Fourier synthesis means adding many waves, each with just the right amplitude, to obtain an
arbitrary periodic waveform. A simple example is shown in Figure 8. Mathematically, this idea
can be expressed as in Eqn. 1.
∞
∞
X
ao X
x(t) =
+
an cos(nωo t) + bn sin(nωt) =
cn ejnωo t
2
n=−∞
(1)
n=1
where x(t) is an abtirary periodic waveform, with fundamental period T = 2π/ωo . We’ve
derived/discussed in class, how to determine the an ’s, bn ’s, and cn ’s using orthogonality , where n
is the harmonic number . Determining these coefficients is often referred to as “doing a Fourier
analysis.”
Note that a Fourier Series is restricted to finding coefficients at discrete integer spacings of
ωn . The notion of a Fourier Transform extends the idea of a Fourier Series to add up waves
over a continuous spectrum of (angular) frequencies ω. This assingment focuses on using a computer implementation of the Fast Fourier Transform. All real data sets in the world are actually
discrete—we take samples of electrical or mechanical or optical quantities at discrete times. A good
experiment design will sample data so fast at a rate fs samples/s (Hz) such that the data look sort
of continuous. The upshot is that when a computer computes a Fourier Transform, it does so using
a famous (in the math world) algorithm known as the Discrete Fast Fourier Transform (FFT
for short).
13