diff options
Diffstat (limited to 'sync-measurement.ipynb')
-rw-r--r-- | sync-measurement.ipynb | 345 |
1 files changed, 173 insertions, 172 deletions
diff --git a/sync-measurement.ipynb b/sync-measurement.ipynb index 5b713e7..0221c3c 100644 --- a/sync-measurement.ipynb +++ b/sync-measurement.ipynb @@ -8,8 +8,10 @@ "source": [ "%matplotlib inline\n", "import numpy as np\n", + "import time;\n", "from scipy import signal\n", "import matplotlib.pyplot as plt\n", + "import matplotlib.colors as mpcol\n", "import src.dab_util as du" ] }, @@ -30,7 +32,13 @@ "metadata": {}, "outputs": [], "source": [ - "sg.gen_ramps(amplitudes=np.linspace(0.001, 0.95, num = 20))" + "path_in = \"./input.dat\"\n", + "path_out = \"./output.dat\"\n", + "a_max = 0.95\n", + "n_steps = 64\n", + "amps = np.linspace(0.001, a_max, num = n_steps)\n", + "txgains = (50, 55, 60, 65, 70, 75, 81, 82, 83, 84, 85, 86, 87, 88, 89)\n", + "rxgains = (50, 40, 40, 25, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20)" ] }, { @@ -39,8 +47,7 @@ "metadata": {}, "outputs": [], "source": [ - "a_in = np.fromfile(\"./input.dat\", dtype=np.complex64)\n", - "a_out = np.fromfile(\"./output.dat\", dtype=np.complex64)" + "from grc.amam_amap import amam_amap" ] }, { @@ -49,21 +56,7 @@ "metadata": {}, "outputs": [], "source": [ - "def crop_signal(signal, n_window = 1000, n_zeros = 50000, debug = False):\n", - " #signal = signal[-10:-1]\n", - " mag = abs(signal)\n", - " window = np.ones(n_window) / float(n_window)\n", - " mag = scipy.signal.convolve(window, mag)\n", - " mag = scipy.signal.convolve(window, mag)\n", - " thr = 0.01 * np.max(mag)\n", - " idx_start = np.argmax(mag > thr)\n", - " idx_end = mag.shape[0] - np.argmax(np.flipud(mag > thr))\n", - " if debug:\n", - " plt.plot(mag < thr)\n", - " plt.plot((idx_start,idx_start), (0,0.1), color='g', linewidth=2)\n", - " plt.plot((idx_end,idx_end), (0,0.1), color='r', linewidth=2)\n", - " signal = signal[idx_start - n_zeros: idx_end + n_zeros]\n", - " return signal" + "top = amam_amap()\n" ] }, { @@ -72,7 +65,7 @@ "metadata": {}, "outputs": [], "source": [ - "a_in = du.crop_signal(a_in)" + "sg.gen_ramps(amplitudes=amps)" ] }, { @@ -81,7 +74,31 @@ "metadata": {}, "outputs": [], "source": [ - "a_out = du.crop_signal(a_out)" + "def fftlag(signal_original, signal_rec):\n", + " \"\"\"\n", + " Efficient way to find lag between two signals\n", + " Args:\n", + " signal_original: The signal that has been sent\n", + " signal_rec: The signal that has been recored\n", + " \"\"\"\n", + " c = np.flipud(signal.fftconvolve(signal_original,np.flipud(signal_rec)))\n", + " #plt.plot(c)\n", + " return np.argmax(c) - signal_original.shape[0] + 1\n", + " \n", + "#pattern = np.array([-2,2,-1,+3,-5,+7])\n", + "#delays = [0,1,2,3,4]\n", + "#padding = [0]\n", + "#padding_fil = [0]\n", + "#\n", + "#res = []\n", + "#for d in delays:\n", + "# for p in padding:\n", + "# for p2 in padding_fil:\n", + "# a = np.concatenate((pattern, np.zeros(p2)))\n", + "# b = np.concatenate((np.zeros(d), pattern, np.zeros(p)))\n", + "# res.append((d,conv(a,b)))\n", + "#res = np.array(res)\n", + "#plt.plot(zip(*res)[0], zip(*res)[1], 'p')" ] }, { @@ -96,18 +113,6 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "#plt.plot(a_in.real[780000 + 230000:2000000]+1, color='b');\n", - "#plt.plot(a_out.real[780000:2000000], color='g');\n", - "plt.plot(a_in.real+1, color='b');\n", - "plt.plot(a_out.real, color='g');" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], "source": [] }, { @@ -116,70 +121,15 @@ "metadata": {}, "outputs": [], "source": [ - "def lagcorr(x,y,lag=None,verbose=True):\n", - " '''Compute lead-lag correlations between 2 time series.\n", - "\n", - " <x>,<y>: 1-D time series.\n", - " <lag>: lag option, could take different forms of <lag>:\n", - " if 0 or None, compute ordinary correlation and p-value;\n", - " if positive integer, compute lagged correlation with lag\n", - " upto <lag>;\n", - " if negative integer, compute lead correlation with lead\n", - " upto <-lag>;\n", - " if pass in an list or tuple or array of integers, compute \n", - " lead/lag correlations at different leads/lags.\n", - "\n", - " Note: when talking about lead/lag, uses <y> as a reference.\n", - " Therefore positive lag means <x> lags <y> by <lag>, computation is\n", - " done by shifting <x> to the left hand side by <lag> with respect to\n", - " <y>.\n", - " Similarly negative lag means <x> leads <y> by <lag>, computation is\n", - " done by shifting <x> to the right hand side by <lag> with respect to\n", - " <y>.\n", - "\n", - " Return <result>: a (n*2) array, with 1st column the correlation \n", - " coefficients, 2nd column correpsonding p values.\n", - "\n", - " Currently only works for 1-D arrays.\n", - " '''\n", - "\n", - " import numpy\n", - " from scipy.stats import pearsonr\n", - "\n", - " if len(x)!=len(y):\n", - " raise Exception('Input variables of different lengths.')\n", - "\n", - " #--------Unify types of <lag>-------------\n", - " if numpy.isscalar(lag):\n", - " if abs(lag)>=len(x):\n", - " raise Exception('Maximum lag equal or larger than array.')\n", - " if lag<0:\n", - " lag=-numpy.arange(abs(lag)+1)\n", - " elif lag==0:\n", - " lag=[0,]\n", - " else:\n", - " lag=numpy.arange(lag+1) \n", - " elif lag is None:\n", - " lag=[0,]\n", - " else:\n", - " lag=numpy.asarray(lag)\n", - "\n", - " #-------Loop over lags---------------------\n", - " result=[]\n", - " if verbose:\n", - " print '\\n#<lagcorr>: Computing lagged-correlations at lags:',lag\n", - "\n", - " for ii in lag:\n", - " if ii<0:\n", - " result.append(pearsonr(x[:ii],y[-ii:]))\n", - " elif ii==0:\n", - " result.append(pearsonr(x,y))\n", - " elif ii>0:\n", - " result.append(pearsonr(x[ii:],y[:-ii]))\n", - "\n", - " result=numpy.asarray(result)\n", + "def get_amp_ratio(ampl_1, ampl_2, a_out_abs, a_in_abs):\n", + " idxs = (a_in_abs > ampl_1) & (a_in_abs < ampl_2)\n", + " ratio = a_out_abs[idxs] / a_in_abs[idxs]\n", + " return ratio.mean(), ratio.var()\n", "\n", - " return result" + "def get_phase(ampl_1, ampl_2, a_out, a_in):\n", + " idxs = (np.abs(a_in) > ampl_1) & (np.abs(a_in) < ampl_2)\n", + " ratio = np.angle(a_out[idxs], deg=True) - np.angle(a_in[idxs], deg=True)\n", + " return ratio.mean(), ratio.var()" ] }, { @@ -188,11 +138,52 @@ "metadata": {}, "outputs": [], "source": [ - "l = min(a_out.shape[0], a_in.shape[0])\n", - "a_out = a_out[0:l]\n", - "a_in = a_in[0:l]\n", - "\n", - "c = lagcorr(abs(a_out), abs(a_in), 1000)[:,0]" + "def extract_measurement(a_in, a_out, db, a_max, n_steps, debug = False):\n", + " a_in = du.crop_signal(a_in)\n", + " a_out = du.crop_signal(a_out)\n", + " \n", + " if debug:\n", + " plt.plot(np.abs(a_in.real) + 1, color='b');\n", + " plt.plot(np.abs(a_out.real), color='g');\n", + " plt.show()\n", + " \n", + " #l = min(a_out.shape[0], a_in.shape[0])\n", + " #a_out = a_out[0:l]\n", + " #a_in = a_in[0:l]\n", + " \n", + " #c = du.lagcorr(np.abs(a_out), np.abs(a_in), 120000)[:,0]\n", + " #c = signal.fftconvolve(a_in, a_out) - a_out.shape[0]\n", + " delay = fftlag(np.abs(a_in), np.abs(a_out))\n", + " \n", + " \n", + " #delay = np.argmax(c)\n", + " a_out = a_out[delay - 1:]\n", + " \n", + " l = min(a_out.shape[0], a_in.shape[0])\n", + " a_out = a_out[0:l]\n", + " a_in = a_in[0:l]\n", + " \n", + " if debug:\n", + " print (\"delay = \" + str(delay))\n", + " plt.plot(np.abs(a_in), color='g');\n", + " plt.plot(np.abs(a_out) - 0.5, color='y');\n", + " plt.show()\n", + " \n", + " bins = np.linspace(+0.5/n_steps,a_max + 0.5/n_steps,num=n_steps)\n", + " res = []\n", + " a_out_abs = np.abs(a_out)\n", + " a_in_abs = np.abs(a_in)\n", + " for ampl_1, ampl_2 in zip(bins, bins[1:]):\n", + " res.append(get_amp_ratio(ampl_1, ampl_2, a_out_abs, a_in_abs))\n", + " del a_out_abs\n", + " del a_in_abs\n", + " mean_amp, var_amp = zip(*res)\n", + " \n", + " res = []\n", + " for ampl_1, ampl_2 in zip(bins, bins[1:]):\n", + " res.append(get_phase(ampl_1, ampl_2, a_out, a_in))\n", + " mean_phase, var_phase = zip(*res)\n", + " return mean_amp, var_amp, mean_phase, var_phase, db" ] }, { @@ -208,48 +199,40 @@ "metadata": {}, "outputs": [], "source": [ - "#def corr(a_out, a_in):\n", - "# import scipy\n", - "# corr = np.correlate(\n", - "# a_out,\n", - "# a_in,\n", - "# 'full')\n", - "# delay = np.argmax(corr) - a_in.shape[0] + 1\n", - "# #plt.plot(range(-corr.shape[0]/2, corr.shape[0]/2),corr)\n", - "# return delay" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#delay = corr(a_out, a_in)\n", - "delay = np.argmax(c)\n", - "a_out = a_out[delay - 1:]\n", - "delay" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "l = min(a_out.shape[0], a_in.shape[0])\n", - "a_out = a_out[0:l]\n", - "a_in = a_in[0:l]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.plot(a_in, color='g');\n", - "plt.plot(a_out - 1, color='y');" + "res = []\n", + "\n", + "for txgain, rxgain in zip(txgains, rxgains):\n", + " print (txgain, rxgain)\n", + " res_tmp = None\n", + " for i in range(10):\n", + " top.uhd_usrp_sink_0_0.set_gain(txgain)\n", + " top.uhd_usrp_source_0.set_gain(rxgain)\n", + " \n", + " top.file_sink_out.close()\n", + " top.blocks_file_source_0.close()\n", + " \n", + " top.file_sink_out.open(path_out)\n", + " top.blocks_file_source_0.open(path_in, False)\n", + " top.start()\n", + " \n", + " time.sleep(1)\n", + " \n", + " top.stop()\n", + " top.wait()\n", + " \n", + " a_in = np.fromfile(path_in, dtype=np.complex64)\n", + " a_out = np.fromfile(path_out, dtype=np.complex64)\n", + " res_tmp = extract_measurement(a_in, a_out, txgain, a_max, n_steps, debug=True)\n", + " \n", + " def is_finite(r): return np.all([np.all(np.isfinite(c)) for c in r])\n", + " def has_small_jumps(mean_amp): return np.max(np.abs(np.diff(mean_amp))) / np.median(np.abs(np.diff(mean_amp))) < 100\n", + " \n", + " if is_finite(res_tmp) and has_small_jumps(res_tmp[0]):\n", + " break\n", + " else:\n", + " print (is_finite(res_tmp), has_small_jumps(res_tmp[0]))\n", + " \n", + " res.append(res_tmp)" ] }, { @@ -257,12 +240,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "def get_amp_ratio(ampl_1, ampl_2):\n", - " idxs = (a_in > ampl_1) & (a_in < ampl_2)\n", - " ratio = (a_out[idxs] / a_in[idxs])\n", - " return ratio.mean(), ratio.var()" - ] + "source": [] }, { "cell_type": "code", @@ -270,10 +248,49 @@ "metadata": {}, "outputs": [], "source": [ - "def get_phase(ampl_1, ampl_2):\n", - " idxs = (a_in > ampl_1) & (a_in < ampl_2)\n", - " ratio = np.angle(a_out[idxs]) - np.angle(a_in[idxs])\n", - " return ratio.mean(), ratio.var()" + "fig = plt.figure(figsize=(10,10))\n", + "ax1 = plt.subplot(211)\n", + "\n", + "def plot_with_label(x, y, color, label):\n", + " ax1.plot(x, y, color=color, label=txgain)\n", + " \n", + "for idx, (txgain, rxgain) in enumerate(zip(*(txgains, rxgains))):\n", + " plot_with_label(\n", + " x = amps[1:], \n", + " y = 10*np.log(res[idx][0])/np.log(10) - rxgain + 102,\n", + " color = mpcol.hsv_to_rgb((idx * 0.75 / len(txgains), 0.6, 1)),\n", + " label = txgain\n", + " )\n", + "ax1.set_ylabel(\"Gain [dB]\")\n", + "\n", + "ax2 = plt.subplot(212)\n", + "\n", + "def plot_with_label(x, y, color, label):\n", + " ax2.plot(x, y, color=color, label=txgain)\n", + " \n", + "for idx, (txgain, rxgain) in enumerate(zip(*(txgains, rxgains))):\n", + " plot_with_label(\n", + " x = amps[1:],\n", + " y = res[idx][2],\n", + " color = mpcol.hsv_to_rgb((idx * 0.75 / len(txgains), 0.6, 1)),\n", + " label = txgain\n", + " )\n", + "\n", + "ax2.set_ylabel(\"Pase [degree]\")\n", + "ax2.set_xlabel(\"Amplitude\")\n", + "\n", + "#legend\n", + "# Shrink current axis by 20%\n", + "box = ax1.get_position()\n", + "ax1.set_position([box.x0, box.y0, box.width * 0.8, box.height])\n", + "box = ax2.get_position()\n", + "ax2.set_position([box.x0, box.y0, box.width * 0.8, box.height])\n", + "\n", + "# Put a legend to the right of the current axis\n", + "ax1.legend(loc='center left', bbox_to_anchor=(1.05, -0.3))\n", + "\n", + "\n", + "plt.show()" ] }, { @@ -281,44 +298,28 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "bins = np.linspace(0.1,1,num=10)\n", - "res = []\n", - "for ampl_1, ampl_2 in zip(bins, bins[1:]):\n", - " res.append(get_amp_ratio(ampl_1, ampl_2))\n", - "mean, var = zip(*res)" - ] + "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "plt.plot(mean)" - ] + "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "bins = np.linspace(0.1,1,num=10)\n", - "res = []\n", - "for ampl_1, ampl_2 in zip(bins, bins[1:]):\n", - " res.append(get_phase(ampl_1, ampl_2))\n", - "mean, var = zip(*res)" - ] + "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "plt.plot(mean)" - ] + "source": [] }, { "cell_type": "code", |