Skip to content

Instantly share code, notes, and snippets.

@Tschucker
Created February 16, 2021 19:00
Show Gist options
  • Save Tschucker/e85bb5163ea7834fb52199e8e3db6c19 to your computer and use it in GitHub Desktop.
Save Tschucker/e85bb5163ea7834fb52199e8e3db6c19 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Intensity Graded FFT Animation with RTLSDR"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"from matplotlib.animation import FuncAnimation\n",
"import math\n",
"from IPython.display import HTML, Image"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"#Test capture\n",
"from rtlsdr import RtlSdr\n",
"sdr = RtlSdr()\n",
"\n",
"# configure device\n",
"sdr.sample_rate = 2.048e6 # Hz\n",
"sdr.center_freq = 915e6 # Hz\n",
"sdr.gain = 'auto'\n",
"samples = sdr.read_samples(256*10240)\n",
"sdr.close()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"#Animate function that interates over fft data\n",
"def animate(i, im, norm_fft_array, mag_steps, fft_len, fft_div): \n",
" mag_step = 1/mag_steps\n",
" \n",
" if i == 0:\n",
" hitmap_array = im.get_array()*np.exp(-10)\n",
" \n",
" else:\n",
" hitmap_array = im.get_array()*np.exp(-0.04)\n",
"\n",
" for m in range(fft_len):\n",
" hit_mag = int(norm_fft_array[i][m]/mag_step)\n",
" hitmap_array[hit_mag][int(m/fft_div)] = hitmap_array[hit_mag][int(m/fft_div)] + .5\n",
"\n",
" #hitmap_array_db = 10.0 * np.log10(hitmap_array) \n",
" \n",
" im.set_array(hitmap_array)\n",
" return [im]\n",
"\n",
"#Function\n",
"def fft_intensity_animate(samples: np.ndarray, fft_len: int = 256, fft_div: int = 2, mag_steps: int = 100):\n",
" \n",
" num_ffts = math.floor(len(samples)/fft_len)\n",
" \n",
" fft_array = []\n",
" for i in range(num_ffts):\n",
" temp = np.fft.fftshift(np.fft.fft(samples[i*fft_len:(i+1)*fft_len]))\n",
" temp_mag = 20.0 * np.log10(np.abs(temp))\n",
" fft_array.append(temp_mag)\n",
" \n",
" max_mag = np.amax(fft_array)\n",
" min_mag = np.abs(np.amin(fft_array))\n",
" \n",
" norm_fft_array = fft_array\n",
" for i in range(num_ffts):\n",
" norm_fft_array[i] = (fft_array[i]+min_mag)/(max_mag+min_mag) \n",
" \n",
" #animation place holder\n",
" fig = plt.figure()\n",
" a = np.random.random((mag_steps+1,int(fft_len/fft_div)))\n",
" im = plt.imshow(a, origin='lower', cmap='plasma', interpolation='bilinear')\n",
" \n",
" #compute animation\n",
" anim = FuncAnimation(fig, animate, frames=1000, fargs = (im,norm_fft_array,mag_steps,fft_len,fft_div), interval=1, blit=True)\n",
" \n",
" return(anim)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Animation"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#Test parameters\n",
"fft_len = 1024\n",
"fft_div = 2\n",
"mag_steps = 400\n",
"\n",
"anim = fft_intensity_animate(samples, fft_len, fft_div, mag_steps)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Save Animation"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"anim.save('fft_rtlsdr_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Optional GIF Animation"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"#anim.save('fft_animation.gif', fps=30, writer='pillow')\n",
"#Image(url='fft_animation.gif')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment