Description: This video covers complex Fourier series, transforms, discrete Fourier transforms, and power spectra.
Instructor: Michale Fee
MICHALE FEE: So who remembers what that's called? A spectrograph. Good. And it's a spectrogram of me.
Good morning, class.
OK. So it's a spectrogram of speech. And so we are going to continue today on the topic of understanding-- developing methods for understanding how to characterize and understand temporally structured signals. So that is the microphone recording of my voice saying "good morning, class." And then this is a spectrogram of that signal where at each moment in time, you can actually extract the spectral structure of that signal.
And you can see that the information in speech signals is actually carried in parts of the signal in the way the power in the signal at different frequencies changes over time. And your ears detect these changes in frequency and translate that into information about what I'm saying.
And so we're going to today start on a-- well, we sort of started last time, but we're really going to get going on this in the next three lectures. We're going to develop a powerful set of tools for characterizing and understanding the temporal structure of signals. So this is the game plan for the next three lectures.
Today we're going to cover Fourier series-- complex Fourier series. We're going to extend that to the idea of the Fourier transform. And then so the Fourier transform is sort of a very general mathematical approach to understanding the temporal structure of signals. That's more of a-- you think of that more in terms of doing analytical calculations or sort of conceptual understanding of what Fourier decomposition is.
But then there's a very concrete algorithm for characterizing spectral structure of signals called the fast Fourier transform. And that's one class of methods where you sample signals discretely in time and get back discrete power at discrete frequencies. So that's called a discrete Fourier transform. And most often that's used to compute the power spectrum of signals. And so that's what we're going to cover today.
And then in the next lecture, we're going to cover a number of topics leading up to spectral estimation. We're going to start with the convolution theorem, which is a really powerful way of understanding the relationship between convolution in the time domain and multiplication of things in the frequency domain.
And the convolution theorem is really powerful, allowing you to kind of think about, intuitively understand the spectral structure of different kinds of signals that you can build by convolving different sort of basic elements. So if you understand the Fourier decomposition of a square pulse and a train of pulses or a Gaussian, you can basically just by kind of thinking about it figure out the spectral structure of a lot of different signals by just combining those things sort of like LEGO blocks. It's super cool.
We're going to talk about noise and filtering. We're going to talk about the Shannon-Nyquist sampling theorem, which tells you how fast you have to sample a signal in order to perfectly reconstruct it. It turns out it's really amazing. If you have a signal in time, you can sample that signal at regular intervals and perfectly reconstruct the signal if that signal doesn't have frequency components that are too high. And so that's captured in this Shannon-Nyquist sampling theorem.
That turns out to actually be a topic of current debate. There was a paper published recently by somebody claiming to be able to get around the sampling theorem and record neural signals without having to guarantee the conditions under which the Shannon-Nyquist sampling theorem claims. And Markus Meister wrote a scathing rebuttal to that basically claiming that they're full of baloney. And so those folks who wrote that paper maybe should have taken this class. So anyway, you don't want to be on the wrong end of Markus Meister's blog post. So pay attention.
So then we're going to get into spectral estimation. Then in the last lecture, we're going to talk about spectrograms. We're going to talk about how to compute spectrograms and understand really how to take the data and break it into samples called windowing, how to multiply those samples by what's called a taper to avoid contaminating the signal with lots of noise that's unnecessary.
We're going to understand the idea of time bandwidth product. How do you choose the width of that window to emphasize different parts of the data? And then we're going to end with some advanced filtering methods that are commonly used to control different frequency components of signals in your data. So a bunch of really powerful things.
Here's what we're going to talk about today. We're going to continue with this Fourier series. We started with symmetric functions last time. We're going to finish that and then talk about asymmetric functions. We're going to extend that to complex Fourier series, introduce the Fourier transform and the discrete Fourier transform and this algorithm and the fast Fourier transform, and then I'm going to show you how to compute power spectrum.
So just to make it clear, all of this stuff is basically going to be to teach you how to use one line of MATLAB. One function, FFT. Now, the problem is it's really easy to do this wrong. It's really easy to use this but not understand what you're doing and come up with the wrong answer. So all of these things that we're going to talk about today are just the kind of basics that you need to understand in order to use this very powerful function in MATLAB.
All right. So let's get started. So last time, we introduced the idea of a Fourier series. We talked about the idea that you can approximate any periodic function. So here I'm just taking a square wave that alternates between positive and negative. It's periodic with a period capital T. So it's a function of time. It's a even function or a symmetric function, because you can see that it's basically mirror symmetry around the y-axis. It's even because even polynomials also have that property of being symmetric.
We can approximate this periodic function T as a sum of sine waves or cosine waves, in this case. We can approximate that as a cosine wave of the same period and the same amplitude. So we can approximate as a coefficient times cosine 2 pi f0 t where f0 is just 1 over the period. So if the period is one second, then the frequency is 1 hertz, 1 over 1 second. We often use this different representation of frequency, which is usually called omega, which is angular frequency. And it's just 2 pi times this oscillation frequency. And it has units of radians per second.
So we talked about the fact that you can approximate this periodic function as a sum of cosines. We talked about the idea that you only need to consider cosines that are integer multiples of omega 0, because those are the only cosine functions, those are the only functions, that also are periodic at frequency omega 0. So a function cosine 3 omega 0 t is also periodic at frequency omega 0. Does that make sense?
So now we can approximate any periodic function. In this case, any even or symmetric periodic function as a sum of cosines of frequencies that are integer multiples of omega 0. And each one of those cosines will have a different coefficient.
So here's an example where I'm approximating this square wave here as a sum of cosines of these different frequencies. And it turns out for a square wave, you only need the odd multiples of omega 0. So here's what this approximation looks like for the case where you only have a single cosine function. You can add another cosine of 3 omega 0 t and you can see that that function starts getting a little bit more square. You can add a cosine 5 omega 0 t. And as you keep adding those things, again, with the correct coefficients in front of these, you can see that the function more and more closely approximates the square wave that we're trying to-- yes, Habiba
AUDIENCE: Why do we only need the odd multiples?
MICHALE FEE: It just, in general, you need all the multiples. But for this particular function, you only need the odd ones.
Here's another example. So in this case, we are summing together cosine functions to approximate a train of pulses. So the signal we're trying to approximate here just has a pulse every one unit of time, one period. And you can see that to approximate this, we can basically just sum up all the cosines of all frequencies n omega 0. And you can see that at time 0, all of those functions are positive. And so all of those positive contributions to that sum all add up. And as you add them up, you get a big peak. That's called constructive interference.
So all those peaks add up. And you also get those peaks all adding up one period away. One period of cosine omega 0. You can see they add up again. So you can see this is a periodic function. In this time window between those peaks, you can see that you have positive peaks of some of those cosines, negative peaks, positive, negative. They just sort of all add up. They interfere with each other destructively to give you a 0 in the intervals between the peaks. Does that make sense? And so basically, by choosing the amplitude of these different cosine functions, you can basically build any arbitrary periodic function down here. Does that makes sense?
All right. There's one more element that we need to add here for our Fourier series for even functions. Anybody have any idea what that is? Notice here I've shifted this function up a little bit. So it's not centered at 0. A constant term. What's called a DC term. We basically take the average of that function. We add it here. That's called a DC term. a 0 over 2 is essentially the average of the function we're trying to approximate. All right. Good.
We can now write that as a sum. y even of t equals a0 over 2 plus a sum over all these different n's of a sub n, which is a coefficient, times cosine n omega 0 t. Omega 0 is 1 over-- is 2 pi over this time interval here, the periodicity. All right. Good.
How do we find those coefficients? So I just told you that the first coefficient, the a 0 over 2, is just the average of our function t over one time window from minus t over 2 to plus t over 2. It's just the integral of that function over one period divided by t. And that gives you the average, which is a 0 over 2. All right, any questions about that? It's pretty straightforward.
What about this next coefficient, a1? So the a1 coefficient is just the overlap of our function y of t with this cosine. We're just multiplying y0 times cosine of omega 0 t integrating over time and then multiplying by 2 over t. So that's the answer. And I'm going to explain why that is.
That is just a correlation. It's just like asking how much-- let's say we had a neuron with a receptive field of cosine omega 0 t. We're asking how well does our signal overlap with that receptive field. Does that make sense? We're just correlating our signal with some basis function, with some receptive field. And we're asking how much overlap is there.
The a2 coefficient is just the overlap of the function y with cosine 2 omega 0 t. And the a sub n coefficient is just the overlap with cosine n omega 0 t. Just like that. And you can see that this average that we took up here just is the generalization of this to the overlap of our function to cosine 0 omega 0 t. Cosine 0 omega 0 t is just 1. And so this coefficient a0 just looks the same as this. It's just that in this case, it turns out to be the average of the function. Any questions about that?
So that is, in general, how you calculate those coefficients. So you would literally just take your function, multiply it by a cosine of some frequency, integrate it, and that's the answer.
Let's just take a look at what some of these coefficients are for some really simple functions. So there I've rewritten what each of those coefficients is as an integral. And now let's consider the following function. So let's say our function is 1. It's just a constant at 1. So you can see that this integral from minus t over 2 to t over 2, that integral is just t multiplied by 2 over t gives that coefficient as just 2.
If our function is cosine omega 0 t, you can see that if you put a cosine in here, that averages to 0. If you put a cosine in here, you get cosine squared. The integral of cosine squared is just half of basically the full range. So that's just t over 2. When you multiply by 2 over t, you get 1. And the coefficient a2 for a function cosine omega t is 0, because the integral of cosine omega 0 t times cosine 2 omega 0 t is 0.
All right. If we have a function cosine 2 omega 0 t, then these coefficients are 0, and that coefficient is 1. You can see that you have this interesting thing here. If your function is cosine omega 0 t, then the only coefficient that's non-zero is the one that you're overlapping with cosine omega 0 t. It's only this first coefficient that's non-zero. If your function has a frequency 2 omega 0 t, then the only coefficient that's non-zero is the a2.
So what that means is that if the function has maximal overlap, if it overlaps one of those cosines, then it has 0 overlap with all the others. And we can say that set of cosine functions, cosine omega 0 t, cosine 2 omega 0 t, forms what's called an orthogonal basis set. We're going to spend a lot of time talking about basis set later, but I'm just going to throw this word out to you so that you've heard it when I come back to the idea of basis sets later. You're going to see this connection.
So the basic idea is that what we're doing is we're taking our signal, which is a vector. It's a set of points in time. We can think of that as a vector in a high dimensional space. And we're simply expressing it in a new basis set of cosines of different frequencies. So each of those functions, cosine n omega t, is like a vector in a basis set. Our signal like a vector.
And what we're doing is when we're doing these projections, we're simply computing the projection of that vector, our signal, onto these different basis functions, these different basis vectors. So we're just finding the coefficient so that we can express our signal as a sum of a coefficient times a basis vector plus another coefficient times another basis vector and so on.
So for example, in the simple standard basis where this vector is 0 1 and that vector is 1 0, you can write down an arbitrary vector as a coefficient times this plus another coefficient times that. That make sense? And how do we find those coefficients? We just take our vector and dot it onto each one of these basis vectors, x2. Does that make sense?
You don't need to know this for this section, but we're going to come back to this. I would like you to eventually kind of combine these views of taking signals and looking at projections of those into new basis sets. And as you know, how you see things depends on how you're looking at them, the direction that you look at them.
That's what we're doing. When we take a signal and we project it onto a function, we're taking a particular view of that function. So as you know, the view you have on something has a big impact on what you see. Right?
So that's all we're doing is we're taking functions and finding the projection on which we can see something interesting. That's it. That's all spectral analysis is. And the particular views we're looking at are projections onto different periodic functions. Cosines of different frequencies. All right? And what you find is that for periodic signals, there are certain views where something magically pops out and you see what's there that you can't see when you just look at the time domain.
All right. So we looked at even functions or symmetric functions. Now let's take a look at odd functions are antisymmetric functions. These are called odd because the odd polynomials like x cubed looks like this. If it's negative on one side, it's positive on the other side. Same here. If it's negative here, then it's positive there.
So we can now write down Fourier series for odd or antisymmetric functions. What do you think we're going to use? Instead of cosines, we're going to use sines, because sines are symmetric around-- antisymmetric around the origin. And we're still going to consider functions that are periodic with period t. We can take any antisymmetric function and approximate it as a sum of sine waves of frequency 2 pi over t or, again, omega 0. And integer multiples of that omega 0.
All right. So again, our odd functions can be approximated as a sum of components, contributions of different frequencies with a coefficient times sine of omega 0 t plus another coefficient times sine of 2 omega 0 t and so on. And we can write that as a sum that looks like this. So a sum over n from 1 to infinity of coefficient b sub n times sine of n omega 0 t. And why is there no DC term here? Good. Because an antisymmetric function can't have a DC offset.
So for arbitrary functions, you can write down any arbitrary periodic function as the sum of a symmetric part and an antisymmetric part. So we can write down an arbitrary function as a sum of these cosines plus a sum of sine waves. So that's Fourier series. Any questions about that?
So this is kind of messy. And it turns out that there's a much simpler way of writing out functions as sums of periodic functions. So rather than using cosines and sines, we're going to use complex exponentials. And that is what complex Fourier series does. All right, so let's do that.
So you probably recall that you can write down a complex exponential e to the i omega t as a cosine omega t plus i sine omega t. So e to the i omega t is just a generalization of sines and cosines. So the way to think about this is e to the i omega t is a complex number. If we plot it in a complex plane where we look at the real part along this axis, the imaginary part along that axis, e to the i omega t just lives on this circle. No matter what omega t is, e to the i omega t just sits on this circle in the complex plane, the unit circle in the complex plane. e to the i omega t is a function of time.
It simply has a real part that looks like cosine. So the real part of this as you increase t or the phase omega t is the real part just oscillates sinusoidally back and forth like this as a cosine. The imaginary part just oscillates back and forth as a sine. And when you put them together, something that goes back and forth this way as a cosine and up and down that way as a sine just traces out a circle.
So e to the i omega traces out a circle in this direction, and as time increases, it just goes around and around like this. E to the minus i omega t just goes the other way. That make sense? Got the real part that's going like this, the imaginary part that's going like this. And you put those together and they just go around in a circle. So you can see it's a way of combining cosine and sine together in one function.
So what we're going to do is we're going to rewrite our Fourier series as instead of sines and cosines, we're going to stick in e to the-- we're going to replace the sines and cosines with e to the i omega t and e to the minus i omega t. So we're just going to solve these two functions for cosine and sine, and we're going to take this and plug it into our Fourier series and see what we get. So let's do that. And remember, 1 over i is just minus i.
So here's our Fourier series with our sum of cosines, our sum of sines. We're just going to replace those things with the e to the i omega t plus e to the minus i omega t and so on. So there we go. Just replacing that. There's a 1/2 there. And now we're just going to do some algebra. And we're going to collect either the i omega t's and e to the minus i omega t's together. And this is what it looks like.
So you can see that what we're doing is collecting this into a bunch of terms that have e to the positive in omega t here and e to the minus in omega 0 t there. And now we have still a sum of three things. So it doesn't really look like we've really gotten anywhere. But notice something. If we just put the minus sign into the n, then we can combine these two into one sum. And this, if n is 0, what is e to the in omega t? It's just 1.
So we can also write this as something e to the in omega t as long as n is 0. So that's what we do. Oh, and by the way, these coefficients here we can just rewrite as sums of those coefficients up there. Don't worry. This all looks really complicated. By the end, it's just boiled down to one simple thing. That's why we're doing this. We're simplifying things.
So when you do this, when you rewrite this, this looks like a sum over n equals 0. This is a sum over positive n, n equals 1 to infinity. This is a sum over negative n, minus 1 to minus infinity. And all those combine into one sum. So now we can write down any function y of t as a sum over n equals minus infinity to infinity of a coefficient a sub n times e to the in omega.
So we went from having this complicated thing, this sum over our constant terms, sines, and cosines, and we boiled it down to a single sum. That's why these complex exponentials are useful. Because we don't have to carry around a bunch of different functions, different basis functions to describe an arbitrary signal y. But remember, this is just a mathematical trick to hide sines and cosines. A very powerful trick, but that's all it's doing. It's hiding sines and cosines.
All right. So we've replaced our sums over coastlines and signs with a sum of complex exponentials. All right. Remember what we're doing here. We're finding a new way of writing down functions. So what's cool about this, what's really interesting about this, is that for some functions-- so what we're doing is we have an arbitrary function y. And we're writing a down with just some numbers a sub n. And what's cool about this is that for some functions y, you can describe that function with just a few of these coefficients a. Does that make sense?
So let me just show you an example of some functions that look really, really simple when you rewrite them using these coefficients a. So here's an example. So here's a function of n that has three numbers. a sub minus 1, n equals minus 1 is 1/2, a sub 0 is 0, and a sub 1 is 1/2. And all the rest of them are 0. So really, we only have two non-zero entries in this sum.
So what function is that? It's just a cosine. So we have-- let's write this out. Y equals a sum over all of these things. 1/2 e to the minus-- the first n is minus 1. e to the minus i omega 0 t plus 1/2 e to the plus i omega 0 t. We're just writing out that sum. And that is just-- sorry, I didn't tell you what that equation was. That's Euler's equation. That's just cosine minus i sine omega t. That is just cosine plus i sine omega t. The sines cancel. And you're left with cosine omega 0 t.
So here's this function of time that goes on infinitely. If you wanted to write down all the values of cosine omega 0 t, you'd have to write down an awful lot of numbers. And here we can write down that same function with two numbers. So this is a very compact view of that function of time.
Here's another function. What function do you think that is? What would be the time domain equivalent of this set of Fourier coefficients? Good. So we're going to do the same thing. Just write it out. All these sums are 0. All these components are 0 except for two of them. n equals minus 2 and n equals plus 2. You just put those in there as 1/2 e to the minus 2 omega 0 t plus 1/2 e to the plus 2 omega 0 t. And that is just if you write that out, those sines cancel, and you have cosine 2 omega 0 t. Pretty simple, right?
How about this one? This is the-- remember, the a's are complex numbers. The ones we were looking at here had two real numbers. Here's an example where the a's are imaginary. One is i over 2. One is minus i over 2. That's what the complex Fourier representation looks like of this function. We can just plug it in here.
You solve that, you can see that in this case, the cosines cancel, because this is i over 2 cosine 2 omega t minus i over 2 cosine 2 omega t. Those cancel and you're left with sine 2 omega 0 t. So that is what Fourier representation of sine 2 omega t looks like. So the functions that have higher frequencies will have non-zero elements that are further out in n. Any questions about that?
So again, this set of functions e to the in omega 0 t form an orthogonal, orthonormal basis set over that [INAUDIBLE] over that interval. The a0 coefficient is just the projection of our function onto e to the 0. n equals 0. And that's just the average. The a1 coefficient is just the projection of our function e to the minus i omega 0 t. And in general, the m-th coefficient is just the projection of our function onto e to the minus im omega 0 t.
And we can take those coefficients, plug them into this sum, and reconstruct an arbitrary periodic function, this y of t. So we have a way of taking a function and getting these complex Fourier coefficients. And we have a way of taking those coefficients and reconstructing our function. This is just a bunch of different views function y. And from all of those different views, we can reconstruct our function. That's all it is.
So in general, when we do Fourier decomposition in a computer in MATLAB on real signals that you've sampled in time, it's always done in this kind of discrete representation. You've got, in this case, discrete frequencies. When you sample signals, you've got functions that are discrete in time, and this becomes a sum. But before we go to the discrete case, I just want to show you what this looks like when we go to the case of arbitrary functions. Remember, this thing was about representing periodic functions. You can only represent periodic functions using these Fourier series.
But before we go on to the Fourier transform algorithm and discrete Fourier transforms, I just want to show you what this looks like for the case of arbitrary functions. And I'm just showing this to you. I don't expect you to be able to reproduce any of this. But you should see what it looks like, for those of you who haven't seen it already.
So what we're going to do is go from the case of periodic functions to non-periodic functions. And the simplest way to think about that is a periodic function does something here, and then it just does the same thing here, and then it just does the same thing here. So how do we go from this to an arbitrary function? Well, we're just going to let the period go to infinity. Does that make sense?
That's actually pretty easy. We're going to let t go to infinity, which means the frequencies, which are 2 pi omega 0 or 2 pi over t, that's going to go to 0. So our steps. Remember when we had this discrete Fourier transform here, we had these steps in frequency as a function of n. Those steps are just going to get infinitely close together, the different frequency bins.
So that's what we're going to do now. You're just going to let those frequency steps go to 0. And now frequency, in discrete case, the frequency is just that number, that n times omega 0. m times omega 0. Well, omega 0 is going to 0, but the m's are getting really big. So we can just change-- we're just going to call that omega. The omega 0's are going to 0, so the m's are getting infinitely big. So we can't really use m anymore or n to label our frequency steps. So we're just going to use omega.
We used to call our coefficients, our Fourier coefficients, we used to label them with m. We can't use m anymore, because m is getting infinitely big. So we use this new label omega. So a sub m becomes a new variable, our Fourier transform, labeled by the frequency omega. And we're just going to basically just make those replacements in here. So the coefficients become a function of frequency. That's just an integral. Remember, t is going to infinity now.
So this has to go from minus infinity to infinity of our function y times our basis function. And instead of e to the im omega 0 t, we just replace m omega 0 with omega. So e to the minus i omega t. And that is the Fourier transform. And we're just going to do the same replacement here, but instead of summing over n going from minus infinity to infinity, we have to write this as an integral as well.
And so that we can reconstruct our function y of t as an integral of our Fourier coefficients times the e to the i omega t. See that? It's essentially the same thing. It's just that we're turning this sum into an integral. All right. So that's called a Fourier transform. And that's the inverse Fourier transform, this [INAUDIBLE] from a function to Fourier coefficients. And this takes your Fourier coefficients and goes back to your function. All right, good.
Let me just show you a few simple examples. So let's start with the function y of t equals 1. So it's just a constant. What is the Fourier transform? So let's plug this into here. Does anyone know what that integral looks like of the integral from minus infinity to infinity of e the minus i omega t dt integrating over time. It's a delta function. There's only one value of omega for which that function is not 0.
Remember, so let's say omega equals 1, 1-- you know, 1 hertz. This is just a bunch of sines and cosines. So when you integrate over sines and cosines, you get 0. Integral over time of cosine is just 0. But if omega is 0, then what is e to the i omega t? e to the i 0 is 1. And so we're integrating over 1 times dt. And that becomes infinity at omega equals 0. And that's a delta function, it's 0 everywhere except 4 at 0.
So that becomes a delta function. This Fourier transform of a constant is a delta function. And that's a really-- it's a really good one to know. The Fourier transform of a constant is a delta function. That's called a Fourier transform pair. You have a function and another function. One function is the Fourier transform of the other function that's called a Fourier transform pair.
So the Fourier transform of a constant is just a delta function at 0. You can invert that. If you integrate, let's just plug that delta function into here. If you integrate delta function times e to the i omega t, you just get e to the i 0t, which is just 1. So we can take the Fourier transform of 1, get a delta function, [INAUDIBLE] inverse Fourier transform the delta function, and get back 1.
How about this function right here? This function is e to the i omega 1. It's a sine wave and a cosine wave, a complex sine and cosine, at frequency omega 1. Anybody know what the Fourier transform of that is?
MICHALE FEE: Yeah. So it's basically-- you can think of this-- that's the right answer. Rather than try to explain it, I'll just show you. So the Fourier transform of this is just a peak at omega 1. And we can inverse Fourier transform that and recover our original function. So those last few slides are more for the aficionados. You don't have to know that. We're going to spend time looking at the discrete versions of these things.
How about this case? This is a simple case where you have a function that the Fourier transform of which has a peak at omega 1 and a peak at minus omega 1. The Fourier transform of the inverse Fourier transform of that is just cosine omega 1t. So a function, a cosine function with frequency omega 1, has two peaks, one at frequency omega 1 and another one at frequency minus omega 1. So that looks a lot like the case we just talked about where we had this complex Fourier series.
And we had a peak at n equals 2 and another peak at n equals minus 2. And that function that gave us that complex Fourier series was cosine 2 omega t. So that's just what we have here. We have a peak in the spectrum at omega 1, peak at minus omega 1, and that is the Fourier decomposition of a function that is cosine omega 1t. So it's just like what we saw before for the case of the complex Fourier series. So that was Fourier transform.
And now let's talk about the discrete Fourier transform and the associated algorithm for computing that very quickly called the Fast Fourier Transform, or FFT. So you can see computing these Fourier transforms, if you were to actually try to compute Fourier transforms by taking a function, multiplying it by these complex exponentials like writing down the value of e to the i omega t at a bunch of different omegas and a bunch of different t's and then integrating that numerically, that would take forever computationally.
But it turns out that there's-- so you have to compute that integral over time for every omega that you're interested in. It turns out really, really fast algorithm that you can use for the case where you've got functions that are sampled in time and you want to extract the frequencies of that signal at a discrete set of frequencies. I'm going to switch from using omega, which is very commonly used when you're talking about Fourier transforms, to just using f, the frequency. So it's just f is just 2 pi. So omega is 2 pi f.
So here I'm just rewriting the Fourier transform and the inverse Fourier transform with f rather than omega. So we're going to start using f's now for the discrete Fourier transform case. And we're going to consider the case where we have signals that are sampled at regular intervals delta t. So here we have a function of time y of t. And we're going to sample that signal at regular intervals delta t. So this is delta t right here. That time interval there. So the sampling rate, the sampling frequency, is just 1 over delta t.
So the way this works in the fast Fourier transform algorithm is you just take those samples and you put them into a vector in MATLAB, just some one-dimensional array. And we're going to imagine that our samples are acquired at different times. And let's [INAUDIBLE] minus time step 8, minus 7, minus 6. Time step 0 is in the middle up to time step 7.
And we're going to say that N is an even number. The fast Fourier transform works much, much faster when N is an even number, and it works even faster when N is a multiple, a power of 2. So in this case, we have 16 samples. It's 2 to the 4. Should usually try to make your samples be a power of 2. The number of samples. So there is our function of time sampled at regular intervals t.
So you can see that the t min, the minimum time, in this vector of sample points in our function is minus N over 2 delta t. And that [INAUDIBLE] time is N over 2 minus 1 times delta t. And that's what the MATLAB code would look like to generate an array of time values. Does that make sense?
The FFT algorithm returns the Fourier components of that function of time. And it returns the Fourier components in a vector that has the negative frequencies on one side and the positive frequencies on the other side and the constant term here in the middle. The minimum frequency is N over 2 times delta F. Oh, I should say it returns the Fourier components in steps of delta f where delta F is the sampling rate divided by the number of time steps that you put into it.
Don't panic. This is just reference. I'm showing you how you put the data in and how you get the data out. When you put data into the Fourier transform algorithm, the FFT algorithm, you put in data that's sampled at times, and you have to know what those times are. If you want to make a plot of the data, you need to make an array of time values. And they just go from a t min to a t max. And there's a little piece of MATLAB code that produces that array of times for you.
What you get back from the Fourier transform, the FFT, an array of not values of the function of time, but rather an array of Fourier coefficients. Just like we stuck in into our-- when we did the complex Fourier series, we stuck in a function of time. And we get out a list of Fourier coefficients. Same thing here. We put in a function of time, and we get out Fourier coefficients.
And the Fourier coefficients are complex numbers associated with different frequencies. So let's say the middle coefficient that you get will be the coefficient for the constant term. This coefficient down here will be the coefficient for the minimum frequency, and that coefficient will be the coefficient for the maximum frequency, the most positive frequency. Does that make sense?
MICHALE FEE: Ah, OK. So I was hoping to just kind of skip over that for now. But when you do a discrete Fourier transform, turns out that the coefficient for the most negative frequency is always exactly the same as the coefficient for the most positive frequency. And so they're just given in one-- they're both given in one element of the array. You could replicate that up here, but it would be pointless. And the length of the array would have to be n plus 1. Yes?
MICHALE FEE: OK. Good. That question always comes up, and it's a great question. What we're trying to do is to come up with a way of representing arbitrary functions. So we can represent symmetric functions by summing together a bunch of cosines. We can represent antisymmetric functions by summing together a bunch of sines. But if we want to represent an arbitrary function, we have to use both cosines and sines.
So we have this trick, though, where we can, instead of using sines and cosines, using these two separate functions, we can use a single function which is a complex exponential to represent things that can be represented by sums of cosines as well as things that can be represented as sums of signs. It's an arbitrary function.
And the reason is because the complex exponential has both a cosine in it and a sine. So we can represent a cosine as a complex exponential with a positive frequency, meaning that it's a complex number that goes around this direction plus another function where the complex number is going around in this direction. So positive frequencies mean as time increases, this complex number is going around the unit circle in this direction. Negative frequencies mean the complex number's going around in this direction.
And you can see that in order to represent a cosine, I need to have-- so let's see if I can do this. Here's my e to the-- here's my plus frequency going around this way. Here's my minus frequency going around this way. And you can see that I can represent a cosine if I can make the imaginary parts cancel. So if I have one function that's going around like this, another function that's going around like this. If I add them, then the imaginary part cancels. The sine cancels. This plus this is cosine plus cosine. i sine minus i sine.
So the sines can-- the sine cancels. And what I'm left with is a sine. So represent a cosine as a sum of a function that has a positive frequency and a negative frequency. You can see that the y component, the imaginary component, cancels and all I'm left with is the cosine that's going across like this.
So it's just a mathematical trick. Positive and negative frequencies are just a mathematical trick to make either the symmetric part of the function or antisymmetric part of the function cancel. So I can just use these positive and negative frequencies to represent any function. If I only had positive frequencies, I wouldn't be able to represent arbitrary functions.
So just one more little thing that you need to know about the FFT algorithm. So remember we talked about if you have a function of time, negative times are over here, positive times are over here. You can put-- you can sample your function at different times and put those different samples into an array.
Before you send this array of time samples to the FFT algorithm, you just need to swap the right half of the array with the left half of the array using a function called time shifted arrays. Don't worry about it. It's just the guts of the FFT algorithm wants to have the positive times in the first half and the negative times in the second half. So you just do this.
Then you run the FFT function on this time shifted array. And what it spits back is an array with the positive frequencies in the first half and the negative frequencies in the second half. And you can just swap those back using the circshift again. That is your spectrum. Your spectral coefficients. Your Fourier coefficients of this function. Just MATLAB guts. Don't worry about it.
So here's a piece of code that computes the Fourier coefficients of a function. So the first thing we're going to do is define the number of points that we have in our array. 2048. So it's a power of 2. So the FFT algorithm runs fast. We're figuring out-- we're going to write down a delta t. In this case, it's one millisecond. The sampling rate, the sampling frequency is just 1 over delta t. So 1 kilohertz.
The array of times at which the function sampled is just going from minus n over 2 to plus n over 2 minus 1 times delta t. I'm defining the frequency of a sine wave. And we're now getting the values of that cosine function at those different times. Does that make sense? We're taking that function of time and circularly shifting it by half the array.
So that's the circularly shifted, the swapped values of our function y. We stick that into the FFT function. It gives you back the Fourier coefficients. You just swap it again. And that is the spectrum, the Fourier transform [INAUDIBLE] signal. And now you can write down a vector of frequencies of each one of those Fourier coefficients.
Each one of those segments in that vector y-- remember, there are 2,000 of them now, 2,048 of them-- each one of those is the Fourier coefficient of the function we put in at each one of those different frequencies. Does that make sense?
Now let's take a look at a few examples of what that looks like. So here is a function y of t. It's cosine 2 pi f 0 t where f 0 is 20 hertz. So it's just a cosine wave. You run this code on it. And what you get back is an array of complex numbers. It has a real and imaginary part as a function of frequency.
And you get this cosine function. It has two peaks, as promised. It has a peak at plus 20 hertz and a peak at minus 20 hertz. One of those peaks gives you an e to the i omega t that goes this way at 20 hertz. The other one gives you an e of the i omega t that goes this way at 20 hertz. And when you add them together, if I can do that, it gives you a cosine. It goes back and forth at 20 hertz. That one.
Here's a sine wave. y equals sine 2 pi f 0 t again at 20 hertz. You run that code on it. It gives you this. Notice that-- OK, sorry. Let me just point out one more thing. In this case, the peaks are in the real part of y. For the sine function, the real part is 0 and the peaks are in the imaginary part. There's a plus i at minus 20 i over 2, actually, at minus 20 hertz, a minus i at plus 20 hertz.
And what that does is when you multiply that coefficient times e to the i omega t and that coefficient times whichever the opposite one is. One going this way, the other one going this way. You can see that the real part now cancels. And what you're left with is the sine part that doesn't cancel. And that is this function sine omega t. Any questions about that?
That's kind of boring. We're going to put more interesting functions in here soon. But I just wanted you to see what this algorithm does on the things that we've been talking about all along. And it gives you exactly what you expect.
Remember, we can write down any arbitrary function as a sum of sines and cosines. Which means we can write down any arbitrary function as a sum of these little peaks and these peaks at different frequencies. Does that make sense? So all we have to do is find these coefficients, these peaks, what values of these different peaks to stick in to reconstruct any arbitrary function.
And we're going to do a lot of that in the next lecture. We're going to look at what different functions here look like in the Fourier domain. We're going to do that for some segments like a square pulse, for trains of pulses, for Gaussian, for all kinds of different functions. And then using the convolution theorem, you can actually just predict in your own mind what different combinations of those functions will look like.
So I want to end by talking about one other really critical concept called the power spectrum. And it's basically usually what you do when you compute the Fourier transform of a function is to figure out what the power spectrum is. The simple answer is that all you do is you square this thing. Take the magnitude squared. But I'm going to build up to that a little bit.
So it's called the power spectrum. But first we need to understand what we mean by power. So we're going to think about this in the context of a simple electrical circuit. Let's imagine that this function that we're computing the Fourier transform of, imagine this function is voltage. That's where this idea comes from. Imagine that this function is the voltage that you've measured somewhere in a circuit. Let's say in this circuit right here. Or current, either way.
So when you have current flowing through this circuit, you can see that sinusoid-- that some oscillatory current, some cosine, that drives current through this resistor. And when current flows to a resistor, it dissipates power. And the power dissipated in a resistor is just the current times the voltage drop across that resistor. That means that the power-- now, remember, Ohm's law tells you that current is just voltage divided by resistance. So this is v divided by r. So the power is just v squared divided by r.
So if the voltage is just a sine wave at frequency omega, then v is some coefficient, some amplitude at that frequency times cosine omega t. We can write that voltage using Euler's equation as 1/2 e to the minus i omega t plus 1/2 e to the plus i omega t.
And let's calculate the power associated with that voltage. Well, we have to average over one cycle of that oscillation. So the average power is just given by the square magnitude of the Fourier transform [INAUDIBLE]. So let's just plug this into here. And what you see is that the power at a given frequency omega is just that coefficient magnitude squared over resistance times 1/2 e to the minus i omega t magnitude squared plus 1/2 e to the plus i over i omega t magnitude squared.
And that's just equal to 1 over r. That coefficient magnitude squared over 2. So you can see that the power dissipated by this sinusoidal voltage is just that magnitude squared over 2. So we can calculate the power dissipated in any resistor simply by summing up the [INAUDIBLE] magnitude of those coefficients.
So let's look at that in a little more detail. So let's think for a moment about the energy that is dissipated by a signal. So energy is just the integral over time. Power is per unit time. Total energy is just the integral of the power over time. So power is just equal to v squared over r. So I'm just going to substitute that in there. So the energy of a signal is just 1 over r times the integral of v squared over time.
Now, there's an important theorem in complex analysis called Parseval's theorem that says that the integral over the square of the coefficients in time is just equal to the integral of the square magnitude coefficients in frequency. So what that's saying is that it's just the same as the total power in the signal or the total energy in a signal if you represent it in the time domain is just the same as the total energy in the signal if you look at it in the frequency domain.
And what that's saying is that the sum of all the squared temporal components is just this equal to the sum of all the squared frequency components. And what that means is that you can see that each of these frequency components, each component in frequency contributes independently to the power in the signal. What that means is that you can think-- so you can think of the total energy in the signal as just the integral over all frequencies of this quantity here that we call the power spectrum.
And so we'll often take a signal, calculate the Fourier components, and plot the area of the Fourier transform, the square magnitude of the Fourier transform. And that's called the power spectrum. And I've already said the total variance of the signal in time is the same as the total variance of the signal in the frequency domain. So mathy people talk about the variant of a signal. The more engineering people talk about the power in the signal. But they're really talking about the same thing.
So let's take this example that we just looked at and look at the power spectrum. So that's a cosine function. It has these two peaks. Let me just point out one more important thing. For real functions, so in this class, we're only going to be talking about real functions of time.
For real functions, the square magnitude of the Fourier transform is symmetric. So you can see here if there is a peak in the positive frequencies, there's an equivalent peak in the negative frequencies. So when we plot the power spectrum of a signal, we always just plot the positive side.
And so here's what that looks like. Here is the power spectrum of a cosine signal. And it's just a single peak. So in that case, it was a cosine at 20 hertz. You get a single peak at 20 hertz.
What does it look like for a sine function? What is the power spectrum of a sine function? Remember, in that case, it was the real part was 0 and the imaginary part had a plus peak here and a minus peak here. What does the spectrum of that look like? Right. The square magnitude of i is just 1.
Magnitude squared of i is just 1. So the power spectrum of a sine function looks exactly like this. Same as a cosine. Makes a lot of sense. Sine and cosine are exactly the same function. One's just shifted by a quarter period. So it has to have the same power spectrum. It has to have the same power.
Let's take a look at a different function of time. Here's a train of delta functions. So we just have a bunch of peaks spaced regularly at some period. I think it was-- I forget the exact number here. But it's around 10-ish hertz. Fourier transform of a train of delta functions is another train of delta functions. Pretty cool. The period in the time domain is delta t. The period in the Fourier domain is 1 over delta t. That's another really important Fourier transform pair for you to know.
So the first Fourier transform pair that you need to know is that a constant in the time domain is a delta function in the frequency domain. A delta function in the time domain is a constant in the frequency domain. A train of delta functions in the time domain is a train of functions in the frequency domain and vice versa.
And there's a very simple relation between the period in the time domain and the period in the frequency domain. What does the power spectrum of this train of delta functions look like? It's just the square magnitude of this. So it just looks like a bunch of peaks.
So here's another function. A square wave. This is exactly the same function that we started with. If you look at the Fourier transform of the imaginary part of 0, the real part has these peaks. So the Fourier transform-- so these are now the coefficients that you would put in front of your different cosines at different frequencies to represent the square wave. But what it looks like is positive peak for the lowest frequency, negative peak for the next harmonic, positive peak, and gradually decreasing amplitudes.
The power spectrum of this-- oh, and one more point is that if you look at the Fourier transform of a higher frequency square wave, you can see that those peaks move apart. So you can transform. So higher frequencies in the time domain, stuff happening faster in the time domain, is associated with things moving out to higher frequencies in the frequency domain. You can see that the same function higher frequencies has the same Fourier transform but with the components spread out to higher frequencies. And the power spectrum looks like this.
And notice that one more final point here is that when you look at power spectra, often signals can have frequency components that are very small so that it's hard to see them on a linear scale. And so we actually plot them in this method. You plot them in units of decibels. And I'll explain what those are the next time. But that's another representation of the power spectrum of a signal.
OK, so that's what we've covered. And we're going to continue with the game plan next time.