aboutsummaryrefslogtreecommitdiffstats
path: root/notebooks/FrameSynchronization.ipynb
blob: a659a7b4bab3fd60bb0f0d482ceeec9677975899 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5d5acf43",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from numpy_ringbuffer import RingBuffer\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.image as mpimg"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b294887",
   "metadata": {},
   "source": [
    "# Digital Frame Synchronization\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5bec50ff",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Header sequence (N=16): [1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1]\n",
      "Cross correlation: [ 3.  4.  5.  5.  6.  4.  4.  6.  4.  4.  5.  8.  7. 10.  8.  7.  8. 10.\n",
      "  7.  8.  8.  9. 14. 11.  9. 10. 12.  9. 13.  9.  9. 11. 13.  9. 12. 11.\n",
      "  9.  9. 13. 10.  9. 11.  9. 14. 12.  9. 10. 11.  8. 11.  6.  9.  8. 11.\n",
      "  6.  7.  9.  8.  7.  4.  4.  9.  9.  7.  6.  7.  9. 11.  8.  7. 10. 12.\n",
      " 10. 11. 11. 10.  9. 10.  9.  7. 10.  7.  9.  6.  7.  6.  5.  4.  5.  2.\n",
      "  4.  3.]\n",
      "Correlation peak value: 14.0\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<StemContainer object of 3 artists>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1800x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Create test data\n",
    "seq = np.array([(0xbeef >> i) & 0x1 for i in range(4 * 4)])\n",
    "# seq = np.array([1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1])\n",
    "\n",
    "stream = np.concatenate([\n",
    "    np.random.randint(low=0, high=2, size=30), seq, np.random.randint(low=0, high=2, size=30)\n",
    "])\n",
    "\n",
    "print(f\"Header sequence (N={len(seq)}): {seq}\")\n",
    "# print(f\"Data stream: {stream}\")\n",
    "\n",
    "# compute cross correlation\n",
    "def distance(v):\n",
    "    return len(seq) - sum(np.logical_xor(v, seq))\n",
    "\n",
    "fifo = RingBuffer(len(seq))\n",
    "xcorr = RingBuffer(len(stream) + len(seq))\n",
    "\n",
    "## fill FIFO with zeros\n",
    "fifo.extend(np.zeros(fifo.maxlen))\n",
    "\n",
    "for i in range(len(stream) + len(seq)):\n",
    "    #print(np.array(fifo))\n",
    "    xcorr.append(distance(np.array(fifo)))\n",
    "    \n",
    "    # if the stream is finished use zeros\n",
    "    fifo.pop()\n",
    "    if i < len(stream):\n",
    "        fifo.appendleft(stream[i])\n",
    "    else:\n",
    "        fifo.appendleft(0)\n",
    "\n",
    "print(f\"Cross correlation: {np.array(xcorr)}\")\n",
    "print(f\"Correlation peak value: {max(np.array(xcorr))}\")\n",
    "\n",
    "plt.figure(figsize = (25, 5))\n",
    "plt.stem(np.array(xcorr))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}