{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Experiment 7 - Scipy's correlate vs. norm correlate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The aim of this experiment is to determine which correlate is better: scipy's correlate or norm correlate" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os, sys\n", "nb_dir = os.path.split(os.getcwd())[0]\n", "if nb_dir not in sys.path:\n", " sys.path.append(nb_dir)\n", " \n", "%matplotlib inline\n", "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from directdemod import source, chunker, comm, constants, filters, fmDemod, sink, amDemod, noaa, log\n", "import numpy as np\n", "import sys, getopt, logging\n", "import matplotlib.pyplot as plt\n", "log.log(console = False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get syncs from a file we do," ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Beginning FM demodulation to get audio in chunks\n", "INFO:root:Processing chunk 1 of 9 chunks\n", "INFO:root:FM demodulation successfully complete\n", "INFO:root:Beginning AM demodulation in chunks\n", "INFO:root:Processing chunk 1 of 1 chunks\n", "INFO:root:AM demodulation completed\n", "INFO:root:Beginning SyncA detection\n", "INFO:root:Done SyncA detection\n", "INFO:root:Beginning SyncB detection\n", "INFO:root:Done SyncB detection\n", "INFO:root:Beginning Accurate SyncA detection\n", "INFO:root:Detecting Sync 1 of 20 syncs\n", "INFO:root:Detecting Sync 2 of 20 syncs\n", "INFO:root:Detecting Sync 3 of 20 syncs\n", "INFO:root:Detecting Sync 4 of 20 syncs\n", "INFO:root:Detecting Sync 5 of 20 syncs\n", "INFO:root:Detecting Sync 6 of 20 syncs\n", "INFO:root:Detecting Sync 7 of 20 syncs\n", "INFO:root:Detecting Sync 8 of 20 syncs\n", "INFO:root:Detecting Sync 9 of 20 syncs\n", "INFO:root:Detecting Sync 10 of 20 syncs\n", "INFO:root:Detecting Sync 11 of 20 syncs\n", "INFO:root:Detecting Sync 12 of 20 syncs\n", "INFO:root:Detecting Sync 13 of 20 syncs\n", "INFO:root:Detecting Sync 14 of 20 syncs\n", "INFO:root:Detecting Sync 15 of 20 syncs\n", "INFO:root:Detecting Sync 16 of 20 syncs\n", "INFO:root:Detecting Sync 17 of 20 syncs\n", "INFO:root:Detecting Sync 18 of 20 syncs\n", "INFO:root:Detecting Sync 19 of 20 syncs\n", "INFO:root:Detecting Sync 20 of 20 syncs\n", "INFO:root:Accurate SyncA detection complete\n", "INFO:root:Beginning Accurate SyncB detection\n", "INFO:root:Detecting Sync 1 of 19 syncs\n", "INFO:root:Detecting Sync 2 of 19 syncs\n", "INFO:root:Detecting Sync 3 of 19 syncs\n", "INFO:root:Detecting Sync 4 of 19 syncs\n", "INFO:root:Detecting Sync 5 of 19 syncs\n", "INFO:root:Detecting Sync 6 of 19 syncs\n", "INFO:root:Detecting Sync 7 of 19 syncs\n", "INFO:root:Detecting Sync 8 of 19 syncs\n", "INFO:root:Detecting Sync 9 of 19 syncs\n", "INFO:root:Detecting Sync 10 of 19 syncs\n", "INFO:root:Detecting Sync 11 of 19 syncs\n", "INFO:root:Detecting Sync 12 of 19 syncs\n", "INFO:root:Detecting Sync 13 of 19 syncs\n", "INFO:root:Detecting Sync 14 of 19 syncs\n", "INFO:root:Detecting Sync 15 of 19 syncs\n", "INFO:root:Detecting Sync 16 of 19 syncs\n", "INFO:root:Detecting Sync 17 of 19 syncs\n", "INFO:root:Detecting Sync 18 of 19 syncs\n", "INFO:root:Detecting Sync 19 of 19 syncs\n", "INFO:root:Accurate SyncB detection complete\n" ] } ], "source": [ "sigsrc = source.IQwav(\"D:\\\\noaa\\\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav\")\n", "noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET)\n", "syncs = noaaObj.getAccurateSync" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SyncA: [1631866, 2654342, 3679930, 4701642, 5727292, 6749455, 7776132, 8800994, 9821569, 10848186, 11869576, 12894434, 13921102, 14942453, 15969017, 16992994, 18014613, 19037708]\n", "SyncB: [1631264, 2655194, 3679349, 4704140, 5727224, 6749487, 7777778, 8797587, 9821536, 10847319, 11869551, 12894413, 13921006, 14944157, 15965631, 16991343, 18014449, 19039331]\n", "\n", "diffSyncA: [1022476 1025588 1021712 1025650 1022163 1026677 1024862 1020575 1026617\n", " 1021390 1024858 1026668 1021351 1026564 1023977 1021619 1023095]\n", "diffSyncB: [1023930 1024155 1024791 1023084 1022263 1028291 1019809 1023949 1025783\n", " 1022232 1024862 1026593 1023151 1021474 1025712 1023106 1024882]\n", "\n", "abs(diffSyncA-1024000): [1524 1588 2288 1650 1837 2677 862 3425 2617 2610 858 2668 2649 2564 23\n", " 2381 905]\n", "abs(diffSyncB-1024000): [ 70 155 791 916 1737 4291 4191 51 1783 1768 862 2593 849 2526 1712\n", " 894 882]\n", "\n", "sum(abs(diffSyncA-1024000)): 33126\n", "sum(abs(diffSyncB-1024000)): 26071\n" ] } ], "source": [ "syncA, syncB = syncs\n", "print(\"SyncA:\",syncA)\n", "print(\"SyncB:\",syncB)\n", "print()\n", "print(\"diffSyncA:\",np.diff(syncA))\n", "print(\"diffSyncB:\",np.diff(syncB))\n", "print()\n", "print(\"abs(diffSyncA-1024000):\", np.abs(np.diff(syncA) - 1024000))\n", "print(\"abs(diffSyncB-1024000):\", np.abs(np.diff(syncB) - 1024000))\n", "print()\n", "print(\"sum(abs(diffSyncA-1024000)):\", np.sum(np.abs(np.diff(syncA) - 1024000)))\n", "print(\"sum(abs(diffSyncB-1024000)):\", np.sum(np.abs(np.diff(syncB) - 1024000)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Method\n", "\n", "Experimental environment will be:\n", "same file and same everything except (correlate function, filter before correlation, needle type)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# EXP A\n", "2 runs: variables [1st with norm correlate, 2nd with scipys correlate]\n", "\n", "constants [hamming filter of width 492, needle varies from 11 to 244]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Beginning FM demodulation to get audio in chunks\n", "INFO:root:Processing chunk 1 of 9 chunks\n", "INFO:root:FM demodulation successfully complete\n", "INFO:root:Beginning AM demodulation in chunks\n", "INFO:root:Processing chunk 1 of 1 chunks\n", "INFO:root:AM demodulation completed\n", "INFO:root:Beginning SyncA detection\n", "INFO:root:Done SyncA detection\n", "INFO:root:Beginning SyncB detection\n", "INFO:root:Done SyncB detection\n", "INFO:root:Beginning Accurate SyncA detection\n", "INFO:root:Detecting Sync 1 of 20 syncs\n", "INFO:root:Detecting Sync 2 of 20 syncs\n", "INFO:root:Detecting Sync 3 of 20 syncs\n", "INFO:root:Detecting Sync 4 of 20 syncs\n", "INFO:root:Detecting Sync 5 of 20 syncs\n", "INFO:root:Detecting Sync 6 of 20 syncs\n", "INFO:root:Detecting Sync 7 of 20 syncs\n", "INFO:root:Detecting Sync 8 of 20 syncs\n", "INFO:root:Detecting Sync 9 of 20 syncs\n", "INFO:root:Detecting Sync 10 of 20 syncs\n", "INFO:root:Detecting Sync 11 of 20 syncs\n", "INFO:root:Detecting Sync 12 of 20 syncs\n", "INFO:root:Detecting Sync 13 of 20 syncs\n", "INFO:root:Detecting Sync 14 of 20 syncs\n", "INFO:root:Detecting Sync 15 of 20 syncs\n", "INFO:root:Detecting Sync 16 of 20 syncs\n", "INFO:root:Detecting Sync 17 of 20 syncs\n", "INFO:root:Detecting Sync 18 of 20 syncs\n", "INFO:root:Detecting Sync 19 of 20 syncs\n", "INFO:root:Detecting Sync 20 of 20 syncs\n", "INFO:root:Accurate SyncA detection complete\n", "INFO:root:Beginning Accurate SyncB detection\n", "INFO:root:Detecting Sync 1 of 19 syncs\n", "INFO:root:Detecting Sync 2 of 19 syncs\n", "INFO:root:Detecting Sync 3 of 19 syncs\n", "INFO:root:Detecting Sync 4 of 19 syncs\n", "INFO:root:Detecting Sync 5 of 19 syncs\n", "INFO:root:Detecting Sync 6 of 19 syncs\n", "INFO:root:Detecting Sync 7 of 19 syncs\n", "INFO:root:Detecting Sync 8 of 19 syncs\n", "INFO:root:Detecting Sync 9 of 19 syncs\n", "INFO:root:Detecting Sync 10 of 19 syncs\n", "INFO:root:Detecting Sync 11 of 19 syncs\n", "INFO:root:Detecting Sync 12 of 19 syncs\n", "INFO:root:Detecting Sync 13 of 19 syncs\n", "INFO:root:Detecting Sync 14 of 19 syncs\n", "INFO:root:Detecting Sync 15 of 19 syncs\n", "INFO:root:Detecting Sync 16 of 19 syncs\n", "INFO:root:Detecting Sync 17 of 19 syncs\n", "INFO:root:Detecting Sync 18 of 19 syncs\n", "INFO:root:Detecting Sync 19 of 19 syncs\n", "INFO:root:Accurate SyncB detection complete\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 882902716.37 times longer than the fastest. This could mean that an intermediate result is being cached.\n", "1 loop, best of 3: 395 ns per loop\n" ] } ], "source": [ "sigsrc = source.IQwav(\"D:\\\\noaa\\\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav\")\n", "noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET)\n", "syncs = noaaObj.getAccurateSync\n", "syncA1, syncB1 = syncs" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Beginning FM demodulation to get audio in chunks\n", "INFO:root:Processing chunk 1 of 9 chunks\n", "INFO:root:FM demodulation successfully complete\n", "INFO:root:Beginning AM demodulation in chunks\n", "INFO:root:Processing chunk 1 of 1 chunks\n", "INFO:root:AM demodulation completed\n", "INFO:root:Beginning SyncA detection\n", "INFO:root:Done SyncA detection\n", "INFO:root:Beginning SyncB detection\n", "INFO:root:Done SyncB detection\n", "INFO:root:Beginning Accurate SyncA detection\n", "INFO:root:Detecting Sync 1 of 19 syncs\n", "INFO:root:Detecting Sync 2 of 19 syncs\n", "INFO:root:Detecting Sync 3 of 19 syncs\n", "INFO:root:Detecting Sync 4 of 19 syncs\n", "INFO:root:Detecting Sync 5 of 19 syncs\n", "INFO:root:Detecting Sync 6 of 19 syncs\n", "INFO:root:Detecting Sync 7 of 19 syncs\n", "INFO:root:Detecting Sync 8 of 19 syncs\n", "INFO:root:Detecting Sync 9 of 19 syncs\n", "INFO:root:Detecting Sync 10 of 19 syncs\n", "INFO:root:Detecting Sync 11 of 19 syncs\n", "INFO:root:Detecting Sync 12 of 19 syncs\n", "INFO:root:Detecting Sync 13 of 19 syncs\n", "INFO:root:Detecting Sync 14 of 19 syncs\n", "INFO:root:Detecting Sync 15 of 19 syncs\n", "INFO:root:Detecting Sync 16 of 19 syncs\n", "INFO:root:Detecting Sync 17 of 19 syncs\n", "INFO:root:Detecting Sync 18 of 19 syncs\n", "INFO:root:Detecting Sync 19 of 19 syncs\n", "INFO:root:Accurate SyncA detection complete\n", "INFO:root:Beginning Accurate SyncB detection\n", "INFO:root:Detecting Sync 1 of 19 syncs\n", "INFO:root:Detecting Sync 2 of 19 syncs\n", "INFO:root:Detecting Sync 3 of 19 syncs\n", "INFO:root:Detecting Sync 4 of 19 syncs\n", "INFO:root:Detecting Sync 5 of 19 syncs\n", "INFO:root:Detecting Sync 6 of 19 syncs\n", "INFO:root:Detecting Sync 7 of 19 syncs\n", "INFO:root:Detecting Sync 8 of 19 syncs\n", "INFO:root:Detecting Sync 9 of 19 syncs\n", "INFO:root:Detecting Sync 10 of 19 syncs\n", "INFO:root:Detecting Sync 11 of 19 syncs\n", "INFO:root:Detecting Sync 12 of 19 syncs\n", "INFO:root:Detecting Sync 13 of 19 syncs\n", "INFO:root:Detecting Sync 14 of 19 syncs\n", "INFO:root:Detecting Sync 15 of 19 syncs\n", "INFO:root:Detecting Sync 16 of 19 syncs\n", "INFO:root:Detecting Sync 17 of 19 syncs\n", "INFO:root:Detecting Sync 18 of 19 syncs\n", "INFO:root:Detecting Sync 19 of 19 syncs\n", "INFO:root:Accurate SyncB detection complete\n" ] } ], "source": [ "sigsrc = source.IQwav(\"D:\\\\noaa\\\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav\")\n", "noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET)\n", "syncs = noaaObj.getAccurateSync\n", "syncA2, syncB2 = syncs" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SyncA1: [74312, 1098305, 2122304, 3146305, 4170308, 5194308, 6218313, 7242316, 8266317, 9290322, 10314324, 11338323, 12362326, 13386329, 14410332, 15434336, 16458336, 17482345, 18506342, 19530344]\n", "SyncB1: [586284, 1610285, 2634286, 3658292, 4682289, 5706290, 6730298, 7754295, 8778301, 9802301, 10826306, 11850307, 12874307, 13898313, 14922315, 15946317, 16970321, 17994322, 19018328]\n", "\n", "diffSyncA1: [1023993 1023999 1024001 1024003 1024000 1024005 1024003 1024001 1024005\n", " 1024002 1023999 1024003 1024003 1024003 1024004 1024000 1024009 1023997\n", " 1024002]\n", "diffSyncB1: [1024001 1024001 1024006 1023997 1024001 1024008 1023997 1024006 1024000\n", " 1024005 1024001 1024000 1024006 1024002 1024002 1024004 1024001 1024006]\n", "\n", "abs(diffSyncA1-1024000): [7 1 1 3 0 5 3 1 5 2 1 3 3 3 4 0 9 3 2]\n", "abs(diffSyncB1-1024000): [1 1 6 3 1 8 3 6 0 5 1 0 6 2 2 4 1 6]\n", "\n", "sum(abs(diffSyncA1-1024000)): 56\n", "sum(abs(diffSyncB1-1024000)): 56\n", "\n", "SyncA2: [1631866, 2654342, 3679930, 4701642, 5727292, 6749455, 7776132, 8800994, 9821569, 10848186, 11869576, 12894434, 13921102, 14942453, 15969017, 16992994, 18014613, 19037708]\n", "SyncB2: [1631264, 2655194, 3679349, 4704140, 5727224, 6749487, 7777778, 8797587, 9821536, 10847319, 11869551, 12894413, 13921006, 14944157, 15965631, 16991343, 18014449, 19039331]\n", "\n", "diffSyncA2: [1022476 1025588 1021712 1025650 1022163 1026677 1024862 1020575 1026617\n", " 1021390 1024858 1026668 1021351 1026564 1023977 1021619 1023095]\n", "diffSyncB2: [1023930 1024155 1024791 1023084 1022263 1028291 1019809 1023949 1025783\n", " 1022232 1024862 1026593 1023151 1021474 1025712 1023106 1024882]\n", "\n", "abs(diffSyncA2-1024000): [1524 1588 2288 1650 1837 2677 862 3425 2617 2610 858 2668 2649 2564 23\n", " 2381 905]\n", "abs(diffSyncB2-1024000): [ 70 155 791 916 1737 4291 4191 51 1783 1768 862 2593 849 2526 1712\n", " 894 882]\n", "\n", "sum(abs(diffSyncA2-1024000)): 33126\n", "sum(abs(diffSyncB2-1024000)): 26071\n", "\n", "diffSyncA1-diffSyncA2: [1517, -1589, 2289, -1647, 1837, -2672, -859, 3426, -2612, 2612, -859, -2665, 2652, -2561, 27, 2381, 914]\n", "diffSyncB1-diffSyncB2: [71, -154, -785, 913, 1738, -4283, 4188, 57, -1783, 1773, -861, -2593, 855, 2528, -1710, 898, -881]\n", "\n", "IMP RESULTS\n", "\n", "NORM CORR:\n", "\tMax Deviation in diffSyncA1 16\n", "\tMax Deviation in diffSyncB1 11\n", "\tCumulative deviation from ideal SyncA1 56\n", "\tCumulative deviation from ideal SyncB1 56\n", "\n", "SCIPY:\n", "\tMax Deviation in diffSyncA2 6102\n", "\tMax Deviation in diffSyncB2 8482\n", "\tCumulative deviation from ideal SyncA2 33126\n", "\tCumulative deviation from ideal SyncB2 26071\n" ] } ], "source": [ "print(\"SyncA1:\",syncA1)\n", "print(\"SyncB1:\",syncB1)\n", "print()\n", "print(\"diffSyncA1:\",np.diff(syncA1))\n", "print(\"diffSyncB1:\",np.diff(syncB1))\n", "print()\n", "print(\"abs(diffSyncA1-1024000):\", np.abs(np.diff(syncA1) - 1024000))\n", "print(\"abs(diffSyncB1-1024000):\", np.abs(np.diff(syncB1) - 1024000))\n", "print()\n", "print(\"sum(abs(diffSyncA1-1024000)):\", np.sum(np.abs(np.diff(syncA1) - 1024000)))\n", "print(\"sum(abs(diffSyncB1-1024000)):\", np.sum(np.abs(np.diff(syncB1) - 1024000)))\n", "print()\n", "print(\"SyncA2:\",syncA2)\n", "print(\"SyncB2:\",syncB2)\n", "print()\n", "print(\"diffSyncA2:\",np.diff(syncA2))\n", "print(\"diffSyncB2:\",np.diff(syncB2))\n", "print()\n", "print(\"abs(diffSyncA2-1024000):\", np.abs(np.diff(syncA2) - 1024000))\n", "print(\"abs(diffSyncB2-1024000):\", np.abs(np.diff(syncB2) - 1024000))\n", "print()\n", "print(\"sum(abs(diffSyncA2-1024000)):\", np.sum(np.abs(np.diff(syncA2) - 1024000)))\n", "print(\"sum(abs(diffSyncB2-1024000)):\", np.sum(np.abs(np.diff(syncB2) - 1024000)))\n", "print()\n", "print(\"diffSyncA1-diffSyncA2:\", [a-b for a,b in zip(np.diff(syncA1),np.diff(syncA2))])\n", "print(\"diffSyncB1-diffSyncB2:\", [a-b for a,b in zip(np.diff(syncB1),np.diff(syncB2))])\n", "print()\n", "print(\"IMP RESULTS\")\n", "print()\n", "print(\"NORM CORR:\")\n", "print(\"\\tMax Deviation in diffSyncA1\", np.max(np.diff(syncA1))-np.min(np.diff(syncA1)))\n", "print(\"\\tMax Deviation in diffSyncB1\", np.max(np.diff(syncB1))-np.min(np.diff(syncB1)))\n", "print(\"\\tCumulative deviation from ideal SyncA1\", np.sum(np.abs(np.diff(syncA1) - 1024000)))\n", "print(\"\\tCumulative deviation from ideal SyncB1\", np.sum(np.abs(np.diff(syncB1) - 1024000)))\n", "print()\n", "print(\"SCIPY:\")\n", "print(\"\\tMax Deviation in diffSyncA2\", np.max(np.diff(syncA2))-np.min(np.diff(syncA2)))\n", "print(\"\\tMax Deviation in diffSyncB2\", np.max(np.diff(syncB2))-np.min(np.diff(syncB2)))\n", "print(\"\\tCumulative deviation from ideal SyncA2\", np.sum(np.abs(np.diff(syncA2) - 1024000)))\n", "print(\"\\tCumulative deviation from ideal SyncB2\", np.sum(np.abs(np.diff(syncB2) - 1024000)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Result: Norm Corr wins\n", "- min deviation from ideal\n", "- min deviation\n", "- Scipys correlate doesn't seem to work with this needle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# EXP B\n", "2 runs: variables [1st with norm correlate, 2nd with scipys correlate]\n", "\n", "constants [hamming filter of width 492, needle varies from -0.5 to 0.5]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Beginning FM demodulation to get audio in chunks\n", "INFO Beginning FM demodulation to get audio in chunks\n", "INFO:root:Processing chunk 1 of 9 chunks\n", "INFO Processing chunk 1 of 9 chunks\n", "INFO:root:FM demodulation successfully complete\n", "INFO FM demodulation successfully complete\n", "INFO:root:Beginning AM demodulation in chunks\n", "INFO Beginning AM demodulation in chunks\n", "INFO:root:Processing chunk 1 of 1 chunks\n", "INFO Processing chunk 1 of 1 chunks\n", "INFO:root:AM demodulation completed\n", "INFO AM demodulation completed\n", "INFO:root:Beginning SyncA detection\n", "INFO Beginning SyncA detection\n", "INFO:root:Done SyncA detection\n", "INFO Done SyncA detection\n", "INFO:root:Beginning SyncB detection\n", "INFO Beginning SyncB detection\n", "INFO:root:Done SyncB detection\n", "INFO Done SyncB detection\n", "INFO:root:Beginning Accurate SyncA detection\n", "INFO Beginning Accurate SyncA detection\n", "INFO:root:Detecting Sync 1 of 20 syncs\n", "INFO Detecting Sync 1 of 20 syncs\n", "INFO:root:Detecting Sync 2 of 20 syncs\n", "INFO Detecting Sync 2 of 20 syncs\n", "INFO:root:Detecting Sync 3 of 20 syncs\n", "INFO Detecting Sync 3 of 20 syncs\n", "INFO:root:Detecting Sync 4 of 20 syncs\n", "INFO Detecting Sync 4 of 20 syncs\n", "INFO:root:Detecting Sync 5 of 20 syncs\n", "INFO Detecting Sync 5 of 20 syncs\n", "INFO:root:Detecting Sync 6 of 20 syncs\n", "INFO Detecting Sync 6 of 20 syncs\n", "INFO:root:Detecting Sync 7 of 20 syncs\n", "INFO Detecting Sync 7 of 20 syncs\n", "INFO:root:Detecting Sync 8 of 20 syncs\n", "INFO Detecting Sync 8 of 20 syncs\n", "INFO:root:Detecting Sync 9 of 20 syncs\n", "INFO Detecting Sync 9 of 20 syncs\n", "INFO:root:Detecting Sync 10 of 20 syncs\n", "INFO Detecting Sync 10 of 20 syncs\n", "INFO:root:Detecting Sync 11 of 20 syncs\n", "INFO Detecting Sync 11 of 20 syncs\n", "INFO:root:Detecting Sync 12 of 20 syncs\n", "INFO Detecting Sync 12 of 20 syncs\n", "INFO:root:Detecting Sync 13 of 20 syncs\n", "INFO Detecting Sync 13 of 20 syncs\n", "INFO:root:Detecting Sync 14 of 20 syncs\n", "INFO Detecting Sync 14 of 20 syncs\n", "INFO:root:Detecting Sync 15 of 20 syncs\n", "INFO Detecting Sync 15 of 20 syncs\n", "INFO:root:Detecting Sync 16 of 20 syncs\n", "INFO Detecting Sync 16 of 20 syncs\n", "INFO:root:Detecting Sync 17 of 20 syncs\n", "INFO Detecting Sync 17 of 20 syncs\n", "INFO:root:Detecting Sync 18 of 20 syncs\n", "INFO Detecting Sync 18 of 20 syncs\n", "INFO:root:Detecting Sync 19 of 20 syncs\n", "INFO Detecting Sync 19 of 20 syncs\n", "INFO:root:Detecting Sync 20 of 20 syncs\n", "INFO Detecting Sync 20 of 20 syncs\n", "INFO:root:Accurate SyncA detection complete\n", "INFO Accurate SyncA detection complete\n", "INFO:root:Beginning Accurate SyncB detection\n", "INFO Beginning Accurate SyncB detection\n", "INFO:root:Detecting Sync 1 of 19 syncs\n", "INFO Detecting Sync 1 of 19 syncs\n", "INFO:root:Detecting Sync 2 of 19 syncs\n", "INFO Detecting Sync 2 of 19 syncs\n", "INFO:root:Detecting Sync 3 of 19 syncs\n", "INFO Detecting Sync 3 of 19 syncs\n", "INFO:root:Detecting Sync 4 of 19 syncs\n", "INFO Detecting Sync 4 of 19 syncs\n", "INFO:root:Detecting Sync 5 of 19 syncs\n", "INFO Detecting Sync 5 of 19 syncs\n", "INFO:root:Detecting Sync 6 of 19 syncs\n", "INFO Detecting Sync 6 of 19 syncs\n", "INFO:root:Detecting Sync 7 of 19 syncs\n", "INFO Detecting Sync 7 of 19 syncs\n", "INFO:root:Detecting Sync 8 of 19 syncs\n", "INFO Detecting Sync 8 of 19 syncs\n", "INFO:root:Detecting Sync 9 of 19 syncs\n", "INFO Detecting Sync 9 of 19 syncs\n", "INFO:root:Detecting Sync 10 of 19 syncs\n", "INFO Detecting Sync 10 of 19 syncs\n", "INFO:root:Detecting Sync 11 of 19 syncs\n", "INFO Detecting Sync 11 of 19 syncs\n", "INFO:root:Detecting Sync 12 of 19 syncs\n", "INFO Detecting Sync 12 of 19 syncs\n", "INFO:root:Detecting Sync 13 of 19 syncs\n", "INFO Detecting Sync 13 of 19 syncs\n", "INFO:root:Detecting Sync 14 of 19 syncs\n", "INFO Detecting Sync 14 of 19 syncs\n", "INFO:root:Detecting Sync 15 of 19 syncs\n", "INFO Detecting Sync 15 of 19 syncs\n", "INFO:root:Detecting Sync 16 of 19 syncs\n", "INFO Detecting Sync 16 of 19 syncs\n", "INFO:root:Detecting Sync 17 of 19 syncs\n", "INFO Detecting Sync 17 of 19 syncs\n", "INFO:root:Detecting Sync 18 of 19 syncs\n", "INFO Detecting Sync 18 of 19 syncs\n", "INFO:root:Detecting Sync 19 of 19 syncs\n", "INFO Detecting Sync 19 of 19 syncs\n", "INFO:root:Accurate SyncB detection complete\n", "INFO Accurate SyncB detection complete\n" ] } ], "source": [ "sigsrc = source.IQwav(\"D:\\\\noaa\\\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav\")\n", "noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET)\n", "syncs = noaaObj.getAccurateSync\n", "syncA1, syncB1 = syncs" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Beginning FM demodulation to get audio in chunks\n", "INFO Beginning FM demodulation to get audio in chunks\n", "INFO:root:Processing chunk 1 of 9 chunks\n", "INFO Processing chunk 1 of 9 chunks\n", "INFO:root:FM demodulation successfully complete\n", "INFO FM demodulation successfully complete\n", "INFO:root:Beginning AM demodulation in chunks\n", "INFO Beginning AM demodulation in chunks\n", "INFO:root:Processing chunk 1 of 1 chunks\n", "INFO Processing chunk 1 of 1 chunks\n", "INFO:root:AM demodulation completed\n", "INFO AM demodulation completed\n", "INFO:root:Beginning SyncA detection\n", "INFO Beginning SyncA detection\n", "INFO:root:Done SyncA detection\n", "INFO Done SyncA detection\n", "INFO:root:Beginning SyncB detection\n", "INFO Beginning SyncB detection\n", "INFO:root:Done SyncB detection\n", "INFO Done SyncB detection\n", "INFO:root:Beginning Accurate SyncA detection\n", "INFO Beginning Accurate SyncA detection\n", "INFO:root:Detecting Sync 1 of 20 syncs\n", "INFO Detecting Sync 1 of 20 syncs\n", "INFO:root:Detecting Sync 2 of 20 syncs\n", "INFO Detecting Sync 2 of 20 syncs\n", "INFO:root:Detecting Sync 3 of 20 syncs\n", "INFO Detecting Sync 3 of 20 syncs\n", "INFO:root:Detecting Sync 4 of 20 syncs\n", "INFO Detecting Sync 4 of 20 syncs\n", "INFO:root:Detecting Sync 5 of 20 syncs\n", "INFO Detecting Sync 5 of 20 syncs\n", "INFO:root:Detecting Sync 6 of 20 syncs\n", "INFO Detecting Sync 6 of 20 syncs\n", "INFO:root:Detecting Sync 7 of 20 syncs\n", "INFO Detecting Sync 7 of 20 syncs\n", "INFO:root:Detecting Sync 8 of 20 syncs\n", "INFO Detecting Sync 8 of 20 syncs\n", "INFO:root:Detecting Sync 9 of 20 syncs\n", "INFO Detecting Sync 9 of 20 syncs\n", "INFO:root:Detecting Sync 10 of 20 syncs\n", "INFO Detecting Sync 10 of 20 syncs\n", "INFO:root:Detecting Sync 11 of 20 syncs\n", "INFO Detecting Sync 11 of 20 syncs\n", "INFO:root:Detecting Sync 12 of 20 syncs\n", "INFO Detecting Sync 12 of 20 syncs\n", "INFO:root:Detecting Sync 13 of 20 syncs\n", "INFO Detecting Sync 13 of 20 syncs\n", "INFO:root:Detecting Sync 14 of 20 syncs\n", "INFO Detecting Sync 14 of 20 syncs\n", "INFO:root:Detecting Sync 15 of 20 syncs\n", "INFO Detecting Sync 15 of 20 syncs\n", "INFO:root:Detecting Sync 16 of 20 syncs\n", "INFO Detecting Sync 16 of 20 syncs\n", "INFO:root:Detecting Sync 17 of 20 syncs\n", "INFO Detecting Sync 17 of 20 syncs\n", "INFO:root:Detecting Sync 18 of 20 syncs\n", "INFO Detecting Sync 18 of 20 syncs\n", "INFO:root:Detecting Sync 19 of 20 syncs\n", "INFO Detecting Sync 19 of 20 syncs\n", "INFO:root:Detecting Sync 20 of 20 syncs\n", "INFO Detecting Sync 20 of 20 syncs\n", "INFO:root:Accurate SyncA detection complete\n", "INFO Accurate SyncA detection complete\n", "INFO:root:Beginning Accurate SyncB detection\n", "INFO Beginning Accurate SyncB detection\n", "INFO:root:Detecting Sync 1 of 19 syncs\n", "INFO Detecting Sync 1 of 19 syncs\n", "INFO:root:Detecting Sync 2 of 19 syncs\n", "INFO Detecting Sync 2 of 19 syncs\n", "INFO:root:Detecting Sync 3 of 19 syncs\n", "INFO Detecting Sync 3 of 19 syncs\n", "INFO:root:Detecting Sync 4 of 19 syncs\n", "INFO Detecting Sync 4 of 19 syncs\n", "INFO:root:Detecting Sync 5 of 19 syncs\n", "INFO Detecting Sync 5 of 19 syncs\n", "INFO:root:Detecting Sync 6 of 19 syncs\n", "INFO Detecting Sync 6 of 19 syncs\n", "INFO:root:Detecting Sync 7 of 19 syncs\n", "INFO Detecting Sync 7 of 19 syncs\n", "INFO:root:Detecting Sync 8 of 19 syncs\n", "INFO Detecting Sync 8 of 19 syncs\n", "INFO:root:Detecting Sync 9 of 19 syncs\n", "INFO Detecting Sync 9 of 19 syncs\n", "INFO:root:Detecting Sync 10 of 19 syncs\n", "INFO Detecting Sync 10 of 19 syncs\n", "INFO:root:Detecting Sync 11 of 19 syncs\n", "INFO Detecting Sync 11 of 19 syncs\n", "INFO:root:Detecting Sync 12 of 19 syncs\n", "INFO Detecting Sync 12 of 19 syncs\n", "INFO:root:Detecting Sync 13 of 19 syncs\n", "INFO Detecting Sync 13 of 19 syncs\n", "INFO:root:Detecting Sync 14 of 19 syncs\n", "INFO Detecting Sync 14 of 19 syncs\n", "INFO:root:Detecting Sync 15 of 19 syncs\n", "INFO Detecting Sync 15 of 19 syncs\n", "INFO:root:Detecting Sync 16 of 19 syncs\n", "INFO Detecting Sync 16 of 19 syncs\n", "INFO:root:Detecting Sync 17 of 19 syncs\n", "INFO Detecting Sync 17 of 19 syncs\n", "INFO:root:Detecting Sync 18 of 19 syncs\n", "INFO Detecting Sync 18 of 19 syncs\n", "INFO:root:Detecting Sync 19 of 19 syncs\n", "INFO Detecting Sync 19 of 19 syncs\n", "INFO:root:Accurate SyncB detection complete\n", "INFO Accurate SyncB detection complete\n" ] } ], "source": [ "sigsrc = source.IQwav(\"D:\\\\noaa\\\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav\")\n", "noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET)\n", "syncs = noaaObj.getAccurateSync\n", "syncA2, syncB2 = syncs" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SyncA1: [64474, 1088464, 2112464, 3136465, 4160468, 5184468, 6208473, 7232476, 8256477, 9280482, 10304484, 11328483, 12352486, 13376489, 14400492, 15424496, 16448496, 17472505, 18496502, 19520504]\n", "SyncB1: [576436, 1600437, 2624438, 3648443, 4672441, 5696441, 6720450, 7744447, 8768453, 9792453, 10816458, 11840459, 12864460, 13888464, 14912468, 15936469, 16960473, 17984474, 19008480]\n", "\n", "diffSyncA1: [1023990 1024000 1024001 1024003 1024000 1024005 1024003 1024001 1024005\n", " 1024002 1023999 1024003 1024003 1024003 1024004 1024000 1024009 1023997\n", " 1024002]\n", "diffSyncB1: [1024001 1024001 1024005 1023998 1024000 1024009 1023997 1024006 1024000\n", " 1024005 1024001 1024001 1024004 1024004 1024001 1024004 1024001 1024006]\n", "\n", "abs(diffSyncA1-1024000): [10 0 1 3 0 5 3 1 5 2 1 3 3 3 4 0 9 3 2]\n", "abs(diffSyncB1-1024000): [1 1 5 2 0 9 3 6 0 5 1 1 4 4 1 4 1 6]\n", "\n", "sum(abs(diffSyncA1-1024000)): 58\n", "sum(abs(diffSyncB1-1024000)): 54\n", "\n", "SyncA2: [74312, 1098305, 2122304, 3146305, 4170308, 5194308, 6218313, 7242316, 8266317, 9290322, 10314324, 11338323, 12362326, 13386329, 14410332, 15434336, 16458336, 17482345, 18506342, 19530344]\n", "SyncB2: [586284, 1610285, 2634286, 3658292, 4682289, 5706290, 6730298, 7754295, 8778301, 9802301, 10826306, 11850307, 12874307, 13898313, 14922315, 15946317, 16970321, 17994322, 19018328]\n", "\n", "diffSyncA2: [1023993 1023999 1024001 1024003 1024000 1024005 1024003 1024001 1024005\n", " 1024002 1023999 1024003 1024003 1024003 1024004 1024000 1024009 1023997\n", " 1024002]\n", "diffSyncB2: [1024001 1024001 1024006 1023997 1024001 1024008 1023997 1024006 1024000\n", " 1024005 1024001 1024000 1024006 1024002 1024002 1024004 1024001 1024006]\n", "\n", "abs(diffSyncA2-1024000): [7 1 1 3 0 5 3 1 5 2 1 3 3 3 4 0 9 3 2]\n", "abs(diffSyncB2-1024000): [1 1 6 3 1 8 3 6 0 5 1 0 6 2 2 4 1 6]\n", "\n", "sum(abs(diffSyncA2-1024000)): 56\n", "sum(abs(diffSyncB2-1024000)): 56\n", "\n", "diffSyncA1-diffSyncA2: [-3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n", "diffSyncB1-diffSyncB2: [0, 0, -1, 1, -1, 1, 0, 0, 0, 0, 0, 1, -2, 2, -1, 0, 0, 0]\n", "\n", "IMP RESULTS\n", "\n", "NORM CORR:\n", "\tMax Deviation in diffSyncA1 19\n", "\tMax Deviation in diffSyncB1 12\n", "\tCumulative deviation from ideal SyncA1 58\n", "\tCumulative deviation from ideal SyncB1 54\n", "\n", "SCIPY:\n", "\tMax Deviation in diffSyncA2 16\n", "\tMax Deviation in diffSyncB2 11\n", "\tCumulative deviation from ideal SyncA2 56\n", "\tCumulative deviation from ideal SyncB2 56\n" ] } ], "source": [ "print(\"SyncA1:\",syncA1)\n", "print(\"SyncB1:\",syncB1)\n", "print()\n", "print(\"diffSyncA1:\",np.diff(syncA1))\n", "print(\"diffSyncB1:\",np.diff(syncB1))\n", "print()\n", "print(\"abs(diffSyncA1-1024000):\", np.abs(np.diff(syncA1) - 1024000))\n", "print(\"abs(diffSyncB1-1024000):\", np.abs(np.diff(syncB1) - 1024000))\n", "print()\n", "print(\"sum(abs(diffSyncA1-1024000)):\", np.sum(np.abs(np.diff(syncA1) - 1024000)))\n", "print(\"sum(abs(diffSyncB1-1024000)):\", np.sum(np.abs(np.diff(syncB1) - 1024000)))\n", "print()\n", "print(\"SyncA2:\",syncA2)\n", "print(\"SyncB2:\",syncB2)\n", "print()\n", "print(\"diffSyncA2:\",np.diff(syncA2))\n", "print(\"diffSyncB2:\",np.diff(syncB2))\n", "print()\n", "print(\"abs(diffSyncA2-1024000):\", np.abs(np.diff(syncA2) - 1024000))\n", "print(\"abs(diffSyncB2-1024000):\", np.abs(np.diff(syncB2) - 1024000))\n", "print()\n", "print(\"sum(abs(diffSyncA2-1024000)):\", np.sum(np.abs(np.diff(syncA2) - 1024000)))\n", "print(\"sum(abs(diffSyncB2-1024000)):\", np.sum(np.abs(np.diff(syncB2) - 1024000)))\n", "print()\n", "print(\"diffSyncA1-diffSyncA2:\", [a-b for a,b in zip(np.diff(syncA1),np.diff(syncA2))])\n", "print(\"diffSyncB1-diffSyncB2:\", [a-b for a,b in zip(np.diff(syncB1),np.diff(syncB2))])\n", "print()\n", "print(\"IMP RESULTS\")\n", "print()\n", "print(\"NORM CORR:\")\n", "print(\"\\tMax Deviation in diffSyncA1\", np.max(np.diff(syncA1))-np.min(np.diff(syncA1)))\n", "print(\"\\tMax Deviation in diffSyncB1\", np.max(np.diff(syncB1))-np.min(np.diff(syncB1)))\n", "print(\"\\tCumulative deviation from ideal SyncA1\", np.sum(np.abs(np.diff(syncA1) - 1024000)))\n", "print(\"\\tCumulative deviation from ideal SyncB1\", np.sum(np.abs(np.diff(syncB1) - 1024000)))\n", "print()\n", "print(\"SCIPY:\")\n", "print(\"\\tMax Deviation in diffSyncA2\", np.max(np.diff(syncA2))-np.min(np.diff(syncA2)))\n", "print(\"\\tMax Deviation in diffSyncB2\", np.max(np.diff(syncB2))-np.min(np.diff(syncB2)))\n", "print(\"\\tCumulative deviation from ideal SyncA2\", np.sum(np.abs(np.diff(syncA2) - 1024000)))\n", "print(\"\\tCumulative deviation from ideal SyncB2\", np.sum(np.abs(np.diff(syncB2) - 1024000)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Result: Scipy wins\n", "- min deviation from ideal in scipy\n", "- min deviation in scipy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Final Result\n", "\n", "Scipy's correlate got the best answer and it is much more faster than norm correlate. Here is the plot of the syncs extracted from whole signal" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Beginning FM demodulation to get audio in chunks\n", "INFO Beginning FM demodulation to get audio in chunks\n", "INFO:root:Processing chunk 1 of 9 chunks\n", "INFO Processing chunk 1 of 9 chunks\n", "INFO:root:Processing chunk 2 of 9 chunks\n", "INFO Processing chunk 2 of 9 chunks\n", "INFO:root:Processing chunk 3 of 9 chunks\n", "INFO Processing chunk 3 of 9 chunks\n", "INFO:root:Processing chunk 4 of 9 chunks\n", "INFO Processing chunk 4 of 9 chunks\n", "INFO:root:Processing chunk 5 of 9 chunks\n", "INFO Processing chunk 5 of 9 chunks\n", "INFO:root:Processing chunk 6 of 9 chunks\n", "INFO Processing chunk 6 of 9 chunks\n", "INFO:root:Processing chunk 7 of 9 chunks\n", "INFO Processing chunk 7 of 9 chunks\n", "INFO:root:Processing chunk 8 of 9 chunks\n", "INFO Processing chunk 8 of 9 chunks\n", "INFO:root:Processing chunk 9 of 9 chunks\n", "INFO Processing chunk 9 of 9 chunks\n", "INFO:root:FM demodulation successfully complete\n", "INFO FM demodulation successfully complete\n", "INFO:root:Beginning AM demodulation in chunks\n", "INFO Beginning AM demodulation in chunks\n", "INFO:root:Processing chunk 1 of 5 chunks\n", "INFO Processing chunk 1 of 5 chunks\n", "INFO:root:Processing chunk 2 of 5 chunks\n", "INFO Processing chunk 2 of 5 chunks\n", "INFO:root:Processing chunk 3 of 5 chunks\n", "INFO Processing chunk 3 of 5 chunks\n", "INFO:root:Processing chunk 4 of 5 chunks\n", "INFO Processing chunk 4 of 5 chunks\n", "INFO:root:Processing chunk 5 of 5 chunks\n", "INFO Processing chunk 5 of 5 chunks\n", "INFO:root:AM demodulation completed\n", "INFO AM demodulation completed\n", "INFO:root:Beginning SyncA detection\n", "INFO Beginning SyncA detection\n", "INFO:root:Done SyncA detection\n", "INFO Done SyncA detection\n", "INFO:root:Beginning SyncB detection\n", "INFO Beginning SyncB detection\n", "INFO:root:Done SyncB detection\n", "INFO Done SyncB detection\n", "INFO:root:Beginning Accurate SyncA detection\n", "INFO Beginning Accurate SyncA detection\n", "INFO:root:Detecting Sync 1 of 168 syncs\n", "INFO Detecting Sync 1 of 168 syncs\n", "INFO:root:Detecting Sync 2 of 168 syncs\n", "INFO Detecting Sync 2 of 168 syncs\n", "INFO:root:Detecting Sync 3 of 168 syncs\n", "INFO Detecting Sync 3 of 168 syncs\n", "INFO:root:Detecting Sync 4 of 168 syncs\n", "INFO Detecting Sync 4 of 168 syncs\n", "INFO:root:Detecting Sync 5 of 168 syncs\n", "INFO Detecting Sync 5 of 168 syncs\n", "INFO:root:Detecting Sync 6 of 168 syncs\n", "INFO Detecting Sync 6 of 168 syncs\n", "INFO:root:Detecting Sync 7 of 168 syncs\n", "INFO Detecting Sync 7 of 168 syncs\n", "INFO:root:Detecting Sync 8 of 168 syncs\n", "INFO Detecting Sync 8 of 168 syncs\n", "INFO:root:Detecting Sync 9 of 168 syncs\n", "INFO Detecting Sync 9 of 168 syncs\n", "INFO:root:Detecting Sync 10 of 168 syncs\n", "INFO Detecting Sync 10 of 168 syncs\n", "INFO:root:Detecting Sync 11 of 168 syncs\n", "INFO Detecting Sync 11 of 168 syncs\n", "INFO:root:Detecting Sync 12 of 168 syncs\n", "INFO Detecting Sync 12 of 168 syncs\n", "INFO:root:Detecting Sync 13 of 168 syncs\n", "INFO Detecting Sync 13 of 168 syncs\n", "INFO:root:Detecting Sync 14 of 168 syncs\n", "INFO Detecting Sync 14 of 168 syncs\n", "INFO:root:Detecting Sync 15 of 168 syncs\n", "INFO Detecting Sync 15 of 168 syncs\n", "INFO:root:Detecting Sync 16 of 168 syncs\n", "INFO Detecting Sync 16 of 168 syncs\n", "INFO:root:Detecting Sync 17 of 168 syncs\n", "INFO Detecting Sync 17 of 168 syncs\n", "INFO:root:Detecting Sync 18 of 168 syncs\n", "INFO Detecting Sync 18 of 168 syncs\n", "INFO:root:Detecting Sync 19 of 168 syncs\n", "INFO Detecting Sync 19 of 168 syncs\n", "INFO:root:Detecting Sync 20 of 168 syncs\n", "INFO Detecting Sync 20 of 168 syncs\n", "INFO:root:Detecting Sync 21 of 168 syncs\n", "INFO Detecting Sync 21 of 168 syncs\n", "INFO:root:Detecting Sync 22 of 168 syncs\n", "INFO Detecting Sync 22 of 168 syncs\n", "INFO:root:Detecting Sync 23 of 168 syncs\n", "INFO Detecting Sync 23 of 168 syncs\n", "INFO:root:Detecting Sync 24 of 168 syncs\n", "INFO Detecting Sync 24 of 168 syncs\n", "INFO:root:Detecting Sync 25 of 168 syncs\n", "INFO Detecting Sync 25 of 168 syncs\n", "INFO:root:Detecting Sync 26 of 168 syncs\n", "INFO Detecting Sync 26 of 168 syncs\n", "INFO:root:Detecting Sync 27 of 168 syncs\n", "INFO Detecting Sync 27 of 168 syncs\n", "INFO:root:Detecting Sync 28 of 168 syncs\n", "INFO Detecting Sync 28 of 168 syncs\n", "INFO:root:Detecting Sync 29 of 168 syncs\n", "INFO Detecting Sync 29 of 168 syncs\n", "INFO:root:Detecting Sync 30 of 168 syncs\n", "INFO Detecting Sync 30 of 168 syncs\n", "INFO:root:Detecting Sync 31 of 168 syncs\n", "INFO Detecting Sync 31 of 168 syncs\n", "INFO:root:Detecting Sync 32 of 168 syncs\n", "INFO Detecting Sync 32 of 168 syncs\n", "INFO:root:Detecting Sync 33 of 168 syncs\n", "INFO Detecting Sync 33 of 168 syncs\n", "INFO:root:Detecting Sync 34 of 168 syncs\n", "INFO Detecting Sync 34 of 168 syncs\n", "INFO:root:Detecting Sync 35 of 168 syncs\n", "INFO Detecting Sync 35 of 168 syncs\n", "INFO:root:Detecting Sync 36 of 168 syncs\n", "INFO Detecting Sync 36 of 168 syncs\n", "INFO:root:Detecting Sync 37 of 168 syncs\n", "INFO Detecting Sync 37 of 168 syncs\n", "INFO:root:Detecting Sync 38 of 168 syncs\n", "INFO Detecting Sync 38 of 168 syncs\n", "INFO:root:Detecting Sync 39 of 168 syncs\n", "INFO Detecting Sync 39 of 168 syncs\n", "INFO:root:Detecting Sync 40 of 168 syncs\n", "INFO Detecting Sync 40 of 168 syncs\n", "INFO:root:Detecting Sync 41 of 168 syncs\n", "INFO Detecting Sync 41 of 168 syncs\n", "INFO:root:Detecting Sync 42 of 168 syncs\n", "INFO Detecting Sync 42 of 168 syncs\n", "INFO:root:Detecting Sync 43 of 168 syncs\n", "INFO Detecting Sync 43 of 168 syncs\n", "INFO:root:Detecting Sync 44 of 168 syncs\n", "INFO Detecting Sync 44 of 168 syncs\n", "INFO:root:Detecting Sync 45 of 168 syncs\n", "INFO Detecting Sync 45 of 168 syncs\n", "INFO:root:Detecting Sync 46 of 168 syncs\n", "INFO Detecting Sync 46 of 168 syncs\n", "INFO:root:Detecting Sync 47 of 168 syncs\n", "INFO Detecting Sync 47 of 168 syncs\n", "INFO:root:Detecting Sync 48 of 168 syncs\n", "INFO Detecting Sync 48 of 168 syncs\n", "INFO:root:Detecting Sync 49 of 168 syncs\n", "INFO Detecting Sync 49 of 168 syncs\n", "INFO:root:Detecting Sync 50 of 168 syncs\n", "INFO Detecting Sync 50 of 168 syncs\n", "INFO:root:Detecting Sync 51 of 168 syncs\n", "INFO Detecting Sync 51 of 168 syncs\n", "INFO:root:Detecting Sync 52 of 168 syncs\n", "INFO Detecting Sync 52 of 168 syncs\n", "INFO:root:Detecting Sync 53 of 168 syncs\n", "INFO Detecting Sync 53 of 168 syncs\n", "INFO:root:Detecting Sync 54 of 168 syncs\n", "INFO Detecting Sync 54 of 168 syncs\n", "INFO:root:Detecting Sync 55 of 168 syncs\n", "INFO Detecting Sync 55 of 168 syncs\n", "INFO:root:Detecting Sync 56 of 168 syncs\n", "INFO Detecting Sync 56 of 168 syncs\n", "INFO:root:Detecting Sync 57 of 168 syncs\n", "INFO Detecting Sync 57 of 168 syncs\n", "INFO:root:Detecting Sync 58 of 168 syncs\n", "INFO Detecting Sync 58 of 168 syncs\n", "INFO:root:Detecting Sync 59 of 168 syncs\n", "INFO Detecting Sync 59 of 168 syncs\n", "INFO:root:Detecting Sync 60 of 168 syncs\n", "INFO Detecting Sync 60 of 168 syncs\n", "INFO:root:Detecting Sync 61 of 168 syncs\n", "INFO Detecting Sync 61 of 168 syncs\n", "INFO:root:Detecting Sync 62 of 168 syncs\n", "INFO Detecting Sync 62 of 168 syncs\n", "INFO:root:Detecting Sync 63 of 168 syncs\n", "INFO Detecting Sync 63 of 168 syncs\n", "INFO:root:Detecting Sync 64 of 168 syncs\n", "INFO Detecting Sync 64 of 168 syncs\n", "INFO:root:Detecting Sync 65 of 168 syncs\n", "INFO Detecting Sync 65 of 168 syncs\n", "INFO:root:Detecting Sync 66 of 168 syncs\n", "INFO Detecting Sync 66 of 168 syncs\n", "INFO:root:Detecting Sync 67 of 168 syncs\n", "INFO Detecting Sync 67 of 168 syncs\n", "INFO:root:Detecting Sync 68 of 168 syncs\n", "INFO Detecting Sync 68 of 168 syncs\n", "INFO:root:Detecting Sync 69 of 168 syncs\n", "INFO Detecting Sync 69 of 168 syncs\n", "INFO:root:Detecting Sync 70 of 168 syncs\n", "INFO Detecting Sync 70 of 168 syncs\n", "INFO:root:Detecting Sync 71 of 168 syncs\n", "INFO Detecting Sync 71 of 168 syncs\n", "INFO:root:Detecting Sync 72 of 168 syncs\n", "INFO Detecting Sync 72 of 168 syncs\n", "INFO:root:Detecting Sync 73 of 168 syncs\n", "INFO Detecting Sync 73 of 168 syncs\n", "INFO:root:Detecting Sync 74 of 168 syncs\n", "INFO Detecting Sync 74 of 168 syncs\n", "INFO:root:Detecting Sync 75 of 168 syncs\n", "INFO Detecting Sync 75 of 168 syncs\n", "INFO:root:Detecting Sync 76 of 168 syncs\n", "INFO Detecting Sync 76 of 168 syncs\n", "INFO:root:Detecting Sync 77 of 168 syncs\n", "INFO Detecting Sync 77 of 168 syncs\n", "INFO:root:Detecting Sync 78 of 168 syncs\n", "INFO Detecting Sync 78 of 168 syncs\n", "INFO:root:Detecting Sync 79 of 168 syncs\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO Detecting Sync 79 of 168 syncs\n", "INFO:root:Detecting Sync 80 of 168 syncs\n", "INFO Detecting Sync 80 of 168 syncs\n", "INFO:root:Detecting Sync 81 of 168 syncs\n", "INFO Detecting Sync 81 of 168 syncs\n", "INFO:root:Detecting Sync 82 of 168 syncs\n", "INFO Detecting Sync 82 of 168 syncs\n", "INFO:root:Detecting Sync 83 of 168 syncs\n", "INFO Detecting Sync 83 of 168 syncs\n", "INFO:root:Detecting Sync 84 of 168 syncs\n", "INFO Detecting Sync 84 of 168 syncs\n", "INFO:root:Detecting Sync 85 of 168 syncs\n", "INFO Detecting Sync 85 of 168 syncs\n", "INFO:root:Detecting Sync 86 of 168 syncs\n", "INFO Detecting Sync 86 of 168 syncs\n", "INFO:root:Detecting Sync 87 of 168 syncs\n", "INFO Detecting Sync 87 of 168 syncs\n", "INFO:root:Detecting Sync 88 of 168 syncs\n", "INFO Detecting Sync 88 of 168 syncs\n", "INFO:root:Detecting Sync 89 of 168 syncs\n", "INFO Detecting Sync 89 of 168 syncs\n", "INFO:root:Detecting Sync 90 of 168 syncs\n", "INFO Detecting Sync 90 of 168 syncs\n", "INFO:root:Detecting Sync 91 of 168 syncs\n", "INFO Detecting Sync 91 of 168 syncs\n", "INFO:root:Detecting Sync 92 of 168 syncs\n", "INFO Detecting Sync 92 of 168 syncs\n", "INFO:root:Detecting Sync 93 of 168 syncs\n", "INFO Detecting Sync 93 of 168 syncs\n", "INFO:root:Detecting Sync 94 of 168 syncs\n", "INFO Detecting Sync 94 of 168 syncs\n", "INFO:root:Detecting Sync 95 of 168 syncs\n", "INFO Detecting Sync 95 of 168 syncs\n", "INFO:root:Detecting Sync 96 of 168 syncs\n", "INFO Detecting Sync 96 of 168 syncs\n", "INFO:root:Detecting Sync 97 of 168 syncs\n", "INFO Detecting Sync 97 of 168 syncs\n", "INFO:root:Detecting Sync 98 of 168 syncs\n", "INFO Detecting Sync 98 of 168 syncs\n", "INFO:root:Detecting Sync 99 of 168 syncs\n", "INFO Detecting Sync 99 of 168 syncs\n", "INFO:root:Detecting Sync 100 of 168 syncs\n", "INFO Detecting Sync 100 of 168 syncs\n", "INFO:root:Detecting Sync 101 of 168 syncs\n", "INFO Detecting Sync 101 of 168 syncs\n", "INFO:root:Detecting Sync 102 of 168 syncs\n", "INFO Detecting Sync 102 of 168 syncs\n", "INFO:root:Detecting Sync 103 of 168 syncs\n", "INFO Detecting Sync 103 of 168 syncs\n", "INFO:root:Detecting Sync 104 of 168 syncs\n", "INFO Detecting Sync 104 of 168 syncs\n", "INFO:root:Detecting Sync 105 of 168 syncs\n", "INFO Detecting Sync 105 of 168 syncs\n", "INFO:root:Detecting Sync 106 of 168 syncs\n", "INFO Detecting Sync 106 of 168 syncs\n", "INFO:root:Detecting Sync 107 of 168 syncs\n", "INFO Detecting Sync 107 of 168 syncs\n", "INFO:root:Detecting Sync 108 of 168 syncs\n", "INFO Detecting Sync 108 of 168 syncs\n", "INFO:root:Detecting Sync 109 of 168 syncs\n", "INFO Detecting Sync 109 of 168 syncs\n", "INFO:root:Detecting Sync 110 of 168 syncs\n", "INFO Detecting Sync 110 of 168 syncs\n", "INFO:root:Detecting Sync 111 of 168 syncs\n", "INFO Detecting Sync 111 of 168 syncs\n", "INFO:root:Detecting Sync 112 of 168 syncs\n", "INFO Detecting Sync 112 of 168 syncs\n", "INFO:root:Detecting Sync 113 of 168 syncs\n", "INFO Detecting Sync 113 of 168 syncs\n", "INFO:root:Detecting Sync 114 of 168 syncs\n", "INFO Detecting Sync 114 of 168 syncs\n", "INFO:root:Detecting Sync 115 of 168 syncs\n", "INFO Detecting Sync 115 of 168 syncs\n", "INFO:root:Detecting Sync 116 of 168 syncs\n", "INFO Detecting Sync 116 of 168 syncs\n", "INFO:root:Detecting Sync 117 of 168 syncs\n", "INFO Detecting Sync 117 of 168 syncs\n", "INFO:root:Detecting Sync 118 of 168 syncs\n", "INFO Detecting Sync 118 of 168 syncs\n", "INFO:root:Detecting Sync 119 of 168 syncs\n", "INFO Detecting Sync 119 of 168 syncs\n", "INFO:root:Detecting Sync 120 of 168 syncs\n", "INFO Detecting Sync 120 of 168 syncs\n", "INFO:root:Detecting Sync 121 of 168 syncs\n", "INFO Detecting Sync 121 of 168 syncs\n", "INFO:root:Detecting Sync 122 of 168 syncs\n", "INFO Detecting Sync 122 of 168 syncs\n", "INFO:root:Detecting Sync 123 of 168 syncs\n", "INFO Detecting Sync 123 of 168 syncs\n", "INFO:root:Detecting Sync 124 of 168 syncs\n", "INFO Detecting Sync 124 of 168 syncs\n", "INFO:root:Detecting Sync 125 of 168 syncs\n", "INFO Detecting Sync 125 of 168 syncs\n", "INFO:root:Detecting Sync 126 of 168 syncs\n", "INFO Detecting Sync 126 of 168 syncs\n", "INFO:root:Detecting Sync 127 of 168 syncs\n", "INFO Detecting Sync 127 of 168 syncs\n", "INFO:root:Detecting Sync 128 of 168 syncs\n", "INFO Detecting Sync 128 of 168 syncs\n", "INFO:root:Detecting Sync 129 of 168 syncs\n", "INFO Detecting Sync 129 of 168 syncs\n", "INFO:root:Detecting Sync 130 of 168 syncs\n", "INFO Detecting Sync 130 of 168 syncs\n", "INFO:root:Detecting Sync 131 of 168 syncs\n", "INFO Detecting Sync 131 of 168 syncs\n", "INFO:root:Detecting Sync 132 of 168 syncs\n", "INFO Detecting Sync 132 of 168 syncs\n", "INFO:root:Detecting Sync 133 of 168 syncs\n", "INFO Detecting Sync 133 of 168 syncs\n", "INFO:root:Detecting Sync 134 of 168 syncs\n", "INFO Detecting Sync 134 of 168 syncs\n", "INFO:root:Detecting Sync 135 of 168 syncs\n", "INFO Detecting Sync 135 of 168 syncs\n", "INFO:root:Detecting Sync 136 of 168 syncs\n", "INFO Detecting Sync 136 of 168 syncs\n", "INFO:root:Detecting Sync 137 of 168 syncs\n", "INFO Detecting Sync 137 of 168 syncs\n", "INFO:root:Detecting Sync 138 of 168 syncs\n", "INFO Detecting Sync 138 of 168 syncs\n", "INFO:root:Detecting Sync 139 of 168 syncs\n", "INFO Detecting Sync 139 of 168 syncs\n", "INFO:root:Detecting Sync 140 of 168 syncs\n", "INFO Detecting Sync 140 of 168 syncs\n", "INFO:root:Detecting Sync 141 of 168 syncs\n", "INFO Detecting Sync 141 of 168 syncs\n", "INFO:root:Detecting Sync 142 of 168 syncs\n", "INFO Detecting Sync 142 of 168 syncs\n", "INFO:root:Detecting Sync 143 of 168 syncs\n", "INFO Detecting Sync 143 of 168 syncs\n", "INFO:root:Detecting Sync 144 of 168 syncs\n", "INFO Detecting Sync 144 of 168 syncs\n", "INFO:root:Detecting Sync 145 of 168 syncs\n", "INFO Detecting Sync 145 of 168 syncs\n", "INFO:root:Detecting Sync 146 of 168 syncs\n", "INFO Detecting Sync 146 of 168 syncs\n", "INFO:root:Detecting Sync 147 of 168 syncs\n", "INFO Detecting Sync 147 of 168 syncs\n", "INFO:root:Detecting Sync 148 of 168 syncs\n", "INFO Detecting Sync 148 of 168 syncs\n", "INFO:root:Detecting Sync 149 of 168 syncs\n", "INFO Detecting Sync 149 of 168 syncs\n", "INFO:root:Detecting Sync 150 of 168 syncs\n", "INFO Detecting Sync 150 of 168 syncs\n", "INFO:root:Detecting Sync 151 of 168 syncs\n", "INFO Detecting Sync 151 of 168 syncs\n", "INFO:root:Detecting Sync 152 of 168 syncs\n", "INFO Detecting Sync 152 of 168 syncs\n", "INFO:root:Detecting Sync 153 of 168 syncs\n", "INFO Detecting Sync 153 of 168 syncs\n", "INFO:root:Detecting Sync 154 of 168 syncs\n", "INFO Detecting Sync 154 of 168 syncs\n", "INFO:root:Detecting Sync 155 of 168 syncs\n", "INFO Detecting Sync 155 of 168 syncs\n", "INFO:root:Detecting Sync 156 of 168 syncs\n", "INFO Detecting Sync 156 of 168 syncs\n", "INFO:root:Detecting Sync 157 of 168 syncs\n", "INFO Detecting Sync 157 of 168 syncs\n", "INFO:root:Detecting Sync 158 of 168 syncs\n", "INFO Detecting Sync 158 of 168 syncs\n", "INFO:root:Detecting Sync 159 of 168 syncs\n", "INFO Detecting Sync 159 of 168 syncs\n", "INFO:root:Detecting Sync 160 of 168 syncs\n", "INFO Detecting Sync 160 of 168 syncs\n", "INFO:root:Detecting Sync 161 of 168 syncs\n", "INFO Detecting Sync 161 of 168 syncs\n", "INFO:root:Detecting Sync 162 of 168 syncs\n", "INFO Detecting Sync 162 of 168 syncs\n", "INFO:root:Detecting Sync 163 of 168 syncs\n", "INFO Detecting Sync 163 of 168 syncs\n", "INFO:root:Detecting Sync 164 of 168 syncs\n", "INFO Detecting Sync 164 of 168 syncs\n", "INFO:root:Detecting Sync 165 of 168 syncs\n", "INFO Detecting Sync 165 of 168 syncs\n", "INFO:root:Detecting Sync 166 of 168 syncs\n", "INFO Detecting Sync 166 of 168 syncs\n", "INFO:root:Detecting Sync 167 of 168 syncs\n", "INFO Detecting Sync 167 of 168 syncs\n", "INFO:root:Detecting Sync 168 of 168 syncs\n", "INFO Detecting Sync 168 of 168 syncs\n", "INFO:root:Accurate SyncA detection complete\n", "INFO Accurate SyncA detection complete\n", "INFO:root:Beginning Accurate SyncB detection\n", "INFO Beginning Accurate SyncB detection\n", "INFO:root:Detecting Sync 1 of 168 syncs\n", "INFO Detecting Sync 1 of 168 syncs\n", "INFO:root:Detecting Sync 2 of 168 syncs\n", "INFO Detecting Sync 2 of 168 syncs\n", "INFO:root:Detecting Sync 3 of 168 syncs\n", "INFO Detecting Sync 3 of 168 syncs\n", "INFO:root:Detecting Sync 4 of 168 syncs\n", "INFO Detecting Sync 4 of 168 syncs\n", "INFO:root:Detecting Sync 5 of 168 syncs\n", "INFO Detecting Sync 5 of 168 syncs\n", "INFO:root:Detecting Sync 6 of 168 syncs\n", "INFO Detecting Sync 6 of 168 syncs\n", "INFO:root:Detecting Sync 7 of 168 syncs\n", "INFO Detecting Sync 7 of 168 syncs\n", "INFO:root:Detecting Sync 8 of 168 syncs\n", "INFO Detecting Sync 8 of 168 syncs\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Detecting Sync 9 of 168 syncs\n", "INFO Detecting Sync 9 of 168 syncs\n", "INFO:root:Detecting Sync 10 of 168 syncs\n", "INFO Detecting Sync 10 of 168 syncs\n", "INFO:root:Detecting Sync 11 of 168 syncs\n", "INFO Detecting Sync 11 of 168 syncs\n", "INFO:root:Detecting Sync 12 of 168 syncs\n", "INFO Detecting Sync 12 of 168 syncs\n", "INFO:root:Detecting Sync 13 of 168 syncs\n", "INFO Detecting Sync 13 of 168 syncs\n", "INFO:root:Detecting Sync 14 of 168 syncs\n", "INFO Detecting Sync 14 of 168 syncs\n", "INFO:root:Detecting Sync 15 of 168 syncs\n", "INFO Detecting Sync 15 of 168 syncs\n", "INFO:root:Detecting Sync 16 of 168 syncs\n", "INFO Detecting Sync 16 of 168 syncs\n", "INFO:root:Detecting Sync 17 of 168 syncs\n", "INFO Detecting Sync 17 of 168 syncs\n", "INFO:root:Detecting Sync 18 of 168 syncs\n", "INFO Detecting Sync 18 of 168 syncs\n", "INFO:root:Detecting Sync 19 of 168 syncs\n", "INFO Detecting Sync 19 of 168 syncs\n", "INFO:root:Detecting Sync 20 of 168 syncs\n", "INFO Detecting Sync 20 of 168 syncs\n", "INFO:root:Detecting Sync 21 of 168 syncs\n", "INFO Detecting Sync 21 of 168 syncs\n", "INFO:root:Detecting Sync 22 of 168 syncs\n", "INFO Detecting Sync 22 of 168 syncs\n", "INFO:root:Detecting Sync 23 of 168 syncs\n", "INFO Detecting Sync 23 of 168 syncs\n", "INFO:root:Detecting Sync 24 of 168 syncs\n", "INFO Detecting Sync 24 of 168 syncs\n", "INFO:root:Detecting Sync 25 of 168 syncs\n", "INFO Detecting Sync 25 of 168 syncs\n", "INFO:root:Detecting Sync 26 of 168 syncs\n", "INFO Detecting Sync 26 of 168 syncs\n", "INFO:root:Detecting Sync 27 of 168 syncs\n", "INFO Detecting Sync 27 of 168 syncs\n", "INFO:root:Detecting Sync 28 of 168 syncs\n", "INFO Detecting Sync 28 of 168 syncs\n", "INFO:root:Detecting Sync 29 of 168 syncs\n", "INFO Detecting Sync 29 of 168 syncs\n", "INFO:root:Detecting Sync 30 of 168 syncs\n", "INFO Detecting Sync 30 of 168 syncs\n", "INFO:root:Detecting Sync 31 of 168 syncs\n", "INFO Detecting Sync 31 of 168 syncs\n", "INFO:root:Detecting Sync 32 of 168 syncs\n", "INFO Detecting Sync 32 of 168 syncs\n", "INFO:root:Detecting Sync 33 of 168 syncs\n", "INFO Detecting Sync 33 of 168 syncs\n", "INFO:root:Detecting Sync 34 of 168 syncs\n", "INFO Detecting Sync 34 of 168 syncs\n", "INFO:root:Detecting Sync 35 of 168 syncs\n", "INFO Detecting Sync 35 of 168 syncs\n", "INFO:root:Detecting Sync 36 of 168 syncs\n", "INFO Detecting Sync 36 of 168 syncs\n", "INFO:root:Detecting Sync 37 of 168 syncs\n", "INFO Detecting Sync 37 of 168 syncs\n", "INFO:root:Detecting Sync 38 of 168 syncs\n", "INFO Detecting Sync 38 of 168 syncs\n", "INFO:root:Detecting Sync 39 of 168 syncs\n", "INFO Detecting Sync 39 of 168 syncs\n", "INFO:root:Detecting Sync 40 of 168 syncs\n", "INFO Detecting Sync 40 of 168 syncs\n", "INFO:root:Detecting Sync 41 of 168 syncs\n", "INFO Detecting Sync 41 of 168 syncs\n", "INFO:root:Detecting Sync 42 of 168 syncs\n", "INFO Detecting Sync 42 of 168 syncs\n", "INFO:root:Detecting Sync 43 of 168 syncs\n", "INFO Detecting Sync 43 of 168 syncs\n", "INFO:root:Detecting Sync 44 of 168 syncs\n", "INFO Detecting Sync 44 of 168 syncs\n", "INFO:root:Detecting Sync 45 of 168 syncs\n", "INFO Detecting Sync 45 of 168 syncs\n", "INFO:root:Detecting Sync 46 of 168 syncs\n", "INFO Detecting Sync 46 of 168 syncs\n", "INFO:root:Detecting Sync 47 of 168 syncs\n", "INFO Detecting Sync 47 of 168 syncs\n", "INFO:root:Detecting Sync 48 of 168 syncs\n", "INFO Detecting Sync 48 of 168 syncs\n", "INFO:root:Detecting Sync 49 of 168 syncs\n", "INFO Detecting Sync 49 of 168 syncs\n", "INFO:root:Detecting Sync 50 of 168 syncs\n", "INFO Detecting Sync 50 of 168 syncs\n", "INFO:root:Detecting Sync 51 of 168 syncs\n", "INFO Detecting Sync 51 of 168 syncs\n", "INFO:root:Detecting Sync 52 of 168 syncs\n", "INFO Detecting Sync 52 of 168 syncs\n", "INFO:root:Detecting Sync 53 of 168 syncs\n", "INFO Detecting Sync 53 of 168 syncs\n", "INFO:root:Detecting Sync 54 of 168 syncs\n", "INFO Detecting Sync 54 of 168 syncs\n", "INFO:root:Detecting Sync 55 of 168 syncs\n", "INFO Detecting Sync 55 of 168 syncs\n", "INFO:root:Detecting Sync 56 of 168 syncs\n", "INFO Detecting Sync 56 of 168 syncs\n", "INFO:root:Detecting Sync 57 of 168 syncs\n", "INFO Detecting Sync 57 of 168 syncs\n", "INFO:root:Detecting Sync 58 of 168 syncs\n", "INFO Detecting Sync 58 of 168 syncs\n", "INFO:root:Detecting Sync 59 of 168 syncs\n", "INFO Detecting Sync 59 of 168 syncs\n", "INFO:root:Detecting Sync 60 of 168 syncs\n", "INFO Detecting Sync 60 of 168 syncs\n", "INFO:root:Detecting Sync 61 of 168 syncs\n", "INFO Detecting Sync 61 of 168 syncs\n", "INFO:root:Detecting Sync 62 of 168 syncs\n", "INFO Detecting Sync 62 of 168 syncs\n", "INFO:root:Detecting Sync 63 of 168 syncs\n", "INFO Detecting Sync 63 of 168 syncs\n", "INFO:root:Detecting Sync 64 of 168 syncs\n", "INFO Detecting Sync 64 of 168 syncs\n", "INFO:root:Detecting Sync 65 of 168 syncs\n", "INFO Detecting Sync 65 of 168 syncs\n", "INFO:root:Detecting Sync 66 of 168 syncs\n", "INFO Detecting Sync 66 of 168 syncs\n", "INFO:root:Detecting Sync 67 of 168 syncs\n", "INFO Detecting Sync 67 of 168 syncs\n", "INFO:root:Detecting Sync 68 of 168 syncs\n", "INFO Detecting Sync 68 of 168 syncs\n", "INFO:root:Detecting Sync 69 of 168 syncs\n", "INFO Detecting Sync 69 of 168 syncs\n", "INFO:root:Detecting Sync 70 of 168 syncs\n", "INFO Detecting Sync 70 of 168 syncs\n", "INFO:root:Detecting Sync 71 of 168 syncs\n", "INFO Detecting Sync 71 of 168 syncs\n", "INFO:root:Detecting Sync 72 of 168 syncs\n", "INFO Detecting Sync 72 of 168 syncs\n", "INFO:root:Detecting Sync 73 of 168 syncs\n", "INFO Detecting Sync 73 of 168 syncs\n", "INFO:root:Detecting Sync 74 of 168 syncs\n", "INFO Detecting Sync 74 of 168 syncs\n", "INFO:root:Detecting Sync 75 of 168 syncs\n", "INFO Detecting Sync 75 of 168 syncs\n", "INFO:root:Detecting Sync 76 of 168 syncs\n", "INFO Detecting Sync 76 of 168 syncs\n", "INFO:root:Detecting Sync 77 of 168 syncs\n", "INFO Detecting Sync 77 of 168 syncs\n", "INFO:root:Detecting Sync 78 of 168 syncs\n", "INFO Detecting Sync 78 of 168 syncs\n", "INFO:root:Detecting Sync 79 of 168 syncs\n", "INFO Detecting Sync 79 of 168 syncs\n", "INFO:root:Detecting Sync 80 of 168 syncs\n", "INFO Detecting Sync 80 of 168 syncs\n", "INFO:root:Detecting Sync 81 of 168 syncs\n", "INFO Detecting Sync 81 of 168 syncs\n", "INFO:root:Detecting Sync 82 of 168 syncs\n", "INFO Detecting Sync 82 of 168 syncs\n", "INFO:root:Detecting Sync 83 of 168 syncs\n", "INFO Detecting Sync 83 of 168 syncs\n", "INFO:root:Detecting Sync 84 of 168 syncs\n", "INFO Detecting Sync 84 of 168 syncs\n", "INFO:root:Detecting Sync 85 of 168 syncs\n", "INFO Detecting Sync 85 of 168 syncs\n", "INFO:root:Detecting Sync 86 of 168 syncs\n", "INFO Detecting Sync 86 of 168 syncs\n", "INFO:root:Detecting Sync 87 of 168 syncs\n", "INFO Detecting Sync 87 of 168 syncs\n", "INFO:root:Detecting Sync 88 of 168 syncs\n", "INFO Detecting Sync 88 of 168 syncs\n", "INFO:root:Detecting Sync 89 of 168 syncs\n", "INFO Detecting Sync 89 of 168 syncs\n", "INFO:root:Detecting Sync 90 of 168 syncs\n", "INFO Detecting Sync 90 of 168 syncs\n", "INFO:root:Detecting Sync 91 of 168 syncs\n", "INFO Detecting Sync 91 of 168 syncs\n", "INFO:root:Detecting Sync 92 of 168 syncs\n", "INFO Detecting Sync 92 of 168 syncs\n", "INFO:root:Detecting Sync 93 of 168 syncs\n", "INFO Detecting Sync 93 of 168 syncs\n", "INFO:root:Detecting Sync 94 of 168 syncs\n", "INFO Detecting Sync 94 of 168 syncs\n", "INFO:root:Detecting Sync 95 of 168 syncs\n", "INFO Detecting Sync 95 of 168 syncs\n", "INFO:root:Detecting Sync 96 of 168 syncs\n", "INFO Detecting Sync 96 of 168 syncs\n", "INFO:root:Detecting Sync 97 of 168 syncs\n", "INFO Detecting Sync 97 of 168 syncs\n", "INFO:root:Detecting Sync 98 of 168 syncs\n", "INFO Detecting Sync 98 of 168 syncs\n", "INFO:root:Detecting Sync 99 of 168 syncs\n", "INFO Detecting Sync 99 of 168 syncs\n", "INFO:root:Detecting Sync 100 of 168 syncs\n", "INFO Detecting Sync 100 of 168 syncs\n", "INFO:root:Detecting Sync 101 of 168 syncs\n", "INFO Detecting Sync 101 of 168 syncs\n", "INFO:root:Detecting Sync 102 of 168 syncs\n", "INFO Detecting Sync 102 of 168 syncs\n", "INFO:root:Detecting Sync 103 of 168 syncs\n", "INFO Detecting Sync 103 of 168 syncs\n", "INFO:root:Detecting Sync 104 of 168 syncs\n", "INFO Detecting Sync 104 of 168 syncs\n", "INFO:root:Detecting Sync 105 of 168 syncs\n", "INFO Detecting Sync 105 of 168 syncs\n", "INFO:root:Detecting Sync 106 of 168 syncs\n", "INFO Detecting Sync 106 of 168 syncs\n", "INFO:root:Detecting Sync 107 of 168 syncs\n", "INFO Detecting Sync 107 of 168 syncs\n", "INFO:root:Detecting Sync 108 of 168 syncs\n", "INFO Detecting Sync 108 of 168 syncs\n", "INFO:root:Detecting Sync 109 of 168 syncs\n", "INFO Detecting Sync 109 of 168 syncs\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:Detecting Sync 110 of 168 syncs\n", "INFO Detecting Sync 110 of 168 syncs\n", "INFO:root:Detecting Sync 111 of 168 syncs\n", "INFO Detecting Sync 111 of 168 syncs\n", "INFO:root:Detecting Sync 112 of 168 syncs\n", "INFO Detecting Sync 112 of 168 syncs\n", "INFO:root:Detecting Sync 113 of 168 syncs\n", "INFO Detecting Sync 113 of 168 syncs\n", "INFO:root:Detecting Sync 114 of 168 syncs\n", "INFO Detecting Sync 114 of 168 syncs\n", "INFO:root:Detecting Sync 115 of 168 syncs\n", "INFO Detecting Sync 115 of 168 syncs\n", "INFO:root:Detecting Sync 116 of 168 syncs\n", "INFO Detecting Sync 116 of 168 syncs\n", "INFO:root:Detecting Sync 117 of 168 syncs\n", "INFO Detecting Sync 117 of 168 syncs\n", "INFO:root:Detecting Sync 118 of 168 syncs\n", "INFO Detecting Sync 118 of 168 syncs\n", "INFO:root:Detecting Sync 119 of 168 syncs\n", "INFO Detecting Sync 119 of 168 syncs\n", "INFO:root:Detecting Sync 120 of 168 syncs\n", "INFO Detecting Sync 120 of 168 syncs\n", "INFO:root:Detecting Sync 121 of 168 syncs\n", "INFO Detecting Sync 121 of 168 syncs\n", "INFO:root:Detecting Sync 122 of 168 syncs\n", "INFO Detecting Sync 122 of 168 syncs\n", "INFO:root:Detecting Sync 123 of 168 syncs\n", "INFO Detecting Sync 123 of 168 syncs\n", "INFO:root:Detecting Sync 124 of 168 syncs\n", "INFO Detecting Sync 124 of 168 syncs\n", "INFO:root:Detecting Sync 125 of 168 syncs\n", "INFO Detecting Sync 125 of 168 syncs\n", "INFO:root:Detecting Sync 126 of 168 syncs\n", "INFO Detecting Sync 126 of 168 syncs\n", "INFO:root:Detecting Sync 127 of 168 syncs\n", "INFO Detecting Sync 127 of 168 syncs\n", "INFO:root:Detecting Sync 128 of 168 syncs\n", "INFO Detecting Sync 128 of 168 syncs\n", "INFO:root:Detecting Sync 129 of 168 syncs\n", "INFO Detecting Sync 129 of 168 syncs\n", "INFO:root:Detecting Sync 130 of 168 syncs\n", "INFO Detecting Sync 130 of 168 syncs\n", "INFO:root:Detecting Sync 131 of 168 syncs\n", "INFO Detecting Sync 131 of 168 syncs\n", "INFO:root:Detecting Sync 132 of 168 syncs\n", "INFO Detecting Sync 132 of 168 syncs\n", "INFO:root:Detecting Sync 133 of 168 syncs\n", "INFO Detecting Sync 133 of 168 syncs\n", "INFO:root:Detecting Sync 134 of 168 syncs\n", "INFO Detecting Sync 134 of 168 syncs\n", "INFO:root:Detecting Sync 135 of 168 syncs\n", "INFO Detecting Sync 135 of 168 syncs\n", "INFO:root:Detecting Sync 136 of 168 syncs\n", "INFO Detecting Sync 136 of 168 syncs\n", "INFO:root:Detecting Sync 137 of 168 syncs\n", "INFO Detecting Sync 137 of 168 syncs\n", "INFO:root:Detecting Sync 138 of 168 syncs\n", "INFO Detecting Sync 138 of 168 syncs\n", "INFO:root:Detecting Sync 139 of 168 syncs\n", "INFO Detecting Sync 139 of 168 syncs\n", "INFO:root:Detecting Sync 140 of 168 syncs\n", "INFO Detecting Sync 140 of 168 syncs\n", "INFO:root:Detecting Sync 141 of 168 syncs\n", "INFO Detecting Sync 141 of 168 syncs\n", "INFO:root:Detecting Sync 142 of 168 syncs\n", "INFO Detecting Sync 142 of 168 syncs\n", "INFO:root:Detecting Sync 143 of 168 syncs\n", "INFO Detecting Sync 143 of 168 syncs\n", "INFO:root:Detecting Sync 144 of 168 syncs\n", "INFO Detecting Sync 144 of 168 syncs\n", "INFO:root:Detecting Sync 145 of 168 syncs\n", "INFO Detecting Sync 145 of 168 syncs\n", "INFO:root:Detecting Sync 146 of 168 syncs\n", "INFO Detecting Sync 146 of 168 syncs\n", "INFO:root:Detecting Sync 147 of 168 syncs\n", "INFO Detecting Sync 147 of 168 syncs\n", "INFO:root:Detecting Sync 148 of 168 syncs\n", "INFO Detecting Sync 148 of 168 syncs\n", "INFO:root:Detecting Sync 149 of 168 syncs\n", "INFO Detecting Sync 149 of 168 syncs\n", "INFO:root:Detecting Sync 150 of 168 syncs\n", "INFO Detecting Sync 150 of 168 syncs\n", "INFO:root:Detecting Sync 151 of 168 syncs\n", "INFO Detecting Sync 151 of 168 syncs\n", "INFO:root:Detecting Sync 152 of 168 syncs\n", "INFO Detecting Sync 152 of 168 syncs\n", "INFO:root:Detecting Sync 153 of 168 syncs\n", "INFO Detecting Sync 153 of 168 syncs\n", "INFO:root:Detecting Sync 154 of 168 syncs\n", "INFO Detecting Sync 154 of 168 syncs\n", "INFO:root:Detecting Sync 155 of 168 syncs\n", "INFO Detecting Sync 155 of 168 syncs\n", "INFO:root:Detecting Sync 156 of 168 syncs\n", "INFO Detecting Sync 156 of 168 syncs\n", "INFO:root:Detecting Sync 157 of 168 syncs\n", "INFO Detecting Sync 157 of 168 syncs\n", "INFO:root:Detecting Sync 158 of 168 syncs\n", "INFO Detecting Sync 158 of 168 syncs\n", "INFO:root:Detecting Sync 159 of 168 syncs\n", "INFO Detecting Sync 159 of 168 syncs\n", "INFO:root:Detecting Sync 160 of 168 syncs\n", "INFO Detecting Sync 160 of 168 syncs\n", "INFO:root:Detecting Sync 161 of 168 syncs\n", "INFO Detecting Sync 161 of 168 syncs\n", "INFO:root:Detecting Sync 162 of 168 syncs\n", "INFO Detecting Sync 162 of 168 syncs\n", "INFO:root:Detecting Sync 163 of 168 syncs\n", "INFO Detecting Sync 163 of 168 syncs\n", "INFO:root:Detecting Sync 164 of 168 syncs\n", "INFO Detecting Sync 164 of 168 syncs\n", "INFO:root:Detecting Sync 165 of 168 syncs\n", "INFO Detecting Sync 165 of 168 syncs\n", "INFO:root:Detecting Sync 166 of 168 syncs\n", "INFO Detecting Sync 166 of 168 syncs\n", "INFO:root:Detecting Sync 167 of 168 syncs\n", "INFO Detecting Sync 167 of 168 syncs\n", "INFO:root:Detecting Sync 168 of 168 syncs\n", "INFO Detecting Sync 168 of 168 syncs\n", "INFO:root:Accurate SyncB detection complete\n", "INFO Accurate SyncB detection complete\n" ] } ], "source": [ "sigsrc = source.IQwav(\"D:\\\\noaa\\\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav\")\n", "noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET)\n", "syncs = noaaObj.getAccurateSync\n", "syncA2, syncB2 = syncs" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nyFH9KPkAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(np.diff(syncA2))\n", "plt.plot(np.diff(syncB2))\n", "plt.show()" ] } ], "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }