Commit 801f34d3 authored by Ben Wojtowicz's avatar Ben Wojtowicz

first release with gnuradio c support

parent 89c3cadc
Ben Wojtowicz, bwojtowi@gmail.com
This diff is collapsed.
Version Contents
v00.01 First Octave release containing PSS, SSS, CRS, and PBCH
transmission and reception for FDD
v00.02 Octave release with fixes in the license statement and a
bug fix in lte_fdd_dl_receive.m
v00.03 Octave release with support for PDSCH transmission and
reception for SIB1 encoding/decoding. This includes
turbo encoding/decoding.
v00.04 First release with C++ gnuradio support. Contains PSS
SSS, CRS, and PBCH reception for FDD in C++ for gnuradio.
\ No newline at end of file
# Copyright 2012 Ben Wojtowicz
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
include $(top_srcdir)/Makefile.common
INCLUDES = \
-Ihdr/ \
-I$(top_srcdir)/liblte/hdr/ \
-I$(top_srcdir)/cmn_hdr/
LTE_fdd_dl_fs_la_swig_sources = \
src/LTE_fdd_dl_fs_samp_buf.cc
LTE_fdd_dl_fs_la_swig_ldflags = \
-L$(top_srcdir)/liblte/lib/ \
-llte \
-lfftw3
TOP_SWIG_IFILES = \
src/LTE_fdd_dl_fs.i
LTE_fdd_dl_fs_pythondir_category = \
gnuradio
include $(top_srcdir)/Makefile.swig
BUILT_SOURCES = $(swig_built_sources)
no_dist_files = $(swig_built_sources)
This diff is collapsed.
/*******************************************************************************
Copyright 2012 Ben Wojtowicz
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************
File: LTE_fdd_dl_fs_samp_buf.h
Description: Contains all the definitions for the LTE FDD DL File Scanner
sample buffer block.
Revision History
---------- ------------- --------------------------------------------
03/23/2012 Ben Wojtowicz Created file.
*******************************************************************************/
#ifndef __LTE_FDD_DL_FS_SAMP_BUF_H__
#define __LTE_FDD_DL_FS_SAMP_BUF_H__
/*******************************************************************************
INCLUDES
*******************************************************************************/
#include "gr_sync_block.h"
#include "liblte_phy.h"
#include "liblte_rrc.h"
/*******************************************************************************
DEFINES
*******************************************************************************/
#define LTE_FDD_DL_FS_SAMP_BUF_SIZE (307200*10)
/*******************************************************************************
FORWARD DECLARATIONS
*******************************************************************************/
class LTE_fdd_dl_fs_samp_buf;
/*******************************************************************************
TYPEDEFS
*******************************************************************************/
typedef boost::shared_ptr<LTE_fdd_dl_fs_samp_buf> LTE_fdd_dl_fs_samp_buf_sptr;
/*******************************************************************************
CLASS DECLARATIONS
*******************************************************************************/
LTE_fdd_dl_fs_samp_buf_sptr LTE_fdd_dl_fs_make_samp_buf ();
class LTE_fdd_dl_fs_samp_buf : public gr_sync_block
{
public:
~LTE_fdd_dl_fs_samp_buf();
int32 work(int32 ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
private:
friend LTE_fdd_dl_fs_samp_buf_sptr LTE_fdd_dl_fs_make_samp_buf();
LTE_fdd_dl_fs_samp_buf();
// LTE library
LIBLTE_PHY_STRUCT *phy_struct;
LIBLTE_RRC_MSG_STRUCT rrc_msg;
// Sample buffer
float *i_buf;
float *q_buf;
uint32 samp_buf_idx;
bool last_samp_was_i;
};
#endif /* __LTE_FDD_DL_FS_SAMP_BUF_H__ */
#!/usr/bin/env python
from gnuradio import gr
from gnuradio.eng_option import eng_option
from optparse import OptionParser
import LTE_fdd_dl_fs
class LTE_fdd_dl_file_scan (gr.top_block):
def __init__(self):
gr.top_block.__init__(self)
usage = "usage: %prog [options] file"
parser=OptionParser(option_class=eng_option, usage=usage)
# Add options here
(options, args) = parser.parse_args()
if len(args) != 1:
parser.print_help()
sys.exit(1)
input_filename = args[0]
# Build flow graph
self.fsrc = gr.file_source(gr.sizeof_char, input_filename, False)
self.samp_buf = LTE_fdd_dl_fs.samp_buf()
self.connect(self.fsrc, self.samp_buf)
if __name__ == '__main__':
tb = LTE_fdd_dl_file_scan()
try:
tb.run()
except KeyboardInterrupt:
pass
/* -*- c++ -*- */
%include "gnuradio.i" // the common stuff
%{
#include "LTE_fdd_dl_fs_samp_buf.h"
%}
// ----------------------------------------------------------------
/*
* First arg is the package prefix.
* Second arg is the name of the class minus the prefix.
*
* This does some behind-the-scenes magic so we can
* access LTE_fdd_dl_fs_samp_buf from python as LTE_fdd_dl_fs.samp_buf
*/
GR_SWIG_BLOCK_MAGIC(LTE_fdd_dl_fs,samp_buf);
LTE_fdd_dl_fs_samp_buf_sptr LTE_fdd_dl_fs_make_samp_buf ();
class LTE_fdd_dl_fs_samp_buf : public gr_block
{
private:
LTE_fdd_dl_fs_samp_buf ();
};
This diff is collapsed.
#
# Copyright 2004,2008,2009 Free Software Foundation, Inc.
# Copyright 2012 Ben Wojtowicz
#
# This file is part of GNU Radio
#
# GNU Radio 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.
#
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
ACLOCAL_AMFLAGS = -I config
include $(top_srcdir)/Makefile.common
EXTRA_DIST = bootstrap configure config.h.in \
Makefile.swig Makefile.swig.gen.t
SUBDIRS = liblte LTE_fdd_dl_file_scan
DIST_SUBDIRS = liblte LTE_fdd_dl_file_scan
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA =
# -*- Makefile -*-
#
# Copyright 2004,2006,2009 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
# GNU Radio 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.
#
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
# these flags are used when compiling non-SWIG-wrapper files
# when going in to non-SWIG libraries
AM_CXXFLAGS = @autoconf_default_CXXFLAGS@
# these flags are used when compiling any CXX file
AM_CPPFLAGS = \
$(STD_DEFINES_AND_INCLUDES) \
$(PYTHON_CPPFLAGS) \
$(CPPUNIT_INCLUDES) \
$(GNURADIO_CORE_CPPFLAGS)
# these are used by both SWIG and CXX
STD_DEFINES_AND_INCLUDES = \
$(DEFINES) \
-I$(GNURADIO_CORE_INCLUDEDIR) \
-I$(GNURADIO_CORE_INCLUDEDIR)/swig
# includes
grincludedir = $(includedir)/gnuradio
# swig includes
swigincludedir = $(grincludedir)/swig
# Install this stuff in the appropriate subdirectory
# This usually ends up at:
# ${prefix}/lib/python${python_version}/site-packages/gnuradio
grpythondir = $(pythondir)/gnuradio
grpyexecdir = $(pyexecdir)/gnuradio
# Don't assume that make predefines $(RM), because BSD make does
# not. We define it now in configure.ac using AM_PATH_PROG, but now
# here have to add a -f to be like GNU make.
RM=$(RM_PROG) -f
# Other common defines; use "+=" to add to these
STAMPS =
MOSTLYCLEANFILES = $(BUILT_SOURCES) $(STAMPS) *.pyc *.pyo *~ *.tmp *.loT
# Don't distribute the files defined in the variable 'no_dist_files'
dist-hook:
@for file in $(no_dist_files); do \
echo $(RM) $(distdir)/$$file; \
$(RM) $(distdir)/$$file; \
done;
# -*- Makefile -*-
#
# Copyright 2009 Free Software Foundation, Inc.
# Copyright 2012 Ben Wojtowicz
#
# This file is part of GNU Radio
#
# GNU Radio 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.
#
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
## This makefile should be included using
## include $(top_srcdir)/Makefile.swig
## in Makefile.am's which require SWIG wrapping / compilation.
## For just installing .i files, this Makefile is not required.
## swig flags
## -w511 turns off keyword argument warning
## "-outdir <builddir>" must be specified for each application
SWIG_PYTHON_FLAGS = \
-fvirtual \
-python \
-modern \
-keyword \
-w511
## standard swig flags used by most components
STD_SWIG_PYTHON_ARGS = \
$(SWIG_PYTHON_FLAGS) \
$(STD_DEFINES_AND_INCLUDES) \
$(WITH_SWIG_INCLUDES) \
$(WITH_INCLUDES)
## standard SWIG LD flags for library creation
STD_SWIG_LA_LD_FLAGS = \
$(PYTHON_LDFLAGS) \
-module \
-avoid-version \
$(NO_UNDEFINED)
## standard SWIG library additions for library creation
STD_SWIG_LA_LIB_ADD = \
-lstdc++
## standard SWIG CXXFLAGS
## This allows for code to be compiled with "-O1" instead of "-g -O2"
## for some systems, avoiding some optimization issues.
STD_SWIG_CXX_FLAGS = @swig_CXXFLAGS@
## SWIG suffix for automake to know about
SUFFIXES = .i
## Create $(srcdir)/Makefile.swig.gen, containing all of the rules
## for running SWIG to generate or re-generate outputs. SWIG file
## names are to be defined in TOP_SWIG_IFILES, and must include the
## full path to the file and full filename including extension. This
## Makefile addition will be made only if either it does not exist or
## if the top-level template has been modified.
generate-makefile-swig $(srcdir)/Makefile.swig.gen: $(top_srcdir)/Makefile.swig.gen.t
## recreate $(srcdir)/Makefile.swig.gen only if ...
@do_recreate=0; \
if test -f $(srcdir)/Makefile.swig.gen; then \
## the file exists and can be removed; or ...
if $(RM) $(srcdir)/Makefile.swig.gen 2>/dev/null; then \
if touch $(srcdir)/Makefile.swig.gen 2>/dev/null; then \
do_recreate=1; \
fi; \
fi; \
else \
## the file doesn't exist, but can be created (e.g., by touching it).
if touch $(srcdir)/Makefile.swig.gen 2>/dev/null; then \
do_recreate=1; \
fi; \
fi; \
if test "$$do_recreate" == "1"; then \
echo "Regenerating $(srcdir)/Makefile.swig.gen"; \
for TFILE in $(TOP_SWIG_IFILES); do \
## retrieve just the filename, without path or extension
TNAME=`python -c "import os.path as op; (dN, fN) = op.split ('$$TFILE'); (fbN, fE) = op.splitext (fN); print fbN;"`; \
## Replace the @-named strings in the template Makefile for SWIG.
$(SED) -e 's|@NAME@|'$$TNAME'|g;' < $(top_srcdir)/Makefile.swig.gen.t >> $(srcdir)/Makefile.swig.gen; \
echo "" >> $(srcdir)/Makefile.swig.gen; \
done; \
else \
echo "Cannot recreate $(srcdir)/Makefile.swig.gen because the directory or file is write-protected."; \
exit -1; \
fi;
swig_built_sources =
## include the built Makefile.swig.gen, always the one from the
## srcdir; this must be included as the last item, because it depends
## on variables defined above.
include $(srcdir)/Makefile.swig.gen
# -*- Makefile -*-
#
# Copyright 2009 Free Software Foundation, Inc.
# Copyright 2012 Ben Wojtowicz
#
# This file is part of GNU Radio
#
# GNU Radio 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.
#
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
# Makefile.swig.gen for @NAME@.i
## Default install locations for these files:
##
## Default location for the Python directory is:
## ${prefix}/lib/python${python_version}/site-packages/[category]/@NAME@
## Default location for the Python exec directory is:
## ${exec_prefix}/lib/python${python_version}/site-packages/[category]/@NAME@
##
## The following can be overloaded to change the install location, but
## this has to be done in the including Makefile.am -before-
## Makefile.swig is included.
@NAME@_pythondir_category ?= gnuradio/@NAME@
@NAME@_pylibdir_category ?= $(@NAME@_pythondir_category)
@NAME@_pythondir = $(pythondir)/$(@NAME@_pythondir_category)
@NAME@_pylibdir = $(pyexecdir)/$(@NAME@_pylibdir_category)
## SWIG headers are always installed into the same directory.
@NAME@_swigincludedir = $(swigincludedir)
## This is a template file for a "generated" Makefile addition (in
## this case, "Makefile.swig.gen"). By including the top-level
## Makefile.swig, this file will be used to generate the SWIG
## dependencies. Assign the variable TOP_SWIG_FILES to be the list of
## SWIG .i files to generated wrappings for; there can be more than 1
## so long as the names are unique (no sorting is done on the
## TOP_SWIG_FILES list). This file explicitly assumes that a SWIG .i
## file will generate .cc, .py, and possibly .h files -- meaning that
## all of these files will have the same base name (that provided for
## the SWIG .i file).
##
## This code is setup to ensure parallel MAKE ("-j" or "-jN") does the
## right thing. For more info, see <
## http://sources.redhat.com/automake/automake.html#Multiple-Outputs >
## Stamps used to ensure parallel make does the right thing. These
## are removed by "make clean", but otherwise unused except during the
## parallel built. These will not be included in a tarball, because
## the SWIG-generated files will be removed from the distribution.
STAMPS += $(DEPDIR)/@NAME@-generate-*
## Other cleaned files: dependency files generated by SWIG or this Makefile
MOSTLYCLEANFILES += $(DEPDIR)/*.S*
## Add the .py and .cc files to the list of SWIG built sources. The
## .h file is sometimes built, but not always ... so that one has to
## be added manually by the including Makefile.am .
swig_built_sources += src/@NAME@.py src/@NAME@.cc
STD_SWIG_PYTHON_ARGS += -outdir src
## Various SWIG variables. These can be overloaded in the including
## Makefile.am by setting the variable value there, then including
## Makefile.swig .
@NAME@_swiginclude_HEADERS = \
src/@NAME@.i \
$(@NAME@_swiginclude_headers)
@NAME@_pylib_LTLIBRARIES = \
_@NAME@.la
_@NAME@_la_SOURCES = \
src/@NAME@.cc \
$(@NAME@_la_swig_sources)
_@NAME@_la_LIBADD = \
$(STD_SWIG_LA_LIB_ADD) \
$(@NAME@_la_swig_libadd)
_@NAME@_la_LDFLAGS = \
$(STD_SWIG_LA_LD_FLAGS) \
$(@NAME@_la_swig_ldflags)
_@NAME@_la_CXXFLAGS = \
$(STD_SWIG_CXX_FLAGS) \
$(@NAME@_la_swig_cxxflags)
@NAME@_python_PYTHON = \
src/@NAME@.py \
$(@NAME@_python)
## Entry rule for running SWIG
src/@NAME@.h src/@NAME@.py src/@NAME@.cc: src/@NAME@.i
## This rule will get called only when MAKE decides that one of the
## targets needs to be created or re-created, because:
##
## * The .i file is newer than any or all of the generated files;
##
## * Any or all of the .cc, .h, or .py files does not exist and is
## needed (in the case this file is not needed, the rule for it is
## ignored); or
##
## * Some SWIG-based dependecy of the .cc file isn't met and hence the
## .cc file needs be be regenerated. Explanation: Because MAKE
## knows how to handle dependencies for .cc files (regardless of
## their name or extension), then the .cc file is used as a target
## instead of the .i file -- but with the dependencies of the .i
## file. It is this last reason why the line:
##
## if test -f $@; then :; else
##
## cannot be used in this case: If a .i file dependecy is not met,
## then the .cc file needs to be rebuilt. But if the stamp is newer
## than the .cc file, and the .cc file exists, then in the original
## version (with the 'test' above) the internal MAKE call will not
## be issued and hence the .cc file will not be rebuilt.
##
## Once execution gets to here, it should always proceed no matter the
## state of a stamp (as discussed in link above). The
## $(DEPDIR)/@NAME@-generate stuff is used to allow for parallel
## builds to "do the right thing". The stamp has no relationship with
## either the target files or dependency file; it is used solely for
## the protection of multiple builds during a given call to MAKE.
##
## Catch signals SIGHUP (1), SIGINT (2), SIGPIPE (13), and SIGTERM
## (15). At a caught signal, the quoted command will be issued before
## exiting. In this case, remove any stamp, whether temporary of not.
## The trap is valid until the process exits; the process includes all
## commands appended via "\"s.
##
trap 'rm -rf $(DEPDIR)/@NAME@-generate-*' 1 2 13 15; \
##
## Create a temporary directory, which acts as a lock. The first
## process to create the directory will succeed and issue the MAKE
## command to do the actual work, while all subsequent processes will
## fail -- leading them to wait for the first process to finish.
##
if mkdir $(DEPDIR)/@NAME@-generate-lock 2>/dev/null; then \
##
## This code is being executed by the first process to succeed in
## creating the directory lock.
##
## Remove the stamp associated with this filename.
##
rm -f $(DEPDIR)/@NAME@-generate-stamp; \
##
## Tell MAKE to run the rule for creating this stamp.
##
$(MAKE) $(AM_MAKEFLAGS) $(DEPDIR)/@NAME@-generate-stamp WHAT=$<; \
##
## Now that the .cc, .h, and .py files have been (re)created from the
## .i file, future checking of this rule during the same MAKE
## execution will come back that the rule doesn't need to be executed
## because none of the conditions mentioned at the start of this rule
## will be positive. Remove the the directory lock, which frees up
## any waiting process(es) to continue.
##
rmdir $(DEPDIR)/@NAME@-generate-lock; \
else \
##
## This code is being executed by any follower processes while the
## directory lock is in place.
##
## Wait until the first process is done, testing once per second.
##
while test -d $(DEPDIR)/@NAME@-generate-lock; do \
sleep 1; \
done; \
##
## Succeed if and only if the first process succeeded; exit this
## process returning the status of the generated stamp.
##
test -f $(DEPDIR)/@NAME@-generate-stamp; \
exit $$?; \
fi;
$(DEPDIR)/@NAME@-generate-stamp:
## This rule will be called only by the first process issuing the
## above rule to succeed in creating the lock directory, after
## removing the actual stamp file in order to guarantee that MAKE will
## execute this rule.
##
## Call SWIG to generate the various output files; special
## post-processing on 'mingw32' host OS for the dependency file.
##
if $(SWIG) $(STD_SWIG_PYTHON_ARGS) $(@NAME@_swig_args) \
-MD -MF $(DEPDIR)/@NAME@.Std \
-module @NAME@ -o src/@NAME@.cc $(WHAT); then \
if test $(host_os) = mingw32; then \
$(RM) $(DEPDIR)/@NAME@.Sd; \
$(SED) 's,\\\\,/,g' < $(DEPDIR)/@NAME@.Std \
> $(DEPDIR)/@NAME@.Sd; \
$(RM) $(DEPDIR)/@NAME@.Std; \
$(MV) $(DEPDIR)/@NAME@.Sd $(DEPDIR)/@NAME@.Std; \
fi; \
else \
$(RM) $(DEPDIR)/@NAME@.S*; exit 1; \
fi;
##
## Mess with the SWIG output .Std dependency file, to create a
## dependecy file valid for the input .i file: Basically, simulate the
## dependency file created for libraries by GNU's libtool for C++,
## where all of the dependencies for the target are first listed, then
## each individual dependency is listed as a target with no further
## dependencies.
##
## (1) remove the current dependency file
##
$(RM) $(DEPDIR)/@NAME@.d
##
## (2) Copy the whole SWIG file:
##
cp $(DEPDIR)/@NAME@.Std $(DEPDIR)/@NAME@.d
##
## (3) all a carriage return to the end of the dependency file.
##
echo "" >> $(DEPDIR)/@NAME@.d
##
## (4) from the SWIG file, remove the first line (the target); remove
## trailing " \" and " " from each line. Append ":" to each line,
## followed by 2 carriage returns, then append this to the end of
## the dependency file.
##
$(SED) -e '1d;s, \\,,g;s, ,,g' < $(DEPDIR)/@NAME@.Std | \
awk '{ printf "%s:\n\n", $$0 }' >> $(DEPDIR)/@NAME@.d
##
## (5) remove the SWIG-generated file
##
$(RM) $(DEPDIR)/@NAME@.Std
##
## Create the stamp for this filename generation, to signal success in
## executing this rule; allows other threads waiting on this process
## to continue.
##
touch $(DEPDIR)/@NAME@-generate-stamp
# KLUDGE: Force runtime include of a SWIG dependency file. This is
# not guaranteed to be portable, but will probably work. If it works,
# we have accurate dependencies for our swig stuff, which is good.
@am__include@ @am__quote@./$(DEPDIR)/@NAME@.d@am__quote@
This directory contains the openLTE source code. For support, please
subscribe to openlte-discuss@lists.sourceforge.net. Details can be
found at sourceforge.net/projects/openlte/.
The directory structure for the project is:
octave Octave test code
cmn_hdr Common header files
liblte C++ library of commonly used LTE functions
openlte_file_scan A gnu-radio LTE file scanner application
To build the C++ and python code use the following:
$ ./bootstrap
$ ./configure
$ make
To install the C++ and python code use the following:
$ ./bootstrap
$ ./configure
$ make
$ make install
To use the installed C++ and python code, set the PYTHONPATH
env variable to <python_install_dir>/dist-packages/gnuradio/
for instance /usr/local/lib/python2.7/dist-packages/gnuradio/.
Then run openlte_file_scan/python/openlte_file_scan.py and
specify a recorded LTE file as the input. For example:
$ ./openlte_file_scan/python/openlte_file_scan.py lte_file.bin
The recorded LTE file currently must be interleaved 8-bit I and
Q samples recorded at 30.72MHz.
To use the octave code, run the top level octave .m files:
lte_fdd_dl_transmit.m and lte_fdd_dl_receive.m. If multiple
transmit antennas are used, the outputs need to be combined
before input to the receiver.