diff options
-rw-r--r-- | INSTALL | 25 | ||||
-rw-r--r-- | configure.ac | 68 | ||||
-rw-r--r-- | src/Makefile.am | 113 |
3 files changed, 113 insertions, 93 deletions
@@ -4,15 +4,14 @@ Required dependencies: * Boost 1.41 or later * Optional ZeroMQ http://www.zeromq.org Use --disable-input-zeromq if you don't have it - * Optional FFTW 3.x (KISS FFT is default) - Enable with --enable-fftw + * Optional FFTW 3.x (included KISS FFT is used as fallback) Simple install procedure: ========================= % tar xjf odr-dabmod-X.Y.Z.tar.bz2 # Unpack the source % cd odr-dabmod-X.Y.Z # Change to the source directory - % ./configure --disable-debug --with-debug-malloc=yes --enable-fft-simd + % ./configure --disable-debug --with-debug-malloc=yes # Run the configure script % make # Build ODR-DabMod [ as root ] @@ -26,16 +25,16 @@ The configure script can be launch with a variety of options: --enable-output-uhd Includes the binding to the UHD driver for USRPs You have the choice between two FFT libraries: KISS FFT and FFTW. KISS FFT is a -proven library, but it's performance is worse than with the new FFTW. With the -default KISS FFT, you have the choice between using the normal version, or the -SIMD accelerated version, which is a bit faster. The corresponding options are: +proven library, but it's performance is worse than with the new FFTW. With KISS +FFT, you have the choice between using the normal version, or the SIMD +accelerated version, which is a bit faster. The corresponding options are: - --enable-fftw Use FFTW3 instead of KISS FFT (experimental, better performance) + --enable-kiss-fft Prefer KISS FFT over FFTW --enable-fft-simd Enable SIMD instructions for KISS FFT -Debugging options: You should disable debug to improve ODR-DabMod performance. -By default, debug is enabled. - --disable-debug Do not compile with debugging, and enable optimisations +Debugging options: You should not enable debug if you need good performance. +By default, debug is disabled. + --enable-debug Do not compile with debugging, and enable optimisations --enable-trace Create debugging files for each DSP block for data analysis For more information, call: @@ -45,13 +44,11 @@ For more information, call: Nearly as simple install procedure using repository: ==================================================== - * Download and install fec as above + * Download and install dependencies as above * Clone the git repository * Bootstrap autotools: % ./bootstrap.sh - In case this fails, try one of the following: + In case this fails, try: % aclocal && automake --gnu --add-missing && autoconf - or - % autoreconf * Then use ./configure as above diff --git a/configure.ac b/configure.ac index 9a1816a..9826a91 100644 --- a/configure.ac +++ b/configure.ac @@ -48,56 +48,74 @@ AC_PROG_MKDIR_P EXTRA="" AC_ARG_ENABLE([debug], - [AS_HELP_STRING([--disable-debug], [Disable debugger symbols])], - [], [enable_debug=yes]) + [AS_HELP_STRING([--enable-debug], [Enable debugger symbols])], + [], [enable_debug=no]) AC_ARG_ENABLE([prof], [AS_HELP_STRING([--enable-prof], [Enable profiling])], [], [enable_prof=no]) AC_ARG_WITH([debug-malloc], - [AS_HELP_STRING([--with-debug-malloc[=yes|no|duma|efence|...]], + [AS_HELP_STRING([--with-debug-malloc[=no|yes|duma|efence|...]], [Add malloc debugger support])], - [], [with_debug_malloc=yes]) + [], [with_debug_malloc=no]) AC_ARG_ENABLE([trace], [AS_HELP_STRING([--enable-trace], [Enable trace output])], [], [enable_trace=no]) + +# Which FFT library to use AC_ARG_ENABLE([fft_simd], - [AS_HELP_STRING([--enable-fft-simd], [Enable SIMD instructions for kiss-fft (unstable)])], + [AS_HELP_STRING([--enable-fft-simd], + [Enable SIMD instructions for kiss-fft (unstable)])], [], [enable_fft_simd=no]) -AC_ARG_ENABLE([fftw], - [AS_HELP_STRING([--enable-fftw], [Use FFTW3 instead of Kiss FFT])], - [], [enable_fftw=no]) +AC_ARG_ENABLE([kiss_fft], + [AS_HELP_STRING([--enable-kiss-fft], [Prefer KISS FFT over FFTW3])], + [], [enable_kiss=no]) + # ZeroMQ message queue input AC_ARG_ENABLE([input_zeromq], AS_HELP_STRING([--enable-input-zeromq], [Enable ZeroMQ input])) + # UHD support control AC_ARG_ENABLE([output_uhd], [AS_HELP_STRING([--enable-output-uhd], [Enable UHD output])], [], [enable_output_uhd=yes]) +AS_IF([test "x$enable_kiss" = "xno"], + [PKG_CHECK_MODULES([FFTW], [fftw3f], enable_fftw=yes, enable_fftw=no)], + [enable_fftw=no]) + +AS_IF([test "x$enable_fftw" = "xyes"], + AC_MSG_NOTICE([Found FFTW3]), + AC_MSG_NOTICE([Using Kiss FFT]) ) + +echo "Checking input zeromq" + AS_IF([test "x$enable_input_zeromq" = "xyes"], [AC_DEFINE(HAVE_INPUT_ZEROMQ, [1], [Define if ZeroMQ input is enabled]) , AC_CHECK_LIB(zmq, zmq_init, ,[AC_MSG_ERROR([ZeroMQ libzmq is required])])]) AS_IF([test "x$enable_debug" = "xno"], [OPTIM="-O2" DEBUG="" EXTRA="$EXTRA -DNDEBUG"], - [OPTIM="-O0" DEBUG="-ggdb" EXTRA="$EXTRA -Wall"]) + [OPTIM="-O0" DEBUG="-ggdb" EXTRA="$EXTRA"]) AS_IF([test "x$enable_prof" != "xno"], [EXTRA="$EXTRA -pg"]) -AS_IF([test "x$enable_trace" != "xno"], - [EXTRA="$EXTRA -DDEBUG"]) -AS_IF([test "x$enable_fft_simd" != "xno"], - [EXTRA="$EXTRA -DUSE_SIMD"]) -AS_IF([test "x$enable_fftw" != "xno"], - [EXTRA="$EXTRA -DUSE_FFTW"]) +# Define conditionals for Makefile.am AM_CONDITIONAL([USE_KISS_FFT], [test "x$enable_fftw" = "xno"]) - +AM_CONDITIONAL([DEBUG], [test "x$enable_trace" = "xyes"]) AM_CONDITIONAL([HAVE_INPUT_ZEROMQ_TEST], [test "x$enable_input_zeromq" = "xyes"]) +AM_CONDITIONAL([IS_GIT_REPO], [test -d '.git']) +# Defines for config.h +AS_IF([test "x$enable_fft_simd" = "xyes"], + [AC_DEFINE(USE_SIMD, [1], [Define to enable KISS FFT SIMD])]) +AS_IF([test "x$enable_fftw" = "xno"], + [AC_DEFINE(USE_KISS_FFT, [1], [Define to enable KISS])]) +AS_IF([test "x$enable_fftw" = "xyes"], + [AC_DEFINE(USE_FFTW, [1], [Define to enable FFTW])]) -AC_SUBST([CFLAGS], ["$OPTIM $DEBUG $EXTRA"]) -AC_SUBST([CXXFLAGS], ["$OPTIM $DEBUG $EXTRA"]) +AC_SUBST([CFLAGS], ["$OPTIM $DEBUG $EXTRA $FFTW_CFLAGS"]) +AC_SUBST([CXXFLAGS], ["$OPTIM $DEBUG $EXTRA $FFTW_LIBS"]) -# Checks for libraries. +# Checks for UHD. AS_IF([test "x$enable_output_uhd" = "xyes"], [AC_DEFINE(HAVE_OUTPUT_UHD, [1], [Define if UHD output is enabled]) , AC_CHECK_LIB([uhd], [main], [], [AC_MSG_ERROR([library uhd is missing])])]) @@ -110,11 +128,8 @@ AC_CHECK_LIB([boost_thread], [main], [], [AC_MSG_ERROR([library boost_thread is AC_CHECK_LIB([rt], [clock_gettime], [], [AC_MSG_ERROR([library rt is missing])]) -AS_IF([test "x$enable_fftw" != "xno"], - [AC_CHECK_LIB([fftw3f], [fftw_execute], - AC_MSG_NOTICE([Found FFTW3]), - AC_MSG_NOTICE([Failed to find FFTW3]) )] ) - +# Tests for different memory allocation debuggers. +# Valgrind doesn't need any. AS_IF([test "x$enable_debug" != "xno"], [AS_IF([test "x$with_debug_malloc" != "xno"], [AS_IF([test "x$with_debug_malloc" = "xyes"], @@ -145,6 +160,7 @@ AC_COMPILE_IFELSE( [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_DEFINE([M_PIl], [M_PI], [Replacing define])]) AC_LANG_POP([C++]) + # Check for SSE AC_MSG_CHECKING(for SSE in current arch/CFLAGS) AC_LINK_IFELSE([ @@ -165,7 +181,7 @@ AC_MSG_RESULT($has_sse) AM_CONDITIONAL([HAVE_SSE], [test "x$has_sse" = "xyes"]) -AM_CONDITIONAL([IS_GIT_REPO], [test -d '.git']) +# TODO: Check for NEON AC_TYPE_SIGNAL AC_CHECK_FUNCS([bzero floor ftime gettimeofday memset sqrt strchr strerror strtol]) @@ -197,7 +213,7 @@ disabled="" for feat in with_debug_malloc has_sse do eval var=\$$feat - AS_IF([test "x$var" = "xyes"], + AS_IF([test "x$var" != "xno"], [enabled="$enabled $feat"], [disabled="$disabled $feat"]) done diff --git a/src/Makefile.am b/src/Makefile.am index 3d1eefc..6c83cb1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,13 +23,13 @@ GITVERSION_FLAGS = endif if HAVE_INPUT_ZEROMQ_TEST -ZMQ_LIBS =-lzmq +ZMQ_LIBS = -lzmq else ZMQ_LIBS = endif if HAVE_OUTPUT_UHD_TEST -UHD_SOURCES =OutputUHD.cpp OutputUHD.h +UHD_SOURCES = OutputUHD.cpp OutputUHD.h else UHD_SOURCES = endif @@ -40,88 +40,95 @@ else SIMD_CFLAGS = endif -bin_PROGRAMS = odr-dabmod +bin_PROGRAMS = odr-dabmod if USE_KISS_FFT FFT_DIR=$(top_builddir)/lib/kiss_fft129 FFT_INC=-I$(FFT_DIR) -I$(FFT_DIR)/tools -FFT_SRC=$(FFT_DIR)/kiss_fft.c $(FFT_DIR)/kiss_fft.h $(FFT_DIR)/tools/kiss_fftr.c $(FFT_DIR)/tools/kiss_fftr.h kiss_fftsimd.c kiss_fftsimd.h +FFT_SRC=$(FFT_DIR)/kiss_fft.c \ + $(FFT_DIR)/kiss_fft.h \ + $(FFT_DIR)/tools/kiss_fftr.c \ + $(FFT_DIR)/tools/kiss_fftr.h \ + kiss_fftsimd.c \ + kiss_fftsimd.h FFT_FLG=-ffast-math .PHONY: kiss_fft129 reed-solomon-4.0 -DabModulator.cpp: $(FFT_DIR) +DabModulator.cpp: $(FFT_DIR) -BUILT_SOURCES: $(FFT_DIR) +BUILT_SOURCES: $(FFT_DIR) FFT_LDADD= + +$(FFT_DIR): + if [ ! -e $(FFT_DIR) ]; then \ + tar xzf $(top_srcdir)/lib/kiss_fft129.tar.gz -C $(top_builddir)/lib; \ + fi + else -FFT_LDADD=-lfftw3f -lm +FFT_LDADD= FFT_DIR= FFT_INC= FFT_SRC= FFT_FLG= endif -$(FFT_DIR): - if [ ! -e $(FFT_DIR) ]; then \ - tar xzf $(top_srcdir)/lib/kiss_fft129.tar.gz -C $(top_builddir)/lib; \ - fi - -odr_dabmod_CPPFLAGS = -Wall $(FFT_INC) $(FFT_FLG) $(SIMD_CFLAGS) $(GITVERSION_FLAGS) +odr_dabmod_CPPFLAGS = -Wall \ + $(FFT_INC) $(FFT_FLG) $(SIMD_CFLAGS) $(GITVERSION_FLAGS) odr_dabmod_LDADD = $(ZMQ_LIBS) $(FFT_LDADD) odr_dabmod_SOURCES = DabMod.cpp \ - PcDebug.h \ - porting.c porting.h \ - DabModulator.cpp DabModulator.h \ - Buffer.cpp Buffer.h \ - ModCodec.cpp ModCodec.h \ - ModPlugin.cpp ModPlugin.h \ - ModFormat.cpp ModFormat.h \ - EtiReader.cpp EtiReader.h \ - Eti.cpp Eti.h \ - FicSource.cpp FicSource.h \ + PcDebug.h \ + porting.c porting.h \ + DabModulator.cpp DabModulator.h \ + Buffer.cpp Buffer.h \ + ModCodec.cpp ModCodec.h \ + ModPlugin.cpp ModPlugin.h \ + ModFormat.cpp ModFormat.h \ + EtiReader.cpp EtiReader.h \ + Eti.cpp Eti.h \ + FicSource.cpp FicSource.h \ FIRFilter.cpp FIRFilter.h \ - ModInput.cpp ModInput.h \ - PuncturingRule.cpp PuncturingRule.h \ - PuncturingEncoder.cpp PuncturingEncoder.h \ - SubchannelSource.cpp SubchannelSource.h \ - Flowgraph.cpp Flowgraph.h \ - GainControl.cpp GainControl.h \ - OutputMemory.cpp OutputMemory.h \ + ModInput.cpp ModInput.h \ + PuncturingRule.cpp PuncturingRule.h \ + PuncturingEncoder.cpp PuncturingEncoder.h \ + SubchannelSource.cpp SubchannelSource.h \ + Flowgraph.cpp Flowgraph.h \ + GainControl.cpp GainControl.h \ + OutputMemory.cpp OutputMemory.h \ TimestampDecoder.h TimestampDecoder.cpp \ - $(UHD_SOURCES) \ - ModOutput.cpp ModOutput.h \ - InputMemory.cpp InputMemory.h \ + $(UHD_SOURCES) \ + ModOutput.cpp ModOutput.h \ + InputMemory.cpp InputMemory.h \ InputFileReader.cpp InputZeroMQReader.cpp InputReader.h \ - OutputFile.cpp OutputFile.h \ - FrameMultiplexer.cpp FrameMultiplexer.h \ - ModMux.cpp ModMux.h \ - PrbsGenerator.cpp PrbsGenerator.h \ - BlockPartitioner.cpp BlockPartitioner.h \ - QpskSymbolMapper.cpp QpskSymbolMapper.h \ - FrequencyInterleaver.cpp FrequencyInterleaver.h \ - PhaseReference.cpp PhaseReference.h \ - DifferentialModulator.cpp DifferentialModulator.h \ - NullSymbol.cpp NullSymbol.h \ - SignalMultiplexer.cpp SignalMultiplexer.h \ - CicEqualizer.cpp CicEqualizer.h \ - OfdmGenerator.cpp OfdmGenerator.h \ - GuardIntervalInserter.cpp GuardIntervalInserter.h \ - Resampler.cpp Resampler.h \ - ConvEncoder.cpp ConvEncoder.h \ - TimeInterleaver.cpp TimeInterleaver.h \ + OutputFile.cpp OutputFile.h \ + FrameMultiplexer.cpp FrameMultiplexer.h \ + ModMux.cpp ModMux.h \ + PrbsGenerator.cpp PrbsGenerator.h \ + BlockPartitioner.cpp BlockPartitioner.h \ + QpskSymbolMapper.cpp QpskSymbolMapper.h \ + FrequencyInterleaver.cpp FrequencyInterleaver.h \ + PhaseReference.cpp PhaseReference.h \ + DifferentialModulator.cpp DifferentialModulator.h \ + NullSymbol.cpp NullSymbol.h \ + SignalMultiplexer.cpp SignalMultiplexer.h \ + CicEqualizer.cpp CicEqualizer.h \ + OfdmGenerator.cpp OfdmGenerator.h \ + GuardIntervalInserter.cpp GuardIntervalInserter.h \ + Resampler.cpp Resampler.h \ + ConvEncoder.cpp ConvEncoder.h \ + TimeInterleaver.cpp TimeInterleaver.h \ ThreadsafeQueue.h \ Log.cpp Log.h \ RemoteControl.cpp RemoteControl.h \ zmq.hpp -nodist_odr_dabmod_SOURCES =$(FFT_SRC) +nodist_odr_dabmod_SOURCES = $(FFT_SRC) -dist_bin_SCRIPTS =crc-dwap.py +dist_bin_SCRIPTS = crc-dwap.py if USE_KISS_FFT -EXTRA_DIST =kiss_fftsimd.c kiss_fftsimd.h +EXTRA_DIST = kiss_fftsimd.c kiss_fftsimd.h clean-local: rm -rf $(FFT_DIR) |