aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--notebooks/FrameSynchronization.ipynb130
-rw-r--r--src/gr-fadingui/grc/CMakeLists.txt3
-rw-r--r--src/gr-fadingui/grc/fadingui_xor_frame_sync.block.yml45
-rw-r--r--src/gr-fadingui/python/CMakeLists.txt3
-rw-r--r--src/gr-fadingui/python/__init__.py1
-rw-r--r--src/gr-fadingui/python/datasource.py27
-rw-r--r--src/gr-fadingui/python/dearpygui_sink.py16
-rw-r--r--src/gr-fadingui/python/xor_frame_sync.py27
-rw-r--r--tests/fadingui/QAM/qam_nogui.grc6
9 files changed, 218 insertions, 40 deletions
diff --git a/notebooks/FrameSynchronization.ipynb b/notebooks/FrameSynchronization.ipynb
new file mode 100644
index 0000000..9a7719f
--- /dev/null
+++ b/notebooks/FrameSynchronization.ipynb
@@ -0,0 +1,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
+}
diff --git a/src/gr-fadingui/grc/CMakeLists.txt b/src/gr-fadingui/grc/CMakeLists.txt
index 98713e8..1fe2b9c 100644
--- a/src/gr-fadingui/grc/CMakeLists.txt
+++ b/src/gr-fadingui/grc/CMakeLists.txt
@@ -19,5 +19,6 @@
# Boston, MA 02110-1301, USA.
install(FILES
fadingui_datasource.block.yml
- fadingui_dearpygui_sink.block.yml DESTINATION share/gnuradio/grc/blocks
+ fadingui_dearpygui_sink.block.yml
+ fadingui_xor_frame_sync.block.yml DESTINATION share/gnuradio/grc/blocks
)
diff --git a/src/gr-fadingui/grc/fadingui_xor_frame_sync.block.yml b/src/gr-fadingui/grc/fadingui_xor_frame_sync.block.yml
new file mode 100644
index 0000000..92be2a8
--- /dev/null
+++ b/src/gr-fadingui/grc/fadingui_xor_frame_sync.block.yml
@@ -0,0 +1,45 @@
+id: fadingui_xor_frame_sync
+label: xor_frame_sync
+category: '[fadingui]'
+
+templates:
+ imports: import fadingui
+ make: fadingui.xor_frame_sync()
+
+# Make one 'parameters' list entry for every parameter you want settable from the GUI.
+# Keys include:
+# * id (makes the value accessible as \$keyname, e.g. in the make entry)
+# * label (label shown in the GUI)
+# * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)
+parameters:
+- id: ...
+ label: ...
+ dtype: ...
+- id: ...
+ label: ...
+ dtype: ...
+
+# Make one 'inputs' list entry per input and one 'outputs' list entry per output.
+# Keys include:
+# * label (an identifier for the GUI)
+# * domain (optional - stream or message. Default is stream)
+# * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)
+# * vlen (optional - data stream vector length. Default is 1)
+# * optional (optional - set to 1 for optional inputs. Default is 0)
+inputs:
+- label: ...
+ domain: ...
+ dtype: ...
+ vlen: ...
+ optional: ...
+
+outputs:
+- label: ...
+ domain: ...
+ dtype: ...
+ vlen: ...
+ optional: ...
+
+# 'file_format' specifies the version of the GRC yml format used in the file
+# and should usually not be changed.
+file_format: 1
diff --git a/src/gr-fadingui/python/CMakeLists.txt b/src/gr-fadingui/python/CMakeLists.txt
index 27b5f4b..4845bd9 100644
--- a/src/gr-fadingui/python/CMakeLists.txt
+++ b/src/gr-fadingui/python/CMakeLists.txt
@@ -33,7 +33,8 @@ GR_PYTHON_INSTALL(
FILES
__init__.py
datasource.py
- dearpygui_sink.py DESTINATION ${GR_PYTHON_DIR}/fadingui
+ dearpygui_sink.py
+ xor_frame_sync.py DESTINATION ${GR_PYTHON_DIR}/fadingui
)
########################################################################
diff --git a/src/gr-fadingui/python/__init__.py b/src/gr-fadingui/python/__init__.py
index d551a71..f62e3cf 100644
--- a/src/gr-fadingui/python/__init__.py
+++ b/src/gr-fadingui/python/__init__.py
@@ -34,5 +34,6 @@ except ImportError:
# import any pure python here
from .datasource import datasource
from .dearpygui_sink import dearpygui_sink
+from .xor_frame_sync import xor_frame_sync
#
diff --git a/src/gr-fadingui/python/datasource.py b/src/gr-fadingui/python/datasource.py
index 1914d33..764b4d5 100644
--- a/src/gr-fadingui/python/datasource.py
+++ b/src/gr-fadingui/python/datasource.py
@@ -1,23 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
-# Copyright 2021 Naoki Pross, Sara Halter.
-#
-# This is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software; see the file COPYING. If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street,
-# Boston, MA 02110-1301, USA.
-#
+# Copyright 2021 Naoki Pross.
import io
@@ -60,23 +44,27 @@ class datasource(gr.sync_block):
self.fdata = np.fromfile(fname, np.byte)
self.fsize = len(self.fdata)
- # TODO: remove debugging statements
+ # TODO: remove debugging statements or create logger
print(f"datasource: loaded file size={self.fsize}, head:")
print(self.fdata[:10])
def make_header(self, data_size):
# TODO: check that data_size is not too big
pilot = 0x1248
+
+ # TODO: implement hamming code for header
header = f"p{pilot:04x}s{data_size:04x}d".encode("ascii")
+
arr = np.frombuffer(header, dtype=np.dtype("byte"))
return arr
def work(self, input_items, output_items):
out = output_items[0]
- print(self.fpos)
if self.fpos + self.vec_len > self.fsize:
# FIXME: repair broken code below
+ # TODO: create logger
+ print(f"WARNING: the last {self.fsize - self.fpos} bytes were not sent!")
self.fpos = 0
return 0;
@@ -92,6 +80,7 @@ class datasource(gr.sync_block):
self.fpos = 0
return rest
+ # cache header if not saved
if self.header_cache == None:
self.header = self.make_header(self.vec_len)
diff --git a/src/gr-fadingui/python/dearpygui_sink.py b/src/gr-fadingui/python/dearpygui_sink.py
index bca780d..6153611 100644
--- a/src/gr-fadingui/python/dearpygui_sink.py
+++ b/src/gr-fadingui/python/dearpygui_sink.py
@@ -2,22 +2,6 @@
# -*- coding: utf-8 -*-
#
# Copyright 2021 Naoki Pross.
-#
-# This is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# This software is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this software; see the file COPYING. If not, write to
-# the Free Software Foundation, Inc., 51 Franklin Street,
-# Boston, MA 02110-1301, USA.
-#
import socket
from urllib.parse import urlparse
diff --git a/src/gr-fadingui/python/xor_frame_sync.py b/src/gr-fadingui/python/xor_frame_sync.py
new file mode 100644
index 0000000..9d9064f
--- /dev/null
+++ b/src/gr-fadingui/python/xor_frame_sync.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright 2021 Naoki Pross.
+
+
+import numpy
+from gnuradio import gr
+
+class xor_frame_sync(gr.sync_block):
+ """
+ docstring for block xor_frame_sync
+ """
+ def __init__(self, sync_pattern):
+ gr.sync_block.__init__(self,
+ name="xor_frame_sync",
+ in_sig=[np.byte],
+ out_sig=[np.byte])
+
+ def work(self, input_items, output_items):
+ inp = input_items[0]
+ out = output_items[0]
+
+ out[:] = inp
+
+ return len(output_items[0])
+
diff --git a/tests/fadingui/QAM/qam_nogui.grc b/tests/fadingui/QAM/qam_nogui.grc
index 97cc794..2c6abf8 100644
--- a/tests/fadingui/QAM/qam_nogui.grc
+++ b/tests/fadingui/QAM/qam_nogui.grc
@@ -413,7 +413,7 @@ blocks:
bus_sink: false
bus_source: false
bus_structure: null
- coordinate: [2152, 340.0]
+ coordinate: [2192, 348.0]
rotation: 180
state: true
- name: digital_map_bb_0
@@ -429,7 +429,7 @@ blocks:
bus_sink: false
bus_source: false
bus_structure: null
- coordinate: [2152, 420.0]
+ coordinate: [2136, 420.0]
rotation: 0
state: true
- name: digital_pfb_clock_sync_xxx_0
@@ -471,7 +471,7 @@ blocks:
bus_sink: false
bus_source: false
bus_structure: null
- coordinate: [64, 236.0]
+ coordinate: [72, 212.0]
rotation: 0
state: true
- name: fadingui_dearpygui_sink_0