#!/usr/bin/env python # coding: utf-8 # ## Experiment 7 - Scipy's correlate vs. norm correlate # The aim of this experiment is to determine which correlate is better: scipy's correlate or norm correlate # In[1]: import os, sys nb_dir = os.path.split(os.getcwd())[0] if nb_dir not in sys.path: sys.path.append(nb_dir) get_ipython().run_line_magic('matplotlib', 'inline') get_ipython().run_line_magic('load_ext', 'autoreload') get_ipython().run_line_magic('autoreload', '2') # In[3]: from directdemod import source, chunker, comm, constants, filters, fmDemod, sink, amDemod, noaa, log import numpy as np import sys, getopt, logging import matplotlib.pyplot as plt log.log(console = False) # To get syncs from a file we do, # In[4]: sigsrc = source.IQwav("D:\\noaa\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav") noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET) syncs = noaaObj.getAccurateSync # In[11]: syncA, syncB = syncs print("SyncA:",syncA) print("SyncB:",syncB) print() print("diffSyncA:",np.diff(syncA)) print("diffSyncB:",np.diff(syncB)) print() print("abs(diffSyncA-1024000):", np.abs(np.diff(syncA) - 1024000)) print("abs(diffSyncB-1024000):", np.abs(np.diff(syncB) - 1024000)) print() print("sum(abs(diffSyncA-1024000)):", np.sum(np.abs(np.diff(syncA) - 1024000))) print("sum(abs(diffSyncB-1024000)):", np.sum(np.abs(np.diff(syncB) - 1024000))) # ## Method # # Experimental environment will be: # same file and same everything except (correlate function, filter before correlation, needle type) # # EXP A # 2 runs: variables [1st with norm correlate, 2nd with scipys correlate] # # constants [hamming filter of width 492, needle varies from 11 to 244] # In[7]: sigsrc = source.IQwav("D:\\noaa\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav") noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET) syncs = noaaObj.getAccurateSync syncA1, syncB1 = syncs # In[9]: sigsrc = source.IQwav("D:\\noaa\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav") noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET) syncs = noaaObj.getAccurateSync syncA2, syncB2 = syncs # In[10]: print("SyncA1:",syncA1) print("SyncB1:",syncB1) print() print("diffSyncA1:",np.diff(syncA1)) print("diffSyncB1:",np.diff(syncB1)) print() print("abs(diffSyncA1-1024000):", np.abs(np.diff(syncA1) - 1024000)) print("abs(diffSyncB1-1024000):", np.abs(np.diff(syncB1) - 1024000)) print() print("sum(abs(diffSyncA1-1024000)):", np.sum(np.abs(np.diff(syncA1) - 1024000))) print("sum(abs(diffSyncB1-1024000)):", np.sum(np.abs(np.diff(syncB1) - 1024000))) print() print("SyncA2:",syncA2) print("SyncB2:",syncB2) print() print("diffSyncA2:",np.diff(syncA2)) print("diffSyncB2:",np.diff(syncB2)) print() print("abs(diffSyncA2-1024000):", np.abs(np.diff(syncA2) - 1024000)) print("abs(diffSyncB2-1024000):", np.abs(np.diff(syncB2) - 1024000)) print() print("sum(abs(diffSyncA2-1024000)):", np.sum(np.abs(np.diff(syncA2) - 1024000))) print("sum(abs(diffSyncB2-1024000)):", np.sum(np.abs(np.diff(syncB2) - 1024000))) print() print("diffSyncA1-diffSyncA2:", [a-b for a,b in zip(np.diff(syncA1),np.diff(syncA2))]) print("diffSyncB1-diffSyncB2:", [a-b for a,b in zip(np.diff(syncB1),np.diff(syncB2))]) print() print("IMP RESULTS") print() print("NORM CORR:") print("\tMax Deviation in diffSyncA1", np.max(np.diff(syncA1))-np.min(np.diff(syncA1))) print("\tMax Deviation in diffSyncB1", np.max(np.diff(syncB1))-np.min(np.diff(syncB1))) print("\tCumulative deviation from ideal SyncA1", np.sum(np.abs(np.diff(syncA1) - 1024000))) print("\tCumulative deviation from ideal SyncB1", np.sum(np.abs(np.diff(syncB1) - 1024000))) print() print("SCIPY:") print("\tMax Deviation in diffSyncA2", np.max(np.diff(syncA2))-np.min(np.diff(syncA2))) print("\tMax Deviation in diffSyncB2", np.max(np.diff(syncB2))-np.min(np.diff(syncB2))) print("\tCumulative deviation from ideal SyncA2", np.sum(np.abs(np.diff(syncA2) - 1024000))) print("\tCumulative deviation from ideal SyncB2", np.sum(np.abs(np.diff(syncB2) - 1024000))) # ### Result: Norm Corr wins # - min deviation from ideal # - min deviation # - Scipys correlate doesn't seem to work with this needle # # EXP B # 2 runs: variables [1st with norm correlate, 2nd with scipys correlate] # # constants [hamming filter of width 492, needle varies from -0.5 to 0.5] # In[13]: sigsrc = source.IQwav("D:\\noaa\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav") noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET) syncs = noaaObj.getAccurateSync syncA1, syncB1 = syncs # In[12]: sigsrc = source.IQwav("D:\\noaa\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav") noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET) syncs = noaaObj.getAccurateSync syncA2, syncB2 = syncs # In[14]: print("SyncA1:",syncA1) print("SyncB1:",syncB1) print() print("diffSyncA1:",np.diff(syncA1)) print("diffSyncB1:",np.diff(syncB1)) print() print("abs(diffSyncA1-1024000):", np.abs(np.diff(syncA1) - 1024000)) print("abs(diffSyncB1-1024000):", np.abs(np.diff(syncB1) - 1024000)) print() print("sum(abs(diffSyncA1-1024000)):", np.sum(np.abs(np.diff(syncA1) - 1024000))) print("sum(abs(diffSyncB1-1024000)):", np.sum(np.abs(np.diff(syncB1) - 1024000))) print() print("SyncA2:",syncA2) print("SyncB2:",syncB2) print() print("diffSyncA2:",np.diff(syncA2)) print("diffSyncB2:",np.diff(syncB2)) print() print("abs(diffSyncA2-1024000):", np.abs(np.diff(syncA2) - 1024000)) print("abs(diffSyncB2-1024000):", np.abs(np.diff(syncB2) - 1024000)) print() print("sum(abs(diffSyncA2-1024000)):", np.sum(np.abs(np.diff(syncA2) - 1024000))) print("sum(abs(diffSyncB2-1024000)):", np.sum(np.abs(np.diff(syncB2) - 1024000))) print() print("diffSyncA1-diffSyncA2:", [a-b for a,b in zip(np.diff(syncA1),np.diff(syncA2))]) print("diffSyncB1-diffSyncB2:", [a-b for a,b in zip(np.diff(syncB1),np.diff(syncB2))]) print() print("IMP RESULTS") print() print("NORM CORR:") print("\tMax Deviation in diffSyncA1", np.max(np.diff(syncA1))-np.min(np.diff(syncA1))) print("\tMax Deviation in diffSyncB1", np.max(np.diff(syncB1))-np.min(np.diff(syncB1))) print("\tCumulative deviation from ideal SyncA1", np.sum(np.abs(np.diff(syncA1) - 1024000))) print("\tCumulative deviation from ideal SyncB1", np.sum(np.abs(np.diff(syncB1) - 1024000))) print() print("SCIPY:") print("\tMax Deviation in diffSyncA2", np.max(np.diff(syncA2))-np.min(np.diff(syncA2))) print("\tMax Deviation in diffSyncB2", np.max(np.diff(syncB2))-np.min(np.diff(syncB2))) print("\tCumulative deviation from ideal SyncA2", np.sum(np.abs(np.diff(syncA2) - 1024000))) print("\tCumulative deviation from ideal SyncB2", np.sum(np.abs(np.diff(syncB2) - 1024000))) # ### Result: Scipy wins # - min deviation from ideal in scipy # - min deviation in scipy # # Final Result # # 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 # In[16]: sigsrc = source.IQwav("D:\\noaa\\station1_yagi_SDRSharp_20170312_060959Z_137650kHz_IQ.wav") noaaObj = noaa.noaa(sigsrc, constants.IQ_FREQOFFSET) syncs = noaaObj.getAccurateSync syncA2, syncB2 = syncs # In[18]: plt.plot(np.diff(syncA2)) plt.plot(np.diff(syncB2)) plt.show()