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": 14,
"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. 3. 4. 4. 4. 4. 3. 6. 7. 7. 3. 6. 6. 8. 7. 6. 7. 11.\n",
" 8. 7. 7. 10. 8. 8. 10. 8. 10. 7. 8. 8. 8. 10. 8. 11. 12. 9.\n",
" 8. 10. 8. 11. 9. 10. 9. 16. 10. 10. 10. 12. 10. 14. 9. 10. 9. 13.\n",
" 11. 9. 11. 8. 9. 11. 9. 9. 8. 8. 7. 9. 12. 5. 7. 9. 7. 10.\n",
" 12. 6. 6. 9. 8. 6. 8. 5. 5. 8. 7. 5. 5. 4. 3. 4. 3. 3.\n",
" 3. 3.]\n",
"Corrlation peak value: 16.0\n"
]
},
{
"data": {
"text/plain": [
"<StemContainer object of 3 artists>"
]
},
"execution_count": 14,
"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
}
|