From 45294abdecea52c9906dd020e93d5e36aa35b4e4 Mon Sep 17 00:00:00 2001 From: Stelios Bounanos Date: Thu, 24 Jul 2008 13:22:53 +0100 Subject: [PATCH] Upstream version 3.0preX --- configure.ac | 13 +++++- m4/static.m4 | 4 -- src/Makefile.am | 2 +- src/dialogs/fl_digi.cxx | 57 +++-------------------- src/fileselector/fileselect.cxx | 30 +++++++++++-- src/filters/filters.cxx | 80 +++++++++++++++++++++++++++++++++ src/include/filters.h | 27 +++++++++++ src/main.cxx | 26 ++++++----- src/misc/macroedit.cxx | 2 +- src/misc/macros.cxx | 4 +- src/psk/psk.cxx | 1 - src/waterfall/colorbox.cxx | 4 +- 12 files changed, 171 insertions(+), 79 deletions(-) diff --git a/configure.ac b/configure.ac index 1b1f1add..804badc8 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may dnl contain other characters or be empty m4_define(FLDIGI_MAJOR, [3]) m4_define(FLDIGI_MINOR, [0]) -m4_define(FLDIGI_PATCH, [preW]) +m4_define(FLDIGI_PATCH, [preX]) AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[FLDIGI_PATCH], [w1hkj AT w1hkj DOT com]) @@ -81,9 +81,18 @@ AC_FUNC_STRFTIME AC_FUNC_STRTOD AC_CHECK_FUNCS([getaddrinfo gethostbyname localtime_r memmove memset mkdir select snprintf socket strcasecmp strchr strdup strerror strncasecmp strcasestr strrchr strstr strtol uname vsnprintf]) +# Check for clock_gettime +LIBS_save="$LIBS"; LIBS="" +AC_SEARCH_LIBS([clock_gettime], [rt], [ac_cv_clock_gettime=1; EXTRA_LIBS="$EXTRA_LIBS $LIBS"], + [ac_cv_clock_gettime=0]) +AC_DEFINE_UNQUOTED(HAVE_CLOCK_GETTIME, $ac_cv_clock_gettime, [Define to 1 if we have clock_gettime]) +LIBS="$LIBS_save" # Check for dlopen -AC_SEARCH_LIBS([dlopen], [dl], [ac_cv_dlopen=1], [ac_cv_dlopen=0]) +LIBS_save="$LIBS"; LIBS="" +AC_SEARCH_LIBS([dlopen], [dl], [ac_cv_dlopen=1; EXTRA_LIBS="$EXTRA_LIBS $LIBS"], [ac_cv_dlopen=0]) AC_DEFINE_UNQUOTED(HAVE_DLOPEN, $ac_cv_dlopen, [Define to 1 if we have dlopen]) +LIBS="$LIBS_save" +AC_SUBST([EXTRA_LIBS]) AC_PRESERVE_HELP_ORDER diff --git a/m4/static.m4 b/m4/static.m4 index 463142d0..4d32f89e 100644 --- a/m4/static.m4 +++ b/m4/static.m4 @@ -6,8 +6,4 @@ AC_DEFUN([AC_FLDIGI_STATIC], [ *) AC_MSG_ERROR([bad value ${enableval} for --enable-static]) ;; esac], [ac_cv_static=no]) - if test "x$ac_cv_static" = "xyes"; then - AC_CHECK_LIB([rt], [clock_gettime], [RTLIB=-lrt]) - fi - AC_SUBST([RTLIB]) ]) diff --git a/src/Makefile.am b/src/Makefile.am index a65e9fbb..a8491649 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,7 +15,7 @@ AM_CFLAGS = $(AM_CXXFLAGS) AM_LDFLAGS = @MAC_UNIVERSAL_LDFLAGS@ LDADD = @PORTAUDIO_LIBS@ @BOOST_LDFLAGS@ @FLTK_LIBS@ @SNDFILE_LIBS@ \ - @SAMPLERATE_LIBS@ @PULSEAUDIO_LIBS@ @HAMLIB_LIBS@ @IMAGE_LIBS@ @XMLRPC_LIBS@ @RTLIB@ + @SAMPLERATE_LIBS@ @PULSEAUDIO_LIBS@ @HAMLIB_LIBS@ @IMAGE_LIBS@ @XMLRPC_LIBS@ @EXTRA_LIBS@ HAMLIB_SRC = include/hamlib.h rigcontrol/hamlib.cxx include/rigclass.h rigcontrol/rigclass.cxx diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 3e9613a8..1e2e8aaf 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -208,20 +208,13 @@ Fl_Menu_Item quick_change_qpsk[] = { }; Fl_Menu_Item quick_change_mfsk[] = { - { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8 }, - { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16 }, - { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32 }, - { 0 } -}; - -Fl_Menu_Item quick_change_mfsk_exp[] = { - { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8 }, - { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16 }, - { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32 }, { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4 }, + { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8 }, + { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16 }, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11 }, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22 }, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31 }, + { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32 }, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64 }, { 0 } }; @@ -596,10 +589,7 @@ void init_modem(trx_mode mode) case MODE_MFSK32: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new mfsk(mode)); - if (progdefaults.experimental) - quick_change = quick_change_mfsk_exp; - else - quick_change = quick_change_mfsk; + quick_change = quick_change_mfsk; break; case MODE_MT63_500: case MODE_MT63_1000: case MODE_MT63_2000 : @@ -1339,16 +1329,14 @@ Fl_Menu_Item menu_[] = { {0,0,0,0,0,0,0,0,0}, {"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, -{ mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, -{ mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, -{ mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32, 0, FL_NORMAL_LABEL, 0, 14, 0}, -// experimental modes { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, +{ mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64, 0, FL_NORMAL_LABEL, 0, 14, 0}, - {0,0,0,0,0,0,0,0,0}, {"MT63", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, @@ -1464,36 +1452,6 @@ Fl_Menu_Item *getMenuItem(const char *caption) return item; } -void activate_experimental() -{ - Fl_Menu_Item *m_exp = 0; - if (progdefaults.experimental) { - if ((m_exp = getMenuItem(mode_info[MODE_MFSK4].name)) != 0) - m_exp->show(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK11].name)) != 0) - m_exp->show(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK22].name)) != 0) - m_exp->show(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK31].name)) != 0) - m_exp->show(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK64].name)) != 0) - m_exp->show(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK32].name)) != 0) - m_exp->flags |= FL_MENU_DIVIDER; - } else { - if ((m_exp = getMenuItem(mode_info[MODE_MFSK4].name)) != 0) - m_exp->hide(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK11].name)) != 0) - m_exp->hide(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK22].name)) != 0) - m_exp->hide(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK31].name)) != 0) - m_exp->hide(); - if ((m_exp = getMenuItem(mode_info[MODE_MFSK64].name)) != 0) - m_exp->hide(); - } -} - void activate_rig_menu_item(bool b) { Fl_Menu_Item *rig = getMenuItem("Rig"); @@ -1949,7 +1907,6 @@ void create_fl_digi_main() { scopeview->end(); scopeview->hide(); - activate_experimental(); } diff --git a/src/fileselector/fileselect.cxx b/src/fileselector/fileselect.cxx index ef827459..cea4bf20 100644 --- a/src/fileselector/fileselect.cxx +++ b/src/fileselector/fileselect.cxx @@ -103,8 +103,19 @@ const char* FSEL::select(const char* title, const char* filter, const char* def, { inst->chooser->title(title); inst->chooser->filter(filter); - if (def) - inst->chooser->preset_file(def); + if (def) { + string pathname = def; + string path = ""; + string name = ""; + size_t indx = pathname.rfind('/'); + if (indx != string::npos) { + name = pathname.substr(indx + 1); + path = pathname.substr(0, indx); + } else + name = def; + inst->chooser->preset_file(name.c_str()); + inst->chooser->directory(path.c_str()); + } inst->chooser->options(Fl_Native_File_Chooser::PREVIEW); inst->chooser->type(Fl_Native_File_Chooser::BROWSE_FILE); @@ -118,8 +129,19 @@ const char* FSEL::saveas(const char* title, const char* filter, const char* def, { inst->chooser->title(title); inst->chooser->filter(filter); - if (def) - inst->chooser->preset_file(def); + if (def) { + string pathname = def; + string path = ""; + string name = ""; + size_t indx = pathname.rfind('/'); + if (indx != string::npos) { + name = pathname.substr(indx + 1); + path = pathname.substr(0, indx); + } else + name = def; + inst->chooser->preset_file(name.c_str()); + inst->chooser->directory(path.c_str()); + } inst->chooser->options(Fl_Native_File_Chooser::SAVEAS_CONFIRM | Fl_Native_File_Chooser::NEW_FOLDER | Fl_Native_File_Chooser::PREVIEW); diff --git a/src/filters/filters.cxx b/src/filters/filters.cxx index adb3b7d3..f7c310c3 100644 --- a/src/filters/filters.cxx +++ b/src/filters/filters.cxx @@ -450,3 +450,83 @@ complex *sfft::run(const complex& input) return &bins[first]; } +// ============================================================================ +// Goertzel filter +// Optimized implementation of a DFT for a single frequency of interest +// SR = sample rate +// N = Block size (does not need to be a factor of 2!) +// bin size = SR / N +// K = frequency bin of interest = (N * freq / SR) +// N should be selected to make K an integer if possible +// +// Q0 = current sample +// Q1 = previous sample (1 delay) +// Q2 = previous sample (2 delay) +// w = (2 * pi * K / N) +// k1 = cos(w) +// k2 = sin(w) +// k3 = 2.0 * k1 + +// Q0, Q1, Q2 are initialized to zero +// Iterate N times: +// Q0 = k3*Q1 - Q2 + sample +// Q2 = Q1 +// Q1 = Q0 +// +// After N interations: +// real = (Q1 - Q2 * k1) +// imag = Q2 * k2 +// or +// mag = Q1*Q1 + Q2*Q2 - Q1*Q2*k1 +// ============================================================================ + +goertzel::goertzel(double sr, int n, int k) +{ + double w; + SR = sr; + K = k; + N = n; + w = 4.0 * M_PI * K / N; + k1 = cos(w); + k2 = sin(w); + k3 = 2.0 * k1; + Q0 = Q1 = Q2 = 0.0; + count = N; +} + +goertzel::~goertzel() +{ +} + +void goertzel::reset() +{ + Q0 = Q1 = Q2 = 0.0; + count = N; +} + +bool goertzel::run(double sample) +{ + Q0 = k1 * Q1 - Q2 + sample; + Q2 = Q1; + Q1 = Q0; + if (--count == 0) { + count = N; + return true; + } + return false; +} + +double goertzel::real() +{ + return (Q1 - Q2 * k1); +} + +double goertzel::imag() +{ + return (Q2 * k2); +} + +double goertzel::mag() +{ + return (Q1*Q1 - Q2*Q2 - Q1*Q2*k1); +} diff --git a/src/include/filters.h b/src/include/filters.h index 98bac0ad..6c39a68e 100644 --- a/src/include/filters.h +++ b/src/include/filters.h @@ -135,4 +135,31 @@ public: }; + +//============================================================================= +// Goertzel DFT +//============================================================================= + +class goertzel { +private: + double SR; + int K; + int N; + int count; + double Q0; + double Q1; + double Q2; + double k1; + double k2; + double k3; +public: + goertzel(double sr, int n, int k); + ~goertzel(); + void reset(); + bool run(double v); + double real(); + double imag(); + double mag(); +}; + #endif /* _FILTER_H */ diff --git a/src/main.cxx b/src/main.cxx index 56e5bbea..6d5b04b8 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -152,19 +152,16 @@ int main(int argc, char ** argv) setlocale(LC_TIME, ""); -#ifndef __CYGWIN__ - fl_filename_expand(szHomedir, 119, "$HOME/.fldigi/"); +#ifdef __CYGWIN__ + fl_filename_expand(szHomedir, 119, "$HOME/fldigi.files/"); + redirect_streams(HomeDir); + atexit(restore_streams); #else - fl_filename_expand(szHomedir, 119, "$APPDATA/fldigi/"); + fl_filename_expand(szHomedir, 119, "$HOME/.fldigi/"); #endif HomeDir = szHomedir; -#ifdef __CYGWIN__ - redirect_streams(HomeDir); - atexit(restore_streams); -#endif - - set_platform_ui(); + set_platform_ui(); generate_option_help(); generate_version_text(); @@ -316,9 +313,6 @@ void generate_option_help(void) { << " Look for configuration files in DIRECTORY\n" << " The default is: " << HomeDir << "\n\n" - << " --experimental\n" - << " enable experimental modes\n\n" - #ifndef __CYGWIN__ << " --rx-ipc-key KEY\n" << " Set the receive message queue key\n" @@ -765,10 +759,18 @@ double speed_test(int converter, unsigned repeat) src_simple(&src, SRC_SINC_FASTEST, 1); struct timespec t0, t1; +#ifdef _POSIX_MONOTONIC_CLOCK + clock_gettime(CLOCK_MONOTONIC, &t0); +#else clock_gettime(CLOCK_REALTIME, &t0); +#endif for (unsigned i = 0; i < repeat; i++) src_simple(&src, SRC_SINC_FASTEST, 1); +#ifdef _POSIX_MONOTONIC_CLOCK + clock_gettime(CLOCK_MONOTONIC, &t1); +#else clock_gettime(CLOCK_REALTIME, &t1); +#endif delete [] src.data_in; delete [] src.data_out; diff --git a/src/misc/macroedit.cxx b/src/misc/macroedit.cxx index ef0c9e7c..5d83754a 100644 --- a/src/misc/macroedit.cxx +++ b/src/misc/macroedit.cxx @@ -83,7 +83,7 @@ void loadBrowser(Fl_Widget *widget) { } glob_t gbuf; - glob(string(HomeDir).append("/scripts/*").c_str(), 0, NULL, &gbuf); + glob(string(HomeDir).append("scripts/*").c_str(), 0, NULL, &gbuf); if (gbuf.gl_pathc == 0) { globfree(&gbuf); return; diff --git a/src/misc/macros.cxx b/src/misc/macros.cxx index 29ee293e..1855d157 100644 --- a/src/misc/macros.cxx +++ b/src/misc/macros.cxx @@ -589,7 +589,7 @@ void MACROTEXT::loadDefault() void MACROTEXT::openMacroFile() { string deffilename = HomeDir; - deffilename.append("/macros.mdf"); + deffilename.append("macros.mdf"); const char *p = FSEL::select("Open macro file", "Fldigi macro definition file\t*.mdf", deffilename.c_str()); if (p) loadMacros(p); @@ -598,7 +598,7 @@ void MACROTEXT::openMacroFile() void MACROTEXT::saveMacroFile() { string deffilename = HomeDir; - deffilename.append("/macros.mdf"); + deffilename.append("macros.mdf"); const char *p = FSEL::saveas("Save macro file", "Fldigi macro definition file\t*.mdf", deffilename.c_str()); if (p) saveMacros(p); diff --git a/src/psk/psk.cxx b/src/psk/psk.cxx index f54f6f70..ce2ce58a 100644 --- a/src/psk/psk.cxx +++ b/src/psk/psk.cxx @@ -536,7 +536,6 @@ int psk::rx_process(const double *buf, int len) } } } - signalquality(); if (sigsearch) findsignal(); diff --git a/src/waterfall/colorbox.cxx b/src/waterfall/colorbox.cxx index f9f73eea..54ef065f 100644 --- a/src/waterfall/colorbox.cxx +++ b/src/waterfall/colorbox.cxx @@ -56,7 +56,7 @@ void loadPalette() FILE *clrfile = NULL; if (palfilename.size() == 0) { palfilename = HomeDir; - palfilename.append ("/fldigi.pal"); + palfilename.append ("fldigi.pal"); } const char *p = FSEL::select("Open palette", "Fldigi palette\t*.pal", palfilename.c_str()); if (!p) return; @@ -92,7 +92,7 @@ void savePalette() FILE *clrfile = NULL; if (palfilename.size() == 0) { palfilename = HomeDir; - palfilename.append ("/fldigi.pal"); + palfilename.append ("fldigi.pal"); } const char *p = FSEL::saveas("Save palette", "Fldigi palette\t*.pal", palfilename.c_str()); if (!p) return;