Skip to content

Instantly share code, notes, and snippets.

@ryanvolz
Created January 29, 2015 08:27
Show Gist options
  • Save ryanvolz/8b0d9f3e48ec8ddcef4d to your computer and use it in GitHub Desktop.
Save ryanvolz/8b0d9f3e48ec8ddcef4d to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def ambiguity(code, nfreq=1):\n",
" \"\"\"Calculate the ambiguity function of code for nfreq frequencies.\n",
" \n",
" The ambiguity function is the square of the autocorrelation,\n",
" normalized so the peak value is 1.\n",
" \n",
" For correct results, we require that nfreq >= len(code).\n",
" \n",
" The result is a 2-D array with the first index corresponding\n",
" to frequency shift. The code is frequency shifted by \n",
" normalized frequencies of range(nfreq)/nfreq and correlated\n",
" with the baseband code. The result amb[0] gives the \n",
" ambiguity with 0 frequency shift, amb[1] with 1/nfreq\n",
" frequency shift, etc. These frequencies are the same as (and \n",
" are in the same order as) the FFT frequencies for an nfreq-\n",
" length FFT.\n",
" ****Thus, the peak value is at amb[0, len(code) - 1]****\n",
" \n",
" To relocate the peak to the middle of the result, use\n",
" np.fft.fftshift(amb, axes=0)\n",
" To relocate the peak to the [0, 0] entry, use\n",
" np.fft.ifftshift(amb, axes=1)\n",
" \n",
" \"\"\"\n",
" inlen = len(code)\n",
" outlen = 2*inlen - 1\n",
" \n",
" # Doppler shift the code to form a correlation bank in the form of a matrix\n",
" doppleridx = np.arange(nfreq)[:, np.newaxis]*np.arange(inlen)\n",
" dopplermat = np.exp(2*np.pi*1j*doppleridx/nfreq)\n",
" # code is conjugated to form matched correlation\n",
" codebank = code.conj()*dopplermat\n",
" \n",
" # initialize the output autocorrelation array\n",
" acorr = np.zeros((nfreq, outlen), np.complex_)\n",
" \n",
" # correlate the Doppler-shifted codes with the original code\n",
" # to get autocorrelation\n",
" for k, shifted_code in enumerate(codebank):\n",
" acorr[k] = np.correlate(code, shifted_code, mode='full')\n",
" \n",
" # calculate ambiguity function as normalized square magnitude of autocorrelation\n",
" # (index of peak value is [0, inlen - 1])\n",
" amb = np.abs(acorr / acorr[0, inlen - 1])**2\n",
" \n",
" return amb"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"barker13 = np.asarray([1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1], np.float_)\n",
"L = len(barker13)\n",
"N = 256\n",
"b13amb = ambiguity(barker13, N)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.imshow(np.fft.fftshift(b13amb, axes=0).T, extent=(-N/2, N/2, -L, L),\n",
" aspect='auto', interpolation='none', origin='lower')\n",
"plt.xlabel('Frequency Index')\n",
"plt.ylabel('Delay Index')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"<matplotlib.text.Text at 0x7f88f39ba490>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n6NChOHToEP72t7/5HsOpU6fwj3/8A9dee629jXg8DgAYP348brzxRsycORNvvvkmQiFe9pSKZwX1\nCn369HFN33PPPbjppptc837xi1+4vmnW+XMoFIKu6wCAzs5O1+Mee+wxNDY2uuZt2rQJkUjEnlYU\nBaqqBr6HH41G0djYiLVr1+Lll19OqZ/tp6yszHf7fseg6zoGDhwY+FnK22+/jYEDB54RBWaoe/iZ\nAfU6V155JZ555hmcOnUKgFGF7MiRI7jkkkuwdu1adHZ2oq2tDX/4wx/sx9TU1GD79u0AYL8KsLb1\nxBNPQFVVAMDevXvR3t7uu19JkjB27FgcPHjQ3lZbWxs0TQNg1Hq49dZbMXnyZAwYMCDtMQif74+U\nJCnwGPr164eRI0fabRdCYPfu3QCAV155BcePH8fmzZuxePFinDhxIkMP0pmIrwyo5Pj99e2c19jY\niHfffRef//znARi/KH/zm9+goaEB119/Perr6zF06FBMmjTJ/qX7ve99D9dddx1WrFiBq6++2t7e\nwoUL0dLSggsuuABCCAwdOhRr1qwJrGIVDoexevVqLF68GB0dHYhGo9i4cSP69OmDCy64AAMGDAh8\ni8i5zaDte4/B+Z34zz//PBYtWoR7770XiUQCc+bMQVVVFe655x789a9/RVVVFW655Rbcdttt+PWv\nf51lb9OZgl9hTWesn/zkJ+jbty/uvPPOvOzvgw8+wKWXXuq6A4ioWPBtIjqj5es+/VWrVuGiiy7C\n8uXL87I/oq7iKwMiIuIrAyIi4mBARETgYEBEROBgQERE4GBARETgYEBERAD+PxLT/D0xZ0JNAAAA\nAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x7f88f460e210>"
]
}
],
"prompt_number": 4
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment