Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
IPython Notebook FFT Example
{
"metadata": {
"name": "",
"signature": "sha256:1c8a707035342477c2cad874c9553bf896070c3c12617eb0eb4e9f6d312accc1"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"metadata": {},
"source": [
"Working with Numpy FFT Results: Scaling and Folding"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Imports\n",
"-------"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%matplotlib inline\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Create a Test Signal\n",
"--------------------\n",
"$f_s$ is the sampling frequency, while $f$ is a base frequency for the signal content. We create a signal that contains components at a couple of multiples of this base frequency. Note the amplitudes here since we will be trying to extract those correctly from the FFT later."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f_s = 50.0 # Hz\n",
"f = 1.0 # Hz\n",
"time = np.arange(0.0, 3.0, 1/f_s)\n",
"x = 5 * np.sin(2 * np.pi * f * time) + 2 * np.sin(10 * 2 * np.pi * f * time)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.plot(time, x)\n",
"plt.xlabel(\"Time (sec)\")\n",
"plt.ylabel(\"x\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
"<matplotlib.text.Text at 0x6e22b10>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x6e0ae30>"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compute the FFT\n",
"---------------\n",
"The FFT and a matching vector of frequencies"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fft_x = np.fft.fft(x)\n",
"n = len(fft_x)\n",
"freq = np.fft.fftfreq(n, 1/f_s)\n",
"print n\n",
"print freq"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"150\n",
"[ 0. 0.33333333 0.66666667 1. 1.33333333\n",
" 1.66666667 2. 2.33333333 2.66666667 3. 3.33333333\n",
" 3.66666667 4. 4.33333333 4.66666667 5. 5.33333333\n",
" 5.66666667 6. 6.33333333 6.66666667 7. 7.33333333\n",
" 7.66666667 8. 8.33333333 8.66666667 9. 9.33333333\n",
" 9.66666667 10. 10.33333333 10.66666667 11. 11.33333333\n",
" 11.66666667 12. 12.33333333 12.66666667 13. 13.33333333\n",
" 13.66666667 14. 14.33333333 14.66666667 15. 15.33333333\n",
" 15.66666667 16. 16.33333333 16.66666667 17. 17.33333333\n",
" 17.66666667 18. 18.33333333 18.66666667 19. 19.33333333\n",
" 19.66666667 20. 20.33333333 20.66666667 21. 21.33333333\n",
" 21.66666667 22. 22.33333333 22.66666667 23. 23.33333333\n",
" 23.66666667 24. 24.33333333 24.66666667 -25. -24.66666667\n",
" -24.33333333 -24. -23.66666667 -23.33333333 -23. -22.66666667\n",
" -22.33333333 -22. -21.66666667 -21.33333333 -21. -20.66666667\n",
" -20.33333333 -20. -19.66666667 -19.33333333 -19. -18.66666667\n",
" -18.33333333 -18. -17.66666667 -17.33333333 -17. -16.66666667\n",
" -16.33333333 -16. -15.66666667 -15.33333333 -15. -14.66666667\n",
" -14.33333333 -14. -13.66666667 -13.33333333 -13. -12.66666667\n",
" -12.33333333 -12. -11.66666667 -11.33333333 -11. -10.66666667\n",
" -10.33333333 -10. -9.66666667 -9.33333333 -9. -8.66666667\n",
" -8.33333333 -8. -7.66666667 -7.33333333 -7. -6.66666667\n",
" -6.33333333 -6. -5.66666667 -5.33333333 -5. -4.66666667\n",
" -4.33333333 -4. -3.66666667 -3.33333333 -3. -2.66666667\n",
" -2.33333333 -2. -1.66666667 -1.33333333 -1. -0.66666667\n",
" -0.33333333]\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.plot(np.abs(fft_x))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": [
"[<matplotlib.lines.Line2D at 0x70986f0>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nIiIiIuH7f+nz76hXMY8kAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x6e31110>"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Swap Half Spaces\n",
"----------------\n",
"Note that frequencies in the FFT and the `freq` vector go from zero to some larger positive number then from a large negative number back toward zero. We can swap that so that the DC component is in the center of the vector while maintaining a two-sided spectrum."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fft_x_shifted = np.fft.fftshift(fft_x)\n",
"freq_shifted = np.fft.fftshift(freq)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.plot(freq_shifted, np.abs(fft_x_shifted))\n",
"plt.xlabel(\"Frequency (Hz)\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"<matplotlib.text.Text at 0x70a2b50>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x707c690>"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fold Negative Frequencies and Scale\n",
"------------------------------\n",
"It's actually more common to look at just the first half of the unshifted FFT and frequency vectors and fold all the amplitude information into the positive frequencies. Furthermore, to get ampltude right, we must normalize by the length of the original FFT. Note the factor of $2/n$ in the following which accomplishes both the folding and scaling."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"half_n = np.ceil(n/2.0)\n",
"fft_x_half = (2.0 / n) * fft_x[:half_n]\n",
"freq_half = freq[:half_n]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.plot(freq_half, np.abs(fft_x_half))\n",
"plt.xlabel(\"Frequency (Hz)\")\n",
"plt.ylabel(\"Amplitude\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"<matplotlib.text.Text at 0x6edc150>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x70daf50>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now the spectrum contains spikes at the correct amplitudes at only positive frequencies, which are the only ones with physicality."
]
}
],
"metadata": {}
}
]
}
@tarokiritani
Copy link

tarokiritani commented Oct 19, 2016

I assume the DC amplitude appears only once in fft_x, and therefore should not be multiplied by 2? Am I mistaken?

@jedludlow
Copy link
Author

jedludlow commented Nov 16, 2016

@tarokiritani Yes, that is correct. More precisely, the FFT returns energy across the spectrum of positive, negative, and zero frequencies. The folding process takes all the energy from the negative frequencies and places it at the matching positive frequencies. There is a single entry in fft_x for zero frequency, so there is no folding required there.

@raproth
Copy link

raproth commented Aug 16, 2018

is the lowest plot equivalent to the PSD?

@misterjoa
Copy link

misterjoa commented Mar 7, 2019

This notebook is gold ! Thank you very much !

@impvd
Copy link

impvd commented Oct 30, 2020

@jedludlow I know you create this gist 8 years ago. Just curious if maybe we could make it do the ifft operation? We have already know that the signal was the combination with 5 * np.sin(2 * np.pi * f * time) and 2 * np.sin(10 * 2 * np.pi * f * time) , what if we don't know the formula before, and we only get the value of x, which is like:

array([ 0.00000000e+00,  2.52877920e+00,  2.41901994e+00,  6.65052259e-01,
        5.06655338e-01,  2.93892626e+00,  5.32484856e+00,  5.02813672e+00,
        3.04606912e+00,  2.62202223e+00,  4.75528258e+00,  6.81354929e+00,
        6.16570415e+00,  3.81456314e+00,  3.00932322e+00,  4.75528258e+00,
        6.42624829e+00,  5.39721013e+00,  2.67699571e+00,  1.52062250e+00,
        2.93892626e+00,  4.31088140e+00,  3.01619327e+00,  6.78789312e-02,
       -1.27544686e+00, -1.83697020e-15,  1.27544686e+00, -6.78789312e-02,
       -3.01619327e+00, -4.31088140e+00, -2.93892626e+00, -1.52062250e+00,
       -2.67699571e+00, -5.39721013e+00, -6.42624829e+00, -4.75528258e+00,
       -3.00932322e+00, -3.81456314e+00, -6.16570415e+00, -6.81354929e+00,
       -4.75528258e+00, -2.62202223e+00, -3.04606912e+00, -5.02813672e+00,
       -5.32484856e+00, -2.93892626e+00, -5.06655338e-01, -6.65052259e-01,
       -2.41901994e+00, -2.52877920e+00, -6.12323400e-15,  2.52877920e+00,
        2.41901994e+00,  6.65052259e-01,  5.06655338e-01,  2.93892626e+00,
        5.32484856e+00,  5.02813672e+00,  3.04606912e+00,  2.62202223e+00,
        4.75528258e+00,  6.81354929e+00,  6.16570415e+00,  3.81456314e+00,
        3.00932322e+00,  4.75528258e+00,  6.42624829e+00,  5.39721013e+00,
        2.67699571e+00,  1.52062250e+00,  2.93892626e+00,  4.31088140e+00,
        3.01619327e+00,  6.78789312e-02, -1.27544686e+00, -1.97217653e-14,
        1.27544686e+00, -6.78789312e-02, -3.01619327e+00, -4.31088140e+00,
       -2.93892626e+00, -1.52062250e+00, -2.67699571e+00, -5.39721013e+00,
       -6.42624829e+00, -4.75528258e+00, -3.00932322e+00, -3.81456314e+00,
       -6.16570415e+00, -6.81354929e+00, -4.75528258e+00, -2.62202223e+00,
       -3.04606912e+00, -5.02813672e+00, -5.32484856e+00, -2.93892626e+00,
       -5.06655338e-01, -6.65052259e-01, -2.41901994e+00, -2.52877920e+00,
       -1.22464680e-14,  2.52877920e+00,  2.41901994e+00,  6.65052259e-01,
        5.06655338e-01,  2.93892626e+00,  5.32484856e+00,  5.02813672e+00,
        3.04606912e+00,  2.62202223e+00,  4.75528258e+00,  6.81354929e+00,
        6.16570415e+00,  3.81456314e+00,  3.00932322e+00,  4.75528258e+00,
        6.42624829e+00,  5.39721013e+00,  2.67699571e+00,  1.52062250e+00,
        2.93892626e+00,  4.31088140e+00,  3.01619327e+00,  6.78789312e-02,
       -1.27544686e+00,  5.02600372e-15,  1.27544686e+00, -6.78789312e-02,
       -3.01619327e+00, -4.31088140e+00, -2.93892626e+00, -1.52062250e+00,
       -2.67699571e+00, -5.39721013e+00, -6.42624829e+00, -4.75528258e+00,
       -3.00932322e+00, -3.81456314e+00, -6.16570415e+00, -6.81354929e+00,
       -4.75528258e+00, -2.62202223e+00, -3.04606912e+00, -5.02813672e+00,
       -5.32484856e+00, -2.93892626e+00, -5.06655338e-01, -6.65052259e-01,
       -2.41901994e+00, -2.52877920e+00])

And we need to separate it to x1 and x2, I mean x1 and x2 would be the signal with the same basic frequency.

Awesome thanks again for your share.

@jedludlow
Copy link
Author

jedludlow commented Oct 30, 2020

@raproth, I apologize for not replying to your comment from so long ago. I somehow missed any notification about it.

The plot is not precisely a PSD. The power spectral density expresses signal power distribution as a function of frequency and has the property that the integral under the PSD over some frequency range represents the total signal power in that frequency range.

The plot I'm producing here is really just a plot of the magnitude of the Fourier coefficients. It's useful for reasoning about the amplitude of the various sinusoids that make up the underlying signal.

@jedludlow
Copy link
Author

jedludlow commented Oct 30, 2020

@pivdets, I'm not sure I fully understand your question, but I'll make an attempt at an answer to the ifft part.

I don't have time right now to extend the notebook to include the ifft case, but I can describe how you can figure it out on your own. You can take the Fourier spectrum results that are plotted in cell 9 at the end of the notebook and try to work backwards through the problem, using the ifft instead of fft in cell 4. If your code reproduces the signal plotted in cell 3 then you know you've got it working correctly. Maybe you can submit a pull request if you get it working. Once you have proven your method you can apply it to other Fourier spectra to recover the underlying signal.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment