kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Merge with upstream
commit
9cb988133f
|
@ -16,8 +16,9 @@ Change Log:
|
|||
12) Fixes to mfsk picture mode decoding
|
||||
13) Changed frequency2 data file format, downward compatible
|
||||
14) Added FELD_SLOWHELL, FELD_HELLX5 and FELD_HELLX9 modems
|
||||
15 Added support to the PortAudio backend for separate capture and playback
|
||||
devices and sample rates
|
||||
15) Added support to the PortAudio backend for separate capture and playback
|
||||
devices and sample rates
|
||||
16) Added mt63 500/1000/2000 modes
|
||||
|
||||
2.09 1) Modified src/Makefile.am for FreeBSD name space clash
|
||||
2) Added psk multi-channel viewer with regex search capability
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
AC_COPYRIGHT([Copyright (C) 2007, 2008 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net)])
|
||||
|
||||
AC_PREREQ(2.61)
|
||||
AC_INIT([fldigi], [2.10K], [w1hkj AT w1hkj DOT com])
|
||||
AC_INIT([fldigi], [2.10L], [w1hkj AT w1hkj DOT com])
|
||||
AC_CONFIG_AUX_DIR([build-aux])
|
||||
|
||||
# define build, build_cpu, build_vendor, build_os
|
||||
|
|
|
@ -161,6 +161,9 @@ fldigi_SOURCES += \
|
|||
include/mixer.h \
|
||||
include/modem.h \
|
||||
include/morse.h \
|
||||
include/mt63base.h \
|
||||
include/mt63.h \
|
||||
include/dsp.h \
|
||||
include/newinstall.h \
|
||||
include/olivia.h \
|
||||
include/picture.h \
|
||||
|
@ -227,6 +230,9 @@ fldigi_SOURCES += \
|
|||
misc/threads.cxx \
|
||||
misc/timeops.cxx \
|
||||
misc/util.cxx \
|
||||
mt63/dsp.cxx \
|
||||
mt63/mt63.cxx \
|
||||
mt63/mt63base.cxx \
|
||||
olivia/olivia.cxx \
|
||||
psk/psk.cxx \
|
||||
psk/pskcoeff.cxx \
|
||||
|
@ -279,6 +285,12 @@ EXTRA_fldigi_SOURCES += \
|
|||
feld/FeldStyl-14.cxx \
|
||||
feld/FeldVert-14.cxx \
|
||||
feld/FeldWide-14.cxx \
|
||||
mt63/alias_1k.dat \
|
||||
mt63/alias_2k.dat \
|
||||
mt63/morse.dat \
|
||||
mt63/symbol.dat \
|
||||
mt63/alias_k5.dat \
|
||||
mt63/mt63intl.dat \
|
||||
trx/tune.cxx
|
||||
|
||||
# Additional non-source files that we distribute
|
||||
|
|
|
@ -1028,6 +1028,13 @@ progdefaults.changed = true;
|
|||
initViewer();
|
||||
}
|
||||
|
||||
Fl_Spinner *cntChannels=(Fl_Spinner *)0;
|
||||
|
||||
static void cb_cntChannels(Fl_Spinner* o, void*) {
|
||||
progdefaults.VIEWERchannels = (int)(o->value());
|
||||
initViewer();
|
||||
}
|
||||
|
||||
Fl_Spinner *cntStartFrequency=(Fl_Spinner *)0;
|
||||
|
||||
static void cb_cntStartFrequency(Fl_Spinner* o, void*) {
|
||||
|
@ -1036,13 +1043,6 @@ progdefaults.changed = true;
|
|||
initViewer();
|
||||
}
|
||||
|
||||
Fl_Spinner *cntChannels=(Fl_Spinner *)0;
|
||||
|
||||
static void cb_cntChannels(Fl_Spinner* o, void*) {
|
||||
progdefaults.VIEWERchannels = (int)(o->value());
|
||||
initViewer();
|
||||
}
|
||||
|
||||
Fl_Spinner *cntTimeout=(Fl_Spinner *)0;
|
||||
|
||||
static void cb_cntTimeout(Fl_Spinner* o, void*) {
|
||||
|
@ -1050,6 +1050,25 @@ static void cb_cntTimeout(Fl_Spinner* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabMT63=(Fl_Group *)0;
|
||||
|
||||
Fl_Check_Button *btnMT63_8bit=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnMT63_8bit(Fl_Check_Button* o, void*) {
|
||||
progdefaults.mt63_8bit = o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnmt63_interleave=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnmt63_interleave(Fl_Check_Button* o, void*) {
|
||||
if (o->value() == 1)
|
||||
progdefaults.mt63_interleave = 64;
|
||||
else
|
||||
progdefaults.mt63_interleave = 32;
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabRTTY=(Fl_Group *)0;
|
||||
|
||||
Fl_Choice *selShift=(Fl_Choice *)0;
|
||||
|
@ -1167,7 +1186,7 @@ static const char szStopBits[] = "1|1.5|2";
|
|||
static const char szOliviaTones[] = "2|4|8|16|32|64|128|256";
|
||||
static const char szOliviaBandwidth[] = "125|250|500|1000|2000";
|
||||
static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800";
|
||||
{ Fl_Double_Window* o = new Fl_Double_Window(400, 254, "fldigi - config");
|
||||
{ Fl_Double_Window* o = new Fl_Double_Window(400, 250, "fldigi - config");
|
||||
w = o;
|
||||
o->color(FL_DARK2);
|
||||
o->selection_color((Fl_Color)51);
|
||||
|
@ -1967,6 +1986,7 @@ fect after a restart.");
|
|||
{ Fl_Group* o = tabFeld = new Fl_Group(0, 50, 400, 170, "Feld");
|
||||
o->color((Fl_Color)51);
|
||||
o->selection_color((Fl_Color)51);
|
||||
o->hide();
|
||||
{ Fl_Choice* o = selHellFont = new Fl_Choice(175, 62, 122, 20, "Feld Hell Font:");
|
||||
o->down_box(FL_BORDER_BOX);
|
||||
o->labelfont(4);
|
||||
|
@ -2063,7 +2083,7 @@ fect after a restart.");
|
|||
}
|
||||
{ Fl_Group* o = tabPSK = new Fl_Group(0, 50, 400, 170, "Psk");
|
||||
o->hide();
|
||||
{ Fl_Counter* o = cntSearchRange = new Fl_Counter(25, 60, 80, 21, "Search Range");
|
||||
{ Fl_Counter* o = cntSearchRange = new Fl_Counter(120, 60, 80, 21, "Search Range");
|
||||
o->type(1);
|
||||
o->minimum(10);
|
||||
o->maximum(500);
|
||||
|
@ -2073,16 +2093,16 @@ fect after a restart.");
|
|||
o->align(FL_ALIGN_RIGHT);
|
||||
o->value(progdefaults.SearchRange);
|
||||
}
|
||||
{ Fl_Group* o = new Fl_Group(15, 87, 370, 53, "PskMail Server");
|
||||
{ Fl_Group* o = new Fl_Group(3, 175, 395, 43, "PskMail Server");
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
{ Fl_Check_Button* o = btnPSKmailSweetSpot = new Fl_Check_Button(20, 106, 130, 20, "use sweetspot");
|
||||
{ Fl_Check_Button* o = btnPSKmailSweetSpot = new Fl_Check_Button(25, 190, 130, 20, "use sweetspot");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->value(1);
|
||||
o->callback((Fl_Callback*)cb_btnPSKmailSweetSpot);
|
||||
o->value(progdefaults.PSKmailSweetSpot);
|
||||
}
|
||||
{ Fl_Counter* o = cntServerOffset = new Fl_Counter(150, 104, 80, 21, "Server Search Range");
|
||||
{ Fl_Counter* o = cntServerOffset = new Fl_Counter(165, 189, 80, 21, "Server Search Range");
|
||||
o->type(1);
|
||||
o->minimum(10);
|
||||
o->maximum(500);
|
||||
|
@ -2094,32 +2114,20 @@ fect after a restart.");
|
|||
}
|
||||
o->end();
|
||||
}
|
||||
o->end();
|
||||
}
|
||||
{ Fl_Group* o = new Fl_Group(0, 50, 400, 170, "PskViewer");
|
||||
o->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 390, 155);
|
||||
{ Fl_Group* o = new Fl_Group(3, 85, 395, 90, "Psk Viewer");
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
{ Fl_Check_Button* o = btnMarquee = new Fl_Check_Button(25, 87, 120, 15, "Marquee style");
|
||||
{ Fl_Check_Button* o = btnMarquee = new Fl_Check_Button(11, 110, 120, 15, "Marquee style");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->callback((Fl_Callback*)cb_btnMarquee);
|
||||
o->value(progdefaults.VIEWERmarquee);
|
||||
}
|
||||
{ Fl_Check_Button* o = btnShowFrequencies = new Fl_Check_Button(25, 125, 150, 15, "Show Frequencies");
|
||||
{ Fl_Check_Button* o = btnShowFrequencies = new Fl_Check_Button(11, 144, 109, 15, "Show Freq\'s");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->callback((Fl_Callback*)cb_btnShowFrequencies);
|
||||
o->value(progdefaults.VIEWERshowfreq);
|
||||
}
|
||||
{ Fl_Spinner* o = cntStartFrequency = new Fl_Spinner(190, 120, 60, 25, "Start Frequency:");
|
||||
o->callback((Fl_Callback*)cb_cntStartFrequency);
|
||||
o->align(FL_ALIGN_RIGHT);
|
||||
o->minimum(200);
|
||||
o->maximum(1000);
|
||||
o->step(100);
|
||||
o->value(progdefaults.VIEWERstart);
|
||||
}
|
||||
{ Fl_Spinner* o = cntChannels = new Fl_Spinner(190, 82, 50, 25, "# Channels:");
|
||||
{ Fl_Spinner* o = cntChannels = new Fl_Spinner(135, 140, 39, 25, "# Channels");
|
||||
o->callback((Fl_Callback*)cb_cntChannels);
|
||||
o->align(FL_ALIGN_RIGHT);
|
||||
o->minimum(5);
|
||||
|
@ -2127,7 +2135,15 @@ fect after a restart.");
|
|||
o->step(1);
|
||||
o->value(progdefaults.VIEWERchannels);
|
||||
}
|
||||
{ Fl_Spinner* o = cntTimeout = new Fl_Spinner(190, 155, 50, 25, "Aging (sec)");
|
||||
{ Fl_Spinner* o = cntStartFrequency = new Fl_Spinner(135, 105, 50, 25, "Start Freq");
|
||||
o->callback((Fl_Callback*)cb_cntStartFrequency);
|
||||
o->align(FL_ALIGN_RIGHT);
|
||||
o->minimum(200);
|
||||
o->maximum(1000);
|
||||
o->step(100);
|
||||
o->value(progdefaults.VIEWERstart);
|
||||
}
|
||||
{ Fl_Spinner* o = cntTimeout = new Fl_Spinner(261, 105, 50, 25, "Aging (sec)");
|
||||
o->callback((Fl_Callback*)cb_cntTimeout);
|
||||
o->align(FL_ALIGN_RIGHT);
|
||||
o->minimum(10);
|
||||
|
@ -2139,6 +2155,24 @@ fect after a restart.");
|
|||
}
|
||||
o->end();
|
||||
}
|
||||
{ Fl_Group* o = tabMT63 = new Fl_Group(0, 50, 400, 170, "MT-63");
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 390, 155);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
{ Fl_Check_Button* o = btnMT63_8bit = new Fl_Check_Button(55, 90, 163, 15, "8 bit extended chars");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->callback((Fl_Callback*)cb_btnMT63_8bit);
|
||||
o->value(progdefaults.mt63_8bit);
|
||||
}
|
||||
{ Fl_Check_Button* o = btnmt63_interleave = new Fl_Check_Button(55, 120, 165, 15, "64 bit interleave");
|
||||
o->down_box(FL_DOWN_BOX);
|
||||
o->callback((Fl_Callback*)cb_btnmt63_interleave);
|
||||
o->value(0);if (progdefaults.mt63_interleave == 64) o->value(1);
|
||||
}
|
||||
o->end();
|
||||
}
|
||||
o->end();
|
||||
}
|
||||
{ Fl_Group* o = tabRTTY = new Fl_Group(0, 50, 400, 170, "RTTY");
|
||||
o->color((Fl_Color)51);
|
||||
o->selection_color((Fl_Color)51);
|
||||
|
|
|
@ -35,7 +35,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
code {} {}
|
||||
Fl_Window {} {
|
||||
label {fldigi - config} open
|
||||
xywh {868 365 400 254} type Double color 45 selection_color 51 align 80 visible
|
||||
xywh {520 101 400 250} type Double color 45 selection_color 51 align 80 visible
|
||||
} {
|
||||
Fl_Tabs tabsConfigure {open
|
||||
xywh {0 0 405 220} color 47 selection_color 9
|
||||
|
@ -668,7 +668,7 @@ o->label((inpQRZuserpassword->type() & FL_SECRET_INPUT) ? "Show" : "Hide");}
|
|||
label OSS
|
||||
callback {update_sound_config(SND_IDX_OSS);
|
||||
progdefaults.changed = true;
|
||||
resetSoundCard();} selected
|
||||
resetSoundCard();}
|
||||
xywh {5 63 100 25} down_box DIAMOND_DOWN_BOX selection_color 1
|
||||
}
|
||||
Fl_Input_Choice menuOSSDev {
|
||||
|
@ -1052,7 +1052,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
Fl_Group tabFeld {
|
||||
label Feld open
|
||||
xywh {0 50 400 170} color 51 selection_color 51
|
||||
xywh {0 50 400 170} color 51 selection_color 51 hide
|
||||
} {
|
||||
Fl_Choice selHellFont {
|
||||
label {Feld Hell Font:}
|
||||
|
@ -1066,7 +1066,7 @@ progdefaults.changed = true;} open
|
|||
Fl_Value_Slider sldrHellBW {
|
||||
label {Filter BW}
|
||||
callback {active_modem->set_bandwidth(sldrHellBW->value());
|
||||
progdefaults.changed = true;} selected
|
||||
progdefaults.changed = true;}
|
||||
xywh {30 190 345 20} type Horizontal color 215 align 5 minimum 10 maximum 2400 step 5 value 400 textsize 14
|
||||
}
|
||||
Fl_Check_Button btnHellXmtWidth {
|
||||
|
@ -1162,18 +1162,18 @@ progdefaults.changed = true;}
|
|||
callback {progdefaults.SearchRange = (int)o->value();
|
||||
wf->redraw_marker();
|
||||
progdefaults.changed = true;}
|
||||
xywh {25 60 80 21} type Simple align 8 minimum 10 maximum 500 step 10 value 200
|
||||
xywh {120 60 80 21} type Simple align 8 minimum 10 maximum 500 step 10 value 200
|
||||
code0 {o->value(progdefaults.SearchRange);}
|
||||
}
|
||||
Fl_Group {} {
|
||||
label {PskMail Server} open
|
||||
xywh {15 87 370 53} box ENGRAVED_FRAME align 21
|
||||
xywh {3 175 395 43} box ENGRAVED_FRAME align 21
|
||||
} {
|
||||
Fl_Check_Button btnPSKmailSweetSpot {
|
||||
label {use sweetspot}
|
||||
callback {progdefaults.PSKmailSweetSpot = o->value();
|
||||
progdefaults.changed = true;}
|
||||
xywh {20 106 130 20} down_box DOWN_BOX value 1
|
||||
xywh {25 190 130 20} down_box DOWN_BOX value 1
|
||||
code0 {o->value(progdefaults.PSKmailSweetSpot);}
|
||||
}
|
||||
Fl_Counter cntServerOffset {
|
||||
|
@ -1181,60 +1181,56 @@ progdefaults.changed = true;}
|
|||
callback {progdefaults.ServerOffset = (int)o->value();
|
||||
wf->redraw_marker();
|
||||
progdefaults.changed = true;}
|
||||
xywh {150 104 80 21} type Simple align 8 minimum 10 maximum 500 step 10 value 200
|
||||
xywh {165 189 80 21} type Simple align 8 minimum 10 maximum 500 step 10 value 200
|
||||
code0 {o->value(progdefaults.SearchRange);}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group {} {
|
||||
label PskViewer open
|
||||
xywh {0 50 400 170} hide
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
xywh {5 60 390 155} box ENGRAVED_FRAME align 21
|
||||
Fl_Group {} {
|
||||
label {Psk Viewer} open
|
||||
xywh {3 85 395 90} box ENGRAVED_FRAME align 21
|
||||
} {
|
||||
Fl_Check_Button btnMarquee {
|
||||
label {Marquee style}
|
||||
callback {progdefaults.VIEWERmarquee = o->value();
|
||||
progdefaults.changed = true;
|
||||
initViewer();}
|
||||
xywh {25 87 120 15} down_box DOWN_BOX
|
||||
xywh {11 110 120 15} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.VIEWERmarquee);}
|
||||
}
|
||||
Fl_Check_Button btnShowFrequencies {
|
||||
label {Show Frequencies}
|
||||
label {Show Freq's}
|
||||
callback {progdefaults.VIEWERshowfreq = o->value();
|
||||
progdefaults.changed = true;
|
||||
initViewer();}
|
||||
xywh {25 125 150 15} down_box DOWN_BOX
|
||||
xywh {11 144 109 15} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.VIEWERshowfreq);}
|
||||
}
|
||||
Fl_Spinner cntStartFrequency {
|
||||
label {Start Frequency:}
|
||||
callback {progdefaults.VIEWERstart = (int)(o->value());
|
||||
progdefaults.changed = true;
|
||||
initViewer();}
|
||||
xywh {190 120 60 25} align 8
|
||||
code0 {o->minimum(200);}
|
||||
code1 {o->maximum(1000);}
|
||||
code2 {o->step(100);}
|
||||
code3 {o->value(progdefaults.VIEWERstart);}
|
||||
}
|
||||
Fl_Spinner cntChannels {
|
||||
label {\# Channels:}
|
||||
label {\# Channels}
|
||||
callback {progdefaults.VIEWERchannels = (int)(o->value());
|
||||
initViewer();}
|
||||
xywh {190 82 50 25} align 8
|
||||
xywh {135 140 39 25} align 8
|
||||
code0 {o->minimum(5);}
|
||||
code1 {o->maximum(30);}
|
||||
code2 {o->step(1);}
|
||||
code3 {o->value(progdefaults.VIEWERchannels);}
|
||||
}
|
||||
Fl_Spinner cntStartFrequency {
|
||||
label {Start Freq}
|
||||
callback {progdefaults.VIEWERstart = (int)(o->value());
|
||||
progdefaults.changed = true;
|
||||
initViewer();}
|
||||
xywh {135 105 50 25} align 8
|
||||
code0 {o->minimum(200);}
|
||||
code1 {o->maximum(1000);}
|
||||
code2 {o->step(100);}
|
||||
code3 {o->value(progdefaults.VIEWERstart);}
|
||||
}
|
||||
Fl_Spinner cntTimeout {
|
||||
label {Aging (sec)}
|
||||
callback {progdefaults.VIEWERtimeout = (int)(o->value());
|
||||
progdefaults.changed = true;}
|
||||
xywh {190 155 50 25} align 8
|
||||
xywh {261 105 50 25} align 8
|
||||
code0 {o->minimum(10);}
|
||||
code1 {o->maximum(180);}
|
||||
code2 {o->step(1);}
|
||||
|
@ -1242,6 +1238,32 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabMT63 {
|
||||
label {MT-63} open selected
|
||||
xywh {0 50 400 170}
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
xywh {5 60 390 155} box ENGRAVED_FRAME align 21
|
||||
} {
|
||||
Fl_Check_Button btnMT63_8bit {
|
||||
label {8 bit extended chars}
|
||||
callback {progdefaults.mt63_8bit = o->value();
|
||||
progdefaults.changed = true;}
|
||||
xywh {55 90 163 15} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.mt63_8bit);}
|
||||
}
|
||||
Fl_Check_Button btnmt63_interleave {
|
||||
label {64 bit interleave}
|
||||
callback {if (o->value() == 1)
|
||||
progdefaults.mt63_interleave = 64;
|
||||
else
|
||||
progdefaults.mt63_interleave = 32;
|
||||
progdefaults.changed = true;}
|
||||
xywh {55 120 165 15} down_box DOWN_BOX
|
||||
code0 {o->value(0);if (progdefaults.mt63_interleave == 64) o->value(1);}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabRTTY {
|
||||
label RTTY open
|
||||
xywh {0 50 400 170} color 51 selection_color 51 hide
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#include "psk.h"
|
||||
#include "cw.h"
|
||||
#include "mfsk.h"
|
||||
#include "mt63.h"
|
||||
#include "rtty.h"
|
||||
#include "olivia.h"
|
||||
#include "dominoex.h"
|
||||
|
@ -178,6 +179,13 @@ Fl_Menu_Item quick_change_mfsk[] = {
|
|||
{ 0 }
|
||||
};
|
||||
|
||||
Fl_Menu_Item quick_change_mt63[] = {
|
||||
{ mode_info[MODE_MT63_500].name, 0, cb_init_mode, (void *)MODE_MT63_500 },
|
||||
{ mode_info[MODE_MT63_1000].name, 0, cb_init_mode, (void *)MODE_MT63_1000 },
|
||||
{ mode_info[MODE_MT63_2000].name, 0, cb_init_mode, (void *)MODE_MT63_2000 },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
Fl_Menu_Item quick_change_domino[] = {
|
||||
{ mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4 },
|
||||
{ mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5 },
|
||||
|
@ -361,6 +369,13 @@ void init_modem(trx_mode mode)
|
|||
quick_change = quick_change_mfsk;
|
||||
break;
|
||||
|
||||
case MODE_MT63_500: case MODE_MT63_1000: case MODE_MT63_2000 :
|
||||
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
|
||||
*mode_info[mode].modem = new mt63(mode));
|
||||
quick_change = quick_change_mt63;
|
||||
modem_config_tab = tabMT63;
|
||||
break;
|
||||
|
||||
case MODE_BPSK31: case MODE_PSK63: case MODE_PSK125: case MODE_PSK250:
|
||||
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
|
||||
*mode_info[mode].modem = new psk(mode));
|
||||
|
@ -939,6 +954,12 @@ Fl_Menu_Item menu_[] = {
|
|||
{ mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 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},
|
||||
{ mode_info[MODE_MT63_500].name, 0, cb_init_mode, (void *)MODE_MT63_500, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_MT63_1000].name, 0, cb_init_mode, (void *)MODE_MT63_1000, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_MT63_2000].name, 0, cb_init_mode, (void *)MODE_MT63_2000, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{0,0,0,0,0,0,0,0,0},
|
||||
|
||||
{"PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_BPSK31].name, 0, cb_init_mode, (void *)MODE_BPSK31, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
|
@ -946,10 +967,8 @@ Fl_Menu_Item menu_[] = {
|
|||
{ mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
#ifdef USE250
|
||||
{ mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
#endif
|
||||
{0,0,0,0,0,0,0,0,0},
|
||||
|
||||
{ mode_info[MODE_OLIVIA].name, 0, cb_init_mode, (void *)MODE_OLIVIA, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
|
|
|
@ -63,6 +63,10 @@ const struct mode_info_t mode_info[NUM_MODES] = {
|
|||
{ MODE_MFSK8, &mfsk8_modem, "MFSK-8", "MFSK-8", "MFSK16" },
|
||||
{ MODE_MFSK16, &mfsk16_modem, "MFSK16", "MFSK-16", "MFSK8" },
|
||||
|
||||
{ MODE_MT63_500, &mt63_500_modem, "MT63-500", "MT63-500", "" },
|
||||
{ MODE_MT63_1000, &mt63_1000_modem, "MT63-1XX", "MT63-1000", "" },
|
||||
{ MODE_MT63_2000, &mt63_2000_modem, "MT63-2XX", "MT63-2000", "" },
|
||||
|
||||
{ MODE_BPSK31, &psk31_modem, "BPSK31", "BPSK-31", "PSK31" },
|
||||
{ MODE_QPSK31, &qpsk31_modem, "QPSK31", "QPSK-31", "QPSK31" },
|
||||
{ MODE_PSK63, &psk63_modem, "PSK-63", "BPSK-63", "PSK63" },
|
||||
|
@ -83,8 +87,6 @@ const struct mode_info_t mode_info[NUM_MODES] = {
|
|||
{ MODE_THROBX2, &throbx2_modem, "THRBX2", "ThrobX 2", "" },
|
||||
{ MODE_THROBX4, &throbx4_modem, "THRBX4", "ThrobX 4", "" },
|
||||
|
||||
// { MODE_MT63, 0, "MT63", "MT-63", "" },
|
||||
|
||||
{ MODE_WWV, &wwv_modem, "WWV", "WWV", "" },
|
||||
|
||||
{ MODE_ANALYSIS, &anal_modem, "ANALYSIS", "Freq Analysis", "" }
|
||||
|
|
|
@ -162,9 +162,12 @@ extern Fl_Check_Button *btnPSKmailSweetSpot;
|
|||
extern Fl_Counter *cntServerOffset;
|
||||
extern Fl_Check_Button *btnMarquee;
|
||||
extern Fl_Check_Button *btnShowFrequencies;
|
||||
extern Fl_Spinner *cntStartFrequency;
|
||||
extern Fl_Spinner *cntChannels;
|
||||
extern Fl_Spinner *cntStartFrequency;
|
||||
extern Fl_Spinner *cntTimeout;
|
||||
extern Fl_Group *tabMT63;
|
||||
extern Fl_Check_Button *btnMT63_8bit;
|
||||
extern Fl_Check_Button *btnmt63_interleave;
|
||||
extern Fl_Group *tabRTTY;
|
||||
extern Fl_Choice *selShift;
|
||||
extern Fl_Choice *selBaud;
|
||||
|
|
|
@ -66,7 +66,6 @@ struct configuration {
|
|||
double CWpost;
|
||||
bool CWid;
|
||||
int CWIDwpm;
|
||||
|
||||
// FELD-HELL
|
||||
bool FELD_IDLE;
|
||||
// OLIVIA
|
||||
|
@ -76,6 +75,9 @@ struct configuration {
|
|||
int oliviasinteg;
|
||||
// DOMINOEX
|
||||
double DOMINOEX_BW;
|
||||
// MT63
|
||||
bool mt63_8bit;
|
||||
int mt63_interleave;
|
||||
// User interface data
|
||||
int Fontnbr;
|
||||
int FontSize;
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -69,6 +69,10 @@ enum {
|
|||
MODE_MFSK8,
|
||||
MODE_MFSK16,
|
||||
|
||||
MODE_MT63_500,
|
||||
MODE_MT63_1000,
|
||||
MODE_MT63_2000,
|
||||
|
||||
MODE_BPSK31,
|
||||
MODE_QPSK31,
|
||||
MODE_PSK63,
|
||||
|
@ -89,8 +93,6 @@ enum {
|
|||
MODE_THROBX2,
|
||||
MODE_THROBX4,
|
||||
|
||||
// MODE_MT63,
|
||||
|
||||
MODE_WWV,
|
||||
MODE_ANALYSIS,
|
||||
|
||||
|
|
|
@ -181,6 +181,9 @@ public:
|
|||
extern modem *cw_modem;
|
||||
extern modem *mfsk8_modem;
|
||||
extern modem *mfsk16_modem;
|
||||
extern modem *mt63_500_modem;
|
||||
extern modem *mt63_1000_modem;
|
||||
extern modem *mt63_2000_modem;
|
||||
extern modem *feld_modem;
|
||||
extern modem *feld_slowmodem;
|
||||
extern modem *feld_x5modem;
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
//
|
||||
// mt63.h
|
||||
//
|
||||
// Copyright (C) 2006
|
||||
// Dave Freese, W1HKJ
|
||||
//
|
||||
// This file is part of fldigi. Adapted from code contained in gmfsk source code
|
||||
// distribution.
|
||||
// Copyright (C) 2005
|
||||
// Tomi Manninen (oh2bns@sral.fi)
|
||||
//
|
||||
// fldigi 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 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// fldigi 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 fldigi; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
//
|
||||
|
||||
#ifndef MT63_MODEM_H
|
||||
#define MT63_MODEM_H
|
||||
|
||||
#include "sound.h"
|
||||
#include "confdialog.h"
|
||||
#include "dsp.h"
|
||||
#include "mt63base.h"
|
||||
#include "trx.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class mt63 : public modem {
|
||||
private:
|
||||
int Interleave;
|
||||
int flush;
|
||||
int escape;
|
||||
|
||||
MT63tx *Tx;
|
||||
MT63rx *Rx;
|
||||
|
||||
dspLevelMonitor *InpLevel;
|
||||
double_buff *InpBuff;
|
||||
|
||||
public:
|
||||
mt63(trx_mode mode);
|
||||
~mt63();
|
||||
void init();
|
||||
void rx_init();
|
||||
void tx_init(SoundBase*);
|
||||
void restart();
|
||||
int rx_process(const double *buf, int len);
|
||||
int tx_process();
|
||||
};
|
||||
|
||||
|
||||
#endif
|
|
@ -0,0 +1,417 @@
|
|||
/*
|
||||
* mt63base.h -- MT63 transmitter and receiver in C++ for LINUX
|
||||
*
|
||||
* Copyright (c) 2007, 2008 Dave Freese, W1HKJ
|
||||
*
|
||||
* base class for use by fldigi
|
||||
* modified from original
|
||||
* excluded CW_ID which is a part of the base modem class for fldigi
|
||||
*
|
||||
* based on mt63 code by Pawel Jalocha
|
||||
* Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC
|
||||
* Copyright (c) 2007-2008 Dave Freese, W1HKJ
|
||||
*
|
||||
* This file is part of fldigi.
|
||||
*
|
||||
* fldigi 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* fldigi 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 MT63; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MT63BASE_H
|
||||
#define MT63BASE_H
|
||||
|
||||
// ==========================================================================
|
||||
// Morse Encoder
|
||||
/*
|
||||
class MorseEncoder
|
||||
{ public:
|
||||
MorseEncoder();
|
||||
~MorseEncoder();
|
||||
void Free(void);
|
||||
int SetTxMsg(char *Msg); // set the message to be transmitted
|
||||
int NextKey(void); // get the next key state (ON of OFF)
|
||||
private:
|
||||
char *TxMsg;
|
||||
int TxPtr;
|
||||
long Code;
|
||||
} ;
|
||||
*/
|
||||
|
||||
// ==========================================================================
|
||||
// Character encoder and block interleaver for the MT63 modem
|
||||
/*
|
||||
How to use this class:
|
||||
1. Create or declare an object like:
|
||||
MT63encoder Encoder;
|
||||
2. Preset the object for the given number of carriers and interleave:
|
||||
err=Encoder.Preset(<carriers>,<interleave>,<pattern>);
|
||||
MT63 uses 64 carriers and interleave of 32 or 64
|
||||
- the corresponding interleave patterns can be found in mt63.dat.
|
||||
If Encode.Preset() returns non-zero you are in big troubles !
|
||||
3. For each character to be encode you make the call:
|
||||
Encoder.Process(<character>);
|
||||
and you should then take the bits from the Encode.Output
|
||||
- these are the bits to be sent out on the carriers.
|
||||
(for MT63 logical 0 means carrier flip, logical 1 is no flip).
|
||||
4. At any time you can call Encoder.Preset() again to change the parameters
|
||||
(this will clean away the interleaver pipe).
|
||||
*/
|
||||
|
||||
// MT63 modem specific routines, made to be compatible with the MT63ASC.ASM
|
||||
// (c) 1999 Pawel Jalocha, SP9VRC, jalocha@hpdel1.ifj.edu.pl
|
||||
// Date: 05-NOV-1999
|
||||
|
||||
class MT63encoder
|
||||
{ public:
|
||||
MT63encoder();
|
||||
~MT63encoder();
|
||||
void Free();
|
||||
int Preset(int Carriers, int Intlv, int *Pattern, int RandFill=0);
|
||||
int Process(char code);
|
||||
char *Output;
|
||||
private:
|
||||
int DataCarriers;
|
||||
char CodeMask;
|
||||
int IntlvLen;
|
||||
int IntlvSize;
|
||||
int *IntlvPatt;
|
||||
char *IntlvPipe;
|
||||
int IntlvPtr;
|
||||
double *WalshBuff;
|
||||
} ;
|
||||
|
||||
// ==========================================================================
|
||||
// MT63 envelope (non-synchronous) time and frequency synchronizer
|
||||
// experimental status: looks like it's not good enough.
|
||||
/*
|
||||
class MT63sync
|
||||
{ public:
|
||||
MT63sync();
|
||||
~MT63sync();
|
||||
void Free(void);
|
||||
int Preset(int FFTlen, int FirstCarr, int CarrSepar, int Carriers, int Steps,
|
||||
int Margin, int Integ);
|
||||
int Process(dspCmpx *SpectraSlice);
|
||||
int SdspAmpleNow;
|
||||
int Locked;
|
||||
double FreqOfs;
|
||||
double TimeOfs;
|
||||
private:
|
||||
int FFTmask;
|
||||
int FirstDataCarr;
|
||||
int DataCarrSepar;
|
||||
int DataCarriers;
|
||||
int ScanMargin;
|
||||
int ScanFirst;
|
||||
int ScanLen;
|
||||
int StepsPerSymb;
|
||||
int ScanSize;
|
||||
double *PwrIntegMid,*PwrIntegOut;
|
||||
int IntegPtr;
|
||||
int NodspRMSize;
|
||||
double *NormPwr;
|
||||
// int SymbPtr;
|
||||
double W1,W2,W5;
|
||||
} ;
|
||||
*/
|
||||
// ==========================================================================
|
||||
// MT63 deinterleaver and decoder
|
||||
/*
|
||||
How to use this class:
|
||||
1. Create or declare an object:
|
||||
MT63decoder Decoder;
|
||||
2. Preset given parameters with Decoder.Preset();
|
||||
Decoder.Preset();
|
||||
Number of carriers and interleave are same as for MT63encoder.
|
||||
"Margin" is the number of extra carriers demodulated on the side
|
||||
because with the MT63 you cannot say with full confidence which
|
||||
is really the first carrier: the FEC decoder have to tell you this.
|
||||
"Integ" is the integration period to find the best FEC match.
|
||||
"Integ" is measured in MT63 symbols (at 1000 kHz we do 10 symbols/s).
|
||||
3. For each symbol period feed the demodulated data into the object:
|
||||
Decoder.Process(<data>);
|
||||
and then get the demodulated character code from Decoder.Output
|
||||
You can get as well the measured signal-to-noise ratio from Decoder.SNR
|
||||
and the index of the first carrier (according to the FEC match)
|
||||
from Decoder.CarrOfs
|
||||
4. You can change the parameters at any time with Decoder.Preset()
|
||||
(this will clean the data pipes).
|
||||
*/
|
||||
|
||||
class MT63decoder
|
||||
{ public:
|
||||
MT63decoder();
|
||||
~MT63decoder();
|
||||
void Free();
|
||||
int Preset(int Carriers, int Intlv, int *Pattern, int Margin, int Integ);
|
||||
int Process(double *Data);
|
||||
char Output;
|
||||
double SignalToNoise;
|
||||
int CarrOfs;
|
||||
|
||||
private:
|
||||
int DataCarriers;
|
||||
double *IntlvPipe;
|
||||
int IntlvLen;
|
||||
int IntlvSize;
|
||||
int IntlvPtr;
|
||||
int *IntlvPatt;
|
||||
|
||||
double *WalshBuff;
|
||||
|
||||
int ScanLen;
|
||||
int ScanSize;
|
||||
double *DecodeSnrMid,*DecodeSnrOut;
|
||||
double W1,W2,W5;
|
||||
char *DecodePipe;
|
||||
int DecodeLen;
|
||||
int DecodeSize;
|
||||
int DecodePtr;
|
||||
|
||||
} ;
|
||||
|
||||
// ==========================================================================
|
||||
// MT63 transmitter
|
||||
/*
|
||||
How to use this class:
|
||||
1. Create or declare an object:
|
||||
MT63tx Tx;
|
||||
2. Preset parameters:
|
||||
Tx.Preset(<bandwidth>,<interleave>);
|
||||
Allowed values are: bandwidth=500,1000,2000; interleave=0,1;
|
||||
Non-zero value returned means there was a problem...
|
||||
3. For each character to be sent:
|
||||
Tx.SendChar(<char>);
|
||||
After each call to SendChar() you must read the samples
|
||||
from the Tx.Comb.Output.Data, the number of samples to read
|
||||
is in Tx.Comb.Output.Len. They are in double floating point, so you should
|
||||
convert them to 16-bit integers and output them to your soundcard.
|
||||
4. If you have nothing to transmit, you must not stop, because
|
||||
you have to keep the sound going. MT63 transmits NL characters (code=0)
|
||||
in this case.
|
||||
5. When you are done with all the characters and you want to stop,
|
||||
you should still put some NL characters in to flush the interleave
|
||||
thus please call the Tx.SendChar() Tx.DataInterleave times
|
||||
(still add few more characters to flush the windowed IFFT buffers).
|
||||
After that the MT63 transmits a jamming dspSequence for some time
|
||||
to speed up carrier drop at the receiver: you do this by calling
|
||||
Tx.SendJam();
|
||||
6. You can transmit few symbols of silence by:
|
||||
Tx.SendSilence()
|
||||
to make a gracefull switch-off.
|
||||
Remember: each time you call SendChar(), SendJam() or SendSilence()
|
||||
you must send the contains of Tx.Comb.Output out to your soundcard.
|
||||
Each Tx.SendXxx() produces the amount of sound corresponding to one
|
||||
symbol time that is 0.1 second for the 1000 Hz mode.
|
||||
The soundcard output rate must be 8000 Hz, rather precisely,
|
||||
that is the error should be below 1 Hz. If it is not you should
|
||||
use the rate converter: look into mt63tx for an example.
|
||||
7. Inbetween transmissions you may change the settings by calling
|
||||
the Tx.Preset() again.
|
||||
*/
|
||||
|
||||
class MT63tx
|
||||
{ public:
|
||||
MT63tx(); ~MT63tx();
|
||||
void Free(void);
|
||||
int Preset(int BandWidth=1000, int LongInterleave=0);//, char *ID=NULL);
|
||||
int SendTune(void);
|
||||
int SendChar(char ch);
|
||||
int SendJam(void);
|
||||
int SendSilence(void);
|
||||
|
||||
private:
|
||||
int DataCarriers; // the number of data carriers
|
||||
int FirstDataCarr; // the FFT index of the first data carrier
|
||||
// int DataCarrSepar; // separation [FFT bins] between data carriers
|
||||
int WindowLen; // FFT window and symbol shape length
|
||||
double *TxWindow; // The shape of the FFT window (=symbol shape)
|
||||
// int SymbolSepar; // separation between symbols on a carrier
|
||||
int AliasFilterLen; // anti-alias filter length
|
||||
double *AliasShapeI,*AliasShapeQ; // and shapes
|
||||
int DecimateRatio; // decimation/interpolation after/before filter
|
||||
int *InterleavePattern; // how the bits of one block are placed on data carriers
|
||||
double TxdspAmpl; // dspAmplitude applied to generate a carrier (before IFFT)
|
||||
long CarrMarkCode;
|
||||
int CarrMarkdspAmpl;
|
||||
|
||||
// MorseEncoder CW_Coder; // CW encoder
|
||||
// char *CW_ID; // Morse Code identifier to be transmitted along the MT63 signal
|
||||
// int CW_Carr; // the carrier index to transmit the CW
|
||||
// double CW_dspAmpl; // CW dspAmplitude
|
||||
// int CW_dspPhase; // CW dspPhase
|
||||
// int CW_dspPhaseCorr; // CW dspPhase correction
|
||||
|
||||
MT63encoder Encoder; // data encode and interleaver
|
||||
int *TxVect; // modulator vector (dspPhases)
|
||||
int *dspPhaseCorr; // dspPhase corrections for each carrier
|
||||
dspCmpx_buff WindowBuff; // FFT/window buffer
|
||||
dsp_r2FFT FFT; // FFT engine
|
||||
dspCmpxOverlapWindow Window; // overlapping window
|
||||
int ProcessTxVect();
|
||||
|
||||
public:
|
||||
int DataInterleave;
|
||||
dspQuadrComb Comb; // the output of this module is in Comb.Output
|
||||
} ;
|
||||
|
||||
// ==========================================================================
|
||||
// MT63 receiver
|
||||
/*
|
||||
How to use this class:
|
||||
1. Declare the object:
|
||||
MT63rx Rx;
|
||||
2. Preset paramateres
|
||||
Rx.Preset(<bandwidth>,<interleave>,<integration>);
|
||||
For weak signals I recommend integration of 32 or more,
|
||||
otherwise 16 is enough. By the way, 16 means 1.6 second for 1000 Hz mode
|
||||
because then we transmit 10 symbols per second.
|
||||
3. Feed doubleing point sdspAmples into the Rx.Process, if you have signed 16-bit
|
||||
sdspAmples, you should convert them first to doubleing point - look at how
|
||||
I do it in mt63rx.cc
|
||||
4. After EACH new batch of sdspAmples
|
||||
you should look into Rx.Output for the decoded characters.
|
||||
You can egzamin the receiver status at any time by calling:
|
||||
Rx.SYNC_LockStatus() => logical value 0 or 1
|
||||
Rx.SYNC_Confidence() => lock confidence: a double between 0.0 and 1.0
|
||||
Rx.FEC_SNR() => signal-to-noise seen by FEC
|
||||
Rx.TotalFreqOffset() => measured frequency offset in [Hz]
|
||||
assuming 8000 Hz sdspAmpling
|
||||
*/
|
||||
|
||||
class MT63rx
|
||||
{ public:
|
||||
MT63rx(); ~MT63rx();
|
||||
void Free(void);
|
||||
int Preset(int BandWidth=1000, int LongInterleave=0, int Integ=16,
|
||||
void (*Display)(double *Spectra, int Len)=NULL);
|
||||
int Process(double_buff *Input);
|
||||
char_buff Output; // decoded characters
|
||||
|
||||
int SYNC_LockStatus(void); // 1 => locked, 0 => not locked
|
||||
double SYNC_Confidence(void); // lock confidence <0..1>
|
||||
double SYNC_FreqOffset(void);
|
||||
double SYNC_FreqDevdspRMS(void);
|
||||
double SYNC_TimeOffset(void);
|
||||
double TotalFreqOffset(); // Total frequency offset in [Hz]
|
||||
double FEC_SNR(void); // signal-to-noise ratio at the FEC
|
||||
int FEC_CarrOffset(void);
|
||||
|
||||
private:
|
||||
dspQuadrSplit InpSplit; // input filter, I/Q splitter, decimator
|
||||
dspCmpxMixer TestOfs; // frequency offset for tests
|
||||
|
||||
dspDelayLine<dspCmpx> ProcLine; // processing pipe
|
||||
int ProcdspDelay; // processing dspDelay for optimal symbol probing
|
||||
int SyncProcPtr; // sdspAmpling pointer for the synchronizer
|
||||
int DataProcPtr; // sdspAmpling pointer for the data demodulator
|
||||
|
||||
dsp_r2FFT FFT; // FFT engine
|
||||
int WindowLen; // FFT window length = symbol shape length
|
||||
int WindowLenMask; // WindowLen-1 for pointer wrapping
|
||||
double *RxWindow; // FFT window shape = symbol shape
|
||||
|
||||
void (*SpectraDisplay)(double *Spectra, int Len);
|
||||
double *SpectradspPower;
|
||||
|
||||
int AliasFilterLen; // anti-alias filter length
|
||||
double *AliasShapeI,*AliasShapeQ; // and shapes
|
||||
int DecimateRatio; // decimation/interpolation after/before filter
|
||||
|
||||
int *InterleavePattern; // how the bits of one block are placed on data carriers
|
||||
int DataInterleave; // data interleave depth
|
||||
|
||||
int DataCarriers; // number of carriers
|
||||
int FirstDataCarr; // the FFT index of the first data carrier
|
||||
// int DataCarrSepar; // freq. separation between carriers [FFT bins]
|
||||
long CarrMarkCode; // code to mark carriers (not in use here)
|
||||
// int SymbolSepar; // time separation between symbols [sdspAmples]
|
||||
int ScanMargin; // How many carriers up and down to search
|
||||
int IntegLen; // Over how many symbols we integrate to synchronize
|
||||
|
||||
int SymbolDiv; // =4 we probe the input 4 times per symbol time
|
||||
int SyncStep; // SymbolSepar/SymbolDiv
|
||||
int ScanFirst; // first carrier to scan
|
||||
int ScanLen; // number of carriers to scan
|
||||
|
||||
dspCmpx *FFTbuff;
|
||||
dspCmpx *FFTbuff2;
|
||||
|
||||
// here starts the time/frequency synchronizer
|
||||
void SyncProcess(dspCmpx *Slice);
|
||||
|
||||
dspCmpx *SyncPipe[4]; // FFT result buffer for sync.
|
||||
int SyncPtr; // wrapping pointer for SyncPipe and integrators
|
||||
int SymbPtr; // points about where the symbol is
|
||||
|
||||
dspCmpx *SyncPhCorr; // dspPhase corrections for the sync. processor
|
||||
|
||||
dspCmpx *CorrelMid[4], *CorrelOut[4]; // correlation integrator
|
||||
double *dspPowerMid, *dspPowerOut; // carrier dspPower integrator
|
||||
dspCmpx *CorrelNorm[4]; // normalized correlation
|
||||
double W1,W2,W5; // correlation integrator weights
|
||||
double W1p,W2p,W5p; // dspPower integrator weights
|
||||
|
||||
dspCmpx *CorrelAver[4]; // sliding sum to fit the carrier pattern
|
||||
int FitLen;
|
||||
|
||||
void DoCorrelSum(dspCmpx *Correl1, dspCmpx *Correl2, dspCmpx *Aver);
|
||||
|
||||
dspCmpx *SymbFit; // vectors to match symbol shift and confidence
|
||||
int SymbFitPos; // "smoothed" peak position
|
||||
|
||||
double *FreqPipe; // smoothing pipe for frequency offset
|
||||
dspCmpx *SymbPipe; // smoothing pipe for symbol shift
|
||||
int TrackPipeLen; // tracking pipe length
|
||||
int TrackPipePtr; // pipe pointer
|
||||
double AverFreq; // dspAveraged frequency
|
||||
dspCmpx AverSymb; // dspAveraged symbol dspPhase
|
||||
|
||||
double SyncLockThres; // lock confidence threshold
|
||||
double SyncHoldThres; // minimal confidence to hold the lock
|
||||
|
||||
int SyncLocked; // locked or not locked
|
||||
double SyncSymbConf; // current smoothed confidence
|
||||
double SyncFreqOfs; // current smoothed frequency offset
|
||||
double SyncFreqDev; // frequency deviation (dspRMS)
|
||||
double SyncSymbShift; // current smoothed symbol time shift
|
||||
|
||||
// here starts the data decoder
|
||||
void DataProcess(dspCmpx *EvenSlice, dspCmpx *OddSlice, double FreqOfs, int TimeDist);
|
||||
|
||||
int DataScanMargin; // +/- data carriers to scan for best FEC match
|
||||
int DataScanLen; // total number of data carriers being processed
|
||||
int DataScanFirst;
|
||||
|
||||
dspCmpx *RefDataSlice; // reference data slice for differential dspPhase decode
|
||||
dspCmpx *DataVect; // differentially decoded data vactor
|
||||
|
||||
int DataPipeLen; // pipe length
|
||||
int DataPipePtr; // wrapping pointer
|
||||
dspCmpx **DataPipe; // decoded vectors pipe
|
||||
double *DataPwrMid,*DataPwrOut; // carrier dspPower integrator
|
||||
dspCmpx *DataSqrMid,*DataSqrOut; // carrier complex square integrator
|
||||
double dW1,dW2,dW5; // integrator constants
|
||||
|
||||
double *DatadspPhase; // differential decoded dspPhases
|
||||
double *DatadspPhase2; // rather for debugging, not use otherwise
|
||||
|
||||
MT63decoder Decoder;
|
||||
|
||||
// MT63sync EnvSync; // envelope synchronizer (experimental)
|
||||
|
||||
} ;
|
||||
|
||||
#endif // MT63_BASE_H
|
|
@ -80,6 +80,9 @@ configuration progdefaults = {
|
|||
2, // int oliviasinteg
|
||||
// DOMINOEX
|
||||
2.0, // double DOMINOEX_BW;
|
||||
// MT63
|
||||
false, // bool mt63_8bit;
|
||||
32, // int mt63_interleave;
|
||||
//
|
||||
0, // int Fontnbr
|
||||
16, // int Fontsize
|
||||
|
|
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
* alias_1k.dat -- Anti-alias filter 1000 Hz bandwidth
|
||||
*
|
||||
* Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC
|
||||
*
|
||||
* This file is part of MT63.
|
||||
*
|
||||
* MT63 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MT63 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 MT63; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
// Filter coefficiants made by ALIAS.C for the following parameters:
|
||||
// FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1500.0
|
||||
// PassBandLow=375.0 PassBandUpp=1625.0 StopBandLow=0.0 StopBandUpp=2000.0
|
||||
// => PeakInStopBand=-90.99 dB
|
||||
// Programmers's scale factor: 2.000000
|
||||
// Programmers's comments: Anti-alias filter 1000 Hz bandwidth, decimation by 4
|
||||
|
||||
const int Alias_1k_Len=64;
|
||||
|
||||
double Alias_1k_I[Alias_1k_Len] = {
|
||||
+0.00003605 , // 0
|
||||
+0.00001835 , // 1
|
||||
-0.00022227 , // 2
|
||||
-0.00079785 , // 3
|
||||
-0.00099442 , // 4
|
||||
+0.00032296 , // 5
|
||||
+0.00276603 , // 6
|
||||
+0.00365685 , // 7
|
||||
+0.00128973 , // 8
|
||||
-0.00107943 , // 9
|
||||
+0.00195568 , // 10
|
||||
+0.00914871 , // 11
|
||||
+0.01100689 , // 12
|
||||
+0.00254789 , // 13
|
||||
-0.00580382 , // 14
|
||||
-0.00014844 , // 15
|
||||
+0.01341757 , // 16
|
||||
+0.01123057 , // 17
|
||||
-0.01328109 , // 18
|
||||
-0.03176715 , // 19
|
||||
-0.01791993 , // 20
|
||||
+0.00579429 , // 21
|
||||
-0.00986091 , // 22
|
||||
-0.06425601 , // 23
|
||||
-0.08967807 , // 24
|
||||
-0.04429128 , // 25
|
||||
+0.00513920 , // 26
|
||||
-0.04459511 , // 27
|
||||
-0.16886923 , // 28
|
||||
-0.19065374 , // 29
|
||||
+0.01930718 , // 30
|
||||
+0.34486939 , // 31
|
||||
+0.50345887 , // 32
|
||||
+0.34486939 , // 33
|
||||
+0.01930718 , // 34
|
||||
-0.19065374 , // 35
|
||||
-0.16886923 , // 36
|
||||
-0.04459511 , // 37
|
||||
+0.00513920 , // 38
|
||||
-0.04429128 , // 39
|
||||
-0.08967807 , // 40
|
||||
-0.06425601 , // 41
|
||||
-0.00986091 , // 42
|
||||
+0.00579429 , // 43
|
||||
-0.01791993 , // 44
|
||||
-0.03176715 , // 45
|
||||
-0.01328109 , // 46
|
||||
+0.01123057 , // 47
|
||||
+0.01341757 , // 48
|
||||
-0.00014844 , // 49
|
||||
-0.00580382 , // 50
|
||||
+0.00254789 , // 51
|
||||
+0.01100689 , // 52
|
||||
+0.00914871 , // 53
|
||||
+0.00195568 , // 54
|
||||
-0.00107943 , // 55
|
||||
+0.00128973 , // 56
|
||||
+0.00365685 , // 57
|
||||
+0.00276603 , // 58
|
||||
+0.00032296 , // 59
|
||||
-0.00099442 , // 60
|
||||
-0.00079785 , // 61
|
||||
-0.00022227 , // 62
|
||||
+0.00001835 // 63
|
||||
} ;
|
||||
|
||||
double Alias_1k_Q[Alias_1k_Len] = {
|
||||
-0.00000000 , // 0
|
||||
-0.00009527 , // 1
|
||||
-0.00023082 , // 2
|
||||
+0.00005162 , // 3
|
||||
+0.00123007 , // 4
|
||||
+0.00255193 , // 5
|
||||
+0.00207549 , // 6
|
||||
-0.00064302 , // 7
|
||||
-0.00244045 , // 8
|
||||
+0.00005205 , // 9
|
||||
+0.00410793 , // 10
|
||||
+0.00211830 , // 11
|
||||
-0.00729235 , // 12
|
||||
-0.01359800 , // 13
|
||||
-0.00757272 , // 14
|
||||
+0.00172023 , // 15
|
||||
-0.00460378 , // 16
|
||||
-0.02559228 , // 17
|
||||
-0.03408530 , // 18
|
||||
-0.01416468 , // 19
|
||||
+0.00731461 , // 20
|
||||
-0.00712536 , // 21
|
||||
-0.04328548 , // 22
|
||||
-0.04099291 , // 23
|
||||
+0.01821691 , // 24
|
||||
+0.06428190 , // 25
|
||||
+0.02790538 , // 26
|
||||
-0.03602086 , // 27
|
||||
+0.01583703 , // 28
|
||||
+0.22015579 , // 29
|
||||
+0.40003327 , // 30
|
||||
+0.32856209 , // 31
|
||||
-0.00000000 , // 32
|
||||
-0.32856209 , // 33
|
||||
-0.40003327 , // 34
|
||||
-0.22015579 , // 35
|
||||
-0.01583703 , // 36
|
||||
+0.03602086 , // 37
|
||||
-0.02790538 , // 38
|
||||
-0.06428190 , // 39
|
||||
-0.01821691 , // 40
|
||||
+0.04099291 , // 41
|
||||
+0.04328548 , // 42
|
||||
+0.00712536 , // 43
|
||||
-0.00731461 , // 44
|
||||
+0.01416468 , // 45
|
||||
+0.03408530 , // 46
|
||||
+0.02559228 , // 47
|
||||
+0.00460378 , // 48
|
||||
-0.00172023 , // 49
|
||||
+0.00757272 , // 50
|
||||
+0.01359800 , // 51
|
||||
+0.00729235 , // 52
|
||||
-0.00211830 , // 53
|
||||
-0.00410793 , // 54
|
||||
-0.00005205 , // 55
|
||||
+0.00244045 , // 56
|
||||
+0.00064302 , // 57
|
||||
-0.00207549 , // 58
|
||||
-0.00255193 , // 59
|
||||
-0.00123007 , // 60
|
||||
-0.00005162 , // 61
|
||||
+0.00023082 , // 62
|
||||
+0.00009527 // 63
|
||||
} ;
|
||||
|
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
* alias_2k.dat -- Anti-alias filter 2000 Hz bandwidth
|
||||
*
|
||||
* Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC
|
||||
*
|
||||
* This file is part of MT63.
|
||||
*
|
||||
* MT63 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MT63 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 MT63; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
// Filter coefficiants made by ALIAS.C for the following parameters:
|
||||
// FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=2500.0
|
||||
// PassBandLow=375.0 PassBandUpp=2625.0 StopBandLow=0.0 StopBandUpp=3000.0
|
||||
// => PeakInStopBand=-89.35 dB
|
||||
// Programmers's scale factor: 1.000000
|
||||
// Programmers's comments: Anti-alias filter 2000 Hz bandwidth, decimation by 2
|
||||
|
||||
const int Alias_2k_Len=64;
|
||||
|
||||
double Alias_2k_I[Alias_2k_Len] = {
|
||||
+0.00007244 , // 0
|
||||
+0.00002831 , // 1
|
||||
-0.00031179 , // 2
|
||||
-0.00027704 , // 3
|
||||
+0.00026218 , // 4
|
||||
-0.00057780 , // 5
|
||||
-0.00083336 , // 6
|
||||
+0.00119188 , // 7
|
||||
+0.00014945 , // 8
|
||||
-0.00077327 , // 9
|
||||
+0.00360739 , // 10
|
||||
+0.00224833 , // 11
|
||||
-0.00032116 , // 12
|
||||
+0.00696821 , // 13
|
||||
+0.00439713 , // 14
|
||||
-0.00157675 , // 15
|
||||
+0.00906983 , // 16
|
||||
+0.00372045 , // 17
|
||||
-0.00786599 , // 18
|
||||
+0.00735339 , // 19
|
||||
-0.00253048 , // 20
|
||||
-0.02189728 , // 21
|
||||
+0.00134354 , // 22
|
||||
-0.01477966 , // 23
|
||||
-0.04434362 , // 24
|
||||
-0.00479913 , // 25
|
||||
-0.03000591 , // 26
|
||||
-0.07609801 , // 27
|
||||
+0.00258946 , // 28
|
||||
-0.04271980 , // 29
|
||||
-0.14710769 , // 30
|
||||
+0.14198817 , // 31
|
||||
+0.42372962 , // 32
|
||||
+0.14198817 , // 33
|
||||
-0.14710769 , // 34
|
||||
-0.04271980 , // 35
|
||||
+0.00258946 , // 36
|
||||
-0.07609801 , // 37
|
||||
-0.03000591 , // 38
|
||||
-0.00479913 , // 39
|
||||
-0.04434362 , // 40
|
||||
-0.01477966 , // 41
|
||||
+0.00134354 , // 42
|
||||
-0.02189728 , // 43
|
||||
-0.00253048 , // 44
|
||||
+0.00735339 , // 45
|
||||
-0.00786599 , // 46
|
||||
+0.00372045 , // 47
|
||||
+0.00906983 , // 48
|
||||
-0.00157675 , // 49
|
||||
+0.00439713 , // 50
|
||||
+0.00696821 , // 51
|
||||
-0.00032116 , // 52
|
||||
+0.00224833 , // 53
|
||||
+0.00360739 , // 54
|
||||
-0.00077327 , // 55
|
||||
+0.00014945 , // 56
|
||||
+0.00119188 , // 57
|
||||
-0.00083336 , // 58
|
||||
-0.00057780 , // 59
|
||||
+0.00026218 , // 60
|
||||
-0.00027704 , // 61
|
||||
-0.00031179 , // 62
|
||||
+0.00002831 // 63
|
||||
} ;
|
||||
|
||||
double Alias_2k_Q[Alias_2k_Len] = {
|
||||
-0.00000000 , // 0
|
||||
-0.00015159 , // 1
|
||||
-0.00014608 , // 2
|
||||
+0.00036770 , // 3
|
||||
+0.00010339 , // 4
|
||||
-0.00031581 , // 5
|
||||
+0.00128580 , // 6
|
||||
+0.00120582 , // 7
|
||||
-0.00051862 , // 8
|
||||
+0.00225671 , // 9
|
||||
+0.00226918 , // 10
|
||||
-0.00216340 , // 11
|
||||
+0.00181728 , // 12
|
||||
+0.00176390 , // 13
|
||||
-0.00692361 , // 14
|
||||
-0.00105199 , // 15
|
||||
-0.00081355 , // 16
|
||||
-0.01498960 , // 17
|
||||
-0.00512332 , // 18
|
||||
-0.00331671 , // 19
|
||||
-0.02395357 , // 20
|
||||
-0.00602102 , // 21
|
||||
-0.00049919 , // 22
|
||||
-0.02943663 , // 23
|
||||
+0.00351421 , // 24
|
||||
+0.01576926 , // 25
|
||||
-0.02737092 , // 26
|
||||
+0.03572558 , // 27
|
||||
+0.06272088 , // 28
|
||||
-0.01659059 , // 29
|
||||
+0.15254255 , // 30
|
||||
+0.33394426 , // 31
|
||||
-0.00000000 , // 32
|
||||
-0.33394426 , // 33
|
||||
-0.15254255 , // 34
|
||||
+0.01659059 , // 35
|
||||
-0.06272088 , // 36
|
||||
-0.03572558 , // 37
|
||||
+0.02737092 , // 38
|
||||
-0.01576926 , // 39
|
||||
-0.00351421 , // 40
|
||||
+0.02943663 , // 41
|
||||
+0.00049919 , // 42
|
||||
+0.00602102 , // 43
|
||||
+0.02395357 , // 44
|
||||
+0.00331671 , // 45
|
||||
+0.00512332 , // 46
|
||||
+0.01498960 , // 47
|
||||
+0.00081355 , // 48
|
||||
+0.00105199 , // 49
|
||||
+0.00692361 , // 50
|
||||
-0.00176390 , // 51
|
||||
-0.00181728 , // 52
|
||||
+0.00216340 , // 53
|
||||
-0.00226918 , // 54
|
||||
-0.00225671 , // 55
|
||||
+0.00051862 , // 56
|
||||
-0.00120582 , // 57
|
||||
-0.00128580 , // 58
|
||||
+0.00031581 , // 59
|
||||
-0.00010339 , // 60
|
||||
-0.00036770 , // 61
|
||||
+0.00014608 , // 62
|
||||
+0.00015159 // 63
|
||||
} ;
|
||||
|
|
@ -0,0 +1,294 @@
|
|||
/*
|
||||
* alias_k5.dat -- Anti-alias filter 500 Hz bandwidth
|
||||
*
|
||||
* Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC
|
||||
*
|
||||
* This file is part of MT63.
|
||||
*
|
||||
* MT63 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MT63 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 MT63; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
// Filter coefficiants made by ALIAS.C for the following parameters:
|
||||
// FilterLen=128 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1000.0
|
||||
// PassBandLow=437.5 PassBandUpp=1062.5 StopBandLow=250.0 StopBandUpp=1250.0
|
||||
// => PeakInStopBand=-86.20 dB
|
||||
// Programmers's scale factor: 4.000000
|
||||
// Programmers's comments: Anti-alias filter 500 Hz bandwidth, decimation by 8
|
||||
|
||||
const int Alias_k5_Len=128;
|
||||
|
||||
double Alias_k5_I[Alias_k5_Len] = {
|
||||
+0.00006549 , // 0
|
||||
+0.00007616 , // 1
|
||||
+0.00006321 , // 2
|
||||
-0.00007051 , // 3
|
||||
-0.00037947 , // 4
|
||||
-0.00077842 , // 5
|
||||
-0.00101934 , // 6
|
||||
-0.00079747 , // 7
|
||||
+0.00003634 , // 8
|
||||
+0.00128166 , // 9
|
||||
+0.00238256 , // 10
|
||||
+0.00269672 , // 11
|
||||
+0.00193090 , // 12
|
||||
+0.00045168 , // 13
|
||||
-0.00082397 , // 14
|
||||
-0.00100872 , // 15
|
||||
+0.00002675 , // 16
|
||||
+0.00132515 , // 17
|
||||
+0.00130571 , // 18
|
||||
-0.00111559 , // 19
|
||||
-0.00545495 , // 20
|
||||
-0.00950601 , // 21
|
||||
-0.01047729 , // 22
|
||||
-0.00687776 , // 23
|
||||
+0.00011406 , // 24
|
||||
+0.00696202 , // 25
|
||||
+0.00989474 , // 26
|
||||
+0.00760013 , // 27
|
||||
+0.00255231 , // 28
|
||||
-0.00031461 , // 29
|
||||
+0.00291281 , // 30
|
||||
+0.01174794 , // 31
|
||||
+0.02064676 , // 32
|
||||
+0.02211535 , // 33
|
||||
+0.01194783 , // 34
|
||||
-0.00696440 , // 35
|
||||
-0.02537662 , // 36
|
||||
-0.03322892 , // 37
|
||||
-0.02665276 , // 38
|
||||
-0.01145836 , // 39
|
||||
+0.00006418 , // 40
|
||||
-0.00230763 , // 41
|
||||
-0.01840573 , // 42
|
||||
-0.03588720 , // 43
|
||||
-0.03743444 , // 44
|
||||
-0.01306806 , // 45
|
||||
+0.03074821 , // 46
|
||||
+0.07251687 , // 47
|
||||
+0.08836159 , // 48
|
||||
+0.06850261 , // 49
|
||||
+0.02612053 , // 50
|
||||
-0.00913110 , // 51
|
||||
-0.01081820 , // 52
|
||||
+0.02342696 , // 53
|
||||
+0.06482083 , // 54
|
||||
+0.06779523 , // 55
|
||||
-0.00021458 , // 56
|
||||
-0.13123843 , // 57
|
||||
-0.27054300 , // 58
|
||||
-0.33962227 , // 59
|
||||
-0.27857291 , // 60
|
||||
-0.08448838 , // 61
|
||||
+0.17772565 , // 62
|
||||
+0.40136534 , // 63
|
||||
+0.48897105 , // 64
|
||||
+0.40136534 , // 65
|
||||
+0.17772565 , // 66
|
||||
-0.08448838 , // 67
|
||||
-0.27857291 , // 68
|
||||
-0.33962227 , // 69
|
||||
-0.27054300 , // 70
|
||||
-0.13123843 , // 71
|
||||
-0.00021458 , // 72
|
||||
+0.06779523 , // 73
|
||||
+0.06482083 , // 74
|
||||
+0.02342696 , // 75
|
||||
-0.01081820 , // 76
|
||||
-0.00913110 , // 77
|
||||
+0.02612053 , // 78
|
||||
+0.06850261 , // 79
|
||||
+0.08836159 , // 80
|
||||
+0.07251687 , // 81
|
||||
+0.03074821 , // 82
|
||||
-0.01306806 , // 83
|
||||
-0.03743444 , // 84
|
||||
-0.03588720 , // 85
|
||||
-0.01840573 , // 86
|
||||
-0.00230763 , // 87
|
||||
+0.00006418 , // 88
|
||||
-0.01145836 , // 89
|
||||
-0.02665276 , // 90
|
||||
-0.03322892 , // 91
|
||||
-0.02537662 , // 92
|
||||
-0.00696440 , // 93
|
||||
+0.01194783 , // 94
|
||||
+0.02211535 , // 95
|
||||
+0.02064676 , // 96
|
||||
+0.01174794 , // 97
|
||||
+0.00291281 , // 98
|
||||
-0.00031461 , // 99
|
||||
+0.00255231 , // 100
|
||||
+0.00760013 , // 101
|
||||
+0.00989474 , // 102
|
||||
+0.00696202 , // 103
|
||||
+0.00011406 , // 104
|
||||
-0.00687776 , // 105
|
||||
-0.01047729 , // 106
|
||||
-0.00950601 , // 107
|
||||
-0.00545495 , // 108
|
||||
-0.00111559 , // 109
|
||||
+0.00130571 , // 110
|
||||
+0.00132515 , // 111
|
||||
+0.00002675 , // 112
|
||||
-0.00100872 , // 113
|
||||
-0.00082397 , // 114
|
||||
+0.00045168 , // 115
|
||||
+0.00193090 , // 116
|
||||
+0.00269672 , // 117
|
||||
+0.00238256 , // 118
|
||||
+0.00128166 , // 119
|
||||
+0.00003634 , // 120
|
||||
-0.00079747 , // 121
|
||||
-0.00101934 , // 122
|
||||
-0.00077842 , // 123
|
||||
-0.00037947 , // 124
|
||||
-0.00007051 , // 125
|
||||
+0.00006321 , // 126
|
||||
+0.00007616 // 127
|
||||
} ;
|
||||
|
||||
double Alias_k5_Q[Alias_k5_Len] = {
|
||||
-0.00000000 , // 0
|
||||
-0.00005367 , // 1
|
||||
-0.00016555 , // 2
|
||||
-0.00031225 , // 3
|
||||
-0.00036198 , // 4
|
||||
-0.00013710 , // 5
|
||||
+0.00044740 , // 6
|
||||
+0.00124698 , // 7
|
||||
+0.00186810 , // 8
|
||||
+0.00184150 , // 9
|
||||
+0.00093521 , // 10
|
||||
-0.00058853 , // 11
|
||||
-0.00200435 , // 12
|
||||
-0.00252488 , // 13
|
||||
-0.00187551 , // 14
|
||||
-0.00063367 , // 15
|
||||
+0.00001967 , // 16
|
||||
-0.00088264 , // 17
|
||||
-0.00319853 , // 18
|
||||
-0.00540709 , // 19
|
||||
-0.00536877 , // 20
|
||||
-0.00180828 , // 21
|
||||
+0.00444555 , // 22
|
||||
+0.01048985 , // 23
|
||||
+0.01293826 , // 24
|
||||
+0.01021951 , // 25
|
||||
+0.00399079 , // 26
|
||||
-0.00159281 , // 27
|
||||
-0.00262530 , // 28
|
||||
+0.00149295 , // 29
|
||||
+0.00697645 , // 30
|
||||
+0.00777564 , // 31
|
||||
-0.00010048 , // 32
|
||||
-0.01493909 , // 33
|
||||
-0.02926626 , // 34
|
||||
-0.03410235 , // 35
|
||||
-0.02512027 , // 36
|
||||
-0.00643493 , // 37
|
||||
+0.01119978 , // 38
|
||||
+0.01734888 , // 39
|
||||
+0.00962767 , // 40
|
||||
-0.00347093 , // 41
|
||||
-0.00757142 , // 42
|
||||
+0.00724618 , // 43
|
||||
+0.03765704 , // 44
|
||||
+0.06671856 , // 45
|
||||
+0.07363882 , // 46
|
||||
+0.04816692 , // 47
|
||||
-0.00023240 , // 48
|
||||
-0.04602175 , // 49
|
||||
-0.06349448 , // 50
|
||||
-0.04533960 , // 51
|
||||
-0.01075524 , // 52
|
||||
+0.00463299 , // 53
|
||||
-0.02695458 , // 54
|
||||
-0.10175325 , // 55
|
||||
-0.17821917 , // 56
|
||||
-0.19595859 , // 57
|
||||
-0.11176981 , // 58
|
||||
+0.06782857 , // 59
|
||||
+0.27891973 , // 60
|
||||
+0.42579279 , // 61
|
||||
+0.42868878 , // 62
|
||||
+0.26809297 , // 63
|
||||
-0.00000000 , // 64
|
||||
-0.26809297 , // 65
|
||||
-0.42868878 , // 66
|
||||
-0.42579279 , // 67
|
||||
-0.27891973 , // 68
|
||||
-0.06782857 , // 69
|
||||
+0.11176981 , // 70
|
||||
+0.19595859 , // 71
|
||||
+0.17821917 , // 72
|
||||
+0.10175325 , // 73
|
||||
+0.02695458 , // 74
|
||||
-0.00463299 , // 75
|
||||
+0.01075524 , // 76
|
||||
+0.04533960 , // 77
|
||||
+0.06349448 , // 78
|
||||
+0.04602175 , // 79
|
||||
+0.00023240 , // 80
|
||||
-0.04816692 , // 81
|
||||
-0.07363882 , // 82
|
||||
-0.06671856 , // 83
|
||||
-0.03765704 , // 84
|
||||
-0.00724618 , // 85
|
||||
+0.00757142 , // 86
|
||||
+0.00347093 , // 87
|
||||
-0.00962767 , // 88
|
||||
-0.01734888 , // 89
|
||||
-0.01119978 , // 90
|
||||
+0.00643493 , // 91
|
||||
+0.02512027 , // 92
|
||||
+0.03410235 , // 93
|
||||
+0.02926626 , // 94
|
||||
+0.01493909 , // 95
|
||||
+0.00010048 , // 96
|
||||
-0.00777564 , // 97
|
||||
-0.00697645 , // 98
|
||||
-0.00149295 , // 99
|
||||
+0.00262530 , // 100
|
||||
+0.00159281 , // 101
|
||||
-0.00399079 , // 102
|
||||
-0.01021951 , // 103
|
||||
-0.01293826 , // 104
|
||||
-0.01048985 , // 105
|
||||
-0.00444555 , // 106
|
||||
+0.00180828 , // 107
|
||||
+0.00536877 , // 108
|
||||
+0.00540709 , // 109
|
||||
+0.00319853 , // 110
|
||||
+0.00088264 , // 111
|
||||
-0.00001967 , // 112
|
||||
+0.00063367 , // 113
|
||||
+0.00187551 , // 114
|
||||
+0.00252488 , // 115
|
||||
+0.00200435 , // 116
|
||||
+0.00058853 , // 117
|
||||
-0.00093521 , // 118
|
||||
-0.00184150 , // 119
|
||||
-0.00186810 , // 120
|
||||
-0.00124698 , // 121
|
||||
-0.00044740 , // 122
|
||||
+0.00013710 , // 123
|
||||
+0.00036198 , // 124
|
||||
+0.00031225 , // 125
|
||||
+0.00016555 , // 126
|
||||
+0.00005367 // 127
|
||||
} ;
|
||||
|
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,140 @@
|
|||
// computer readable Morse code table
|
||||
//
|
||||
// For a given character you should pick up a 31-bit code from the table.
|
||||
// Bits should be taken starting from the LSB.
|
||||
// Bit equal 1 means carrier ON, bit 0 means carrier off
|
||||
// Each code includes one quiet dot at the start and two at the end.
|
||||
// The code should be read until the last '1',
|
||||
// but this last '1' must not be transmitted
|
||||
//
|
||||
const int MorseTableSize=128;
|
||||
long MorseTable[MorseTableSize] = {
|
||||
0x00000004L , // 0x00
|
||||
0x00000004L , // 0x01
|
||||
0x00000004L , // 0x02
|
||||
0x00000004L , // 0x03
|
||||
0x00000004L , // 0x04
|
||||
0x00000004L , // 0x05
|
||||
0x00000004L , // 0x06
|
||||
0x00000004L , // 0x07
|
||||
0x00000004L , // 0x08
|
||||
0x00000004L , // 0x09
|
||||
0x00000004L , // 0x0A
|
||||
0x00000004L , // 0x0B
|
||||
0x00000004L , // 0x0C
|
||||
0x00000004L , // 0x0D
|
||||
0x00000004L , // 0x0E
|
||||
0x00000004L , // 0x0F
|
||||
0x00000004L , // 0x10
|
||||
0x00000004L , // 0x11
|
||||
0x00000004L , // 0x12
|
||||
0x00000004L , // 0x13
|
||||
0x00000004L , // 0x14
|
||||
0x00000004L , // 0x15
|
||||
0x00000004L , // 0x16
|
||||
0x00000004L , // 0x17
|
||||
0x00000004L , // 0x18
|
||||
0x00000004L , // 0x19
|
||||
0x00000004L , // 0x1A
|
||||
0x00000004L , // 0x1B
|
||||
0x00000004L , // 0x1C
|
||||
0x00000004L , // 0x1D
|
||||
0x00000004L , // 0x1E
|
||||
0x00000004L , // 0x1F
|
||||
0x00000004L , // 0x20 = ' '
|
||||
0x00000004L , // 0x21 = '!'
|
||||
0x00000004L , // 0x22 = '"'
|
||||
0x00000004L , // 0x23 = '#'
|
||||
0x0013ABAAL , // 0x24 = '$'
|
||||
0x00000004L , // 0x25 = '%'
|
||||
0x00000004L , // 0x26 = '&'
|
||||
0x004BBBBAL , // 0x27 = '''
|
||||
0x0004BBAEL , // 0x28 = '('
|
||||
0x004EBBAEL , // 0x29 = ')'
|
||||
0x0004BABAL , // 0x2A = '*'
|
||||
0x00012EBAL , // 0x2B = '+'
|
||||
0x004EEAEEL , // 0x2C = ','
|
||||
0x0004EAAEL , // 0x2D = '-'
|
||||
0x0013AEBAL , // 0x2E = '.'
|
||||
0x00012EAEL , // 0x2F = '/'
|
||||
0x004EEEEEL , // 0x30 = '0'
|
||||
0x0013BBBAL , // 0x31 = '1'
|
||||
0x0004EEEAL , // 0x32 = '2'
|
||||
0x00013BAAL , // 0x33 = '3'
|
||||
0x00004EAAL , // 0x34 = '4'
|
||||
0x000012AAL , // 0x35 = '5'
|
||||
0x00004AAEL , // 0x36 = '6'
|
||||
0x00012AEEL , // 0x37 = '7'
|
||||
0x0004AEEEL , // 0x38 = '8'
|
||||
0x0012EEEEL , // 0x39 = '9'
|
||||
0x0012AEEEL , // 0x3A = ':'
|
||||
0x0012EBAEL , // 0x3B = ';'
|
||||
0x00000004L , // 0x3C = '<'
|
||||
0x00013AAEL , // 0x3D = '='
|
||||
0x00000004L , // 0x3E = '>'
|
||||
0x0004AEEAL , // 0x3F = '?'
|
||||
0x00000004L , // 0x40 = '@'
|
||||
0x0000013AL , // 0x41 = 'A'
|
||||
0x000012AEL , // 0x42 = 'B'
|
||||
0x00004BAEL , // 0x43 = 'C'
|
||||
0x000004AEL , // 0x44 = 'D'
|
||||
0x00000012L , // 0x45 = 'E'
|
||||
0x000012EAL , // 0x46 = 'F'
|
||||
0x000012EEL , // 0x47 = 'G'
|
||||
0x000004AAL , // 0x48 = 'H'
|
||||
0x0000004AL , // 0x49 = 'I'
|
||||
0x00013BBAL , // 0x4A = 'J'
|
||||
0x000013AEL , // 0x4B = 'K'
|
||||
0x000012BAL , // 0x4C = 'L'
|
||||
0x000004EEL , // 0x4D = 'M'
|
||||
0x0000012EL , // 0x4E = 'N'
|
||||
0x00004EEEL , // 0x4F = 'O'
|
||||
0x00004BBAL , // 0x50 = 'P'
|
||||
0x00013AEEL , // 0x51 = 'Q'
|
||||
0x000004BAL , // 0x52 = 'R'
|
||||
0x0000012AL , // 0x53 = 'S'
|
||||
0x0000004EL , // 0x54 = 'T'
|
||||
0x000004EAL , // 0x55 = 'U'
|
||||
0x000013AAL , // 0x56 = 'V'
|
||||
0x000013BAL , // 0x57 = 'W'
|
||||
0x00004EAEL , // 0x58 = 'X'
|
||||
0x00013BAEL , // 0x59 = 'Y'
|
||||
0x00004AEEL , // 0x5A = 'Z'
|
||||
0x00000004L , // 0x5B = '['
|
||||
0x00000004L , // 0x5C = '\'
|
||||
0x00000004L , // 0x5D = ']'
|
||||
0x00000004L , // 0x5E = '^'
|
||||
0x0013AEEAL , // 0x5F = '_'
|
||||
0x00000004L , // 0x60 = '`'
|
||||
0x0000013AL , // 0x61 = 'a'
|
||||
0x000012AEL , // 0x62 = 'b'
|
||||
0x00004BAEL , // 0x63 = 'c'
|
||||
0x000004AEL , // 0x64 = 'd'
|
||||
0x00000012L , // 0x65 = 'e'
|
||||
0x000012EAL , // 0x66 = 'f'
|
||||
0x000012EEL , // 0x67 = 'g'
|
||||
0x000004AAL , // 0x68 = 'h'
|
||||
0x0000004AL , // 0x69 = 'i'
|
||||
0x00013BBAL , // 0x6A = 'j'
|
||||
0x000013AEL , // 0x6B = 'k'
|
||||
0x000012BAL , // 0x6C = 'l'
|
||||
0x000004EEL , // 0x6D = 'm'
|
||||
0x0000012EL , // 0x6E = 'n'
|
||||
0x00004EEEL , // 0x6F = 'o'
|
||||
0x00004BBAL , // 0x70 = 'p'
|
||||
0x00013AEEL , // 0x71 = 'q'
|
||||
0x000004BAL , // 0x72 = 'r'
|
||||
0x0000012AL , // 0x73 = 's'
|
||||
0x0000004EL , // 0x74 = 't'
|
||||
0x000004EAL , // 0x75 = 'u'
|
||||
0x000013AAL , // 0x76 = 'v'
|
||||
0x000013BAL , // 0x77 = 'w'
|
||||
0x00004EAEL , // 0x78 = 'x'
|
||||
0x00013BAEL , // 0x79 = 'y'
|
||||
0x00004AEEL , // 0x7A = 'z'
|
||||
0x00000004L , // 0x7B = '{'
|
||||
0x00000004L , // 0x7C = '|'
|
||||
0x00000004L , // 0x7D = '}'
|
||||
0x00000004L , // 0x7E = '~'
|
||||
0x00000004L // 0x7F = ''
|
||||
} ;
|
|
@ -0,0 +1,241 @@
|
|||
//=============================================================================
|
||||
//
|
||||
// mt63.cxx -- MT63 modem for fldigi
|
||||
//
|
||||
// Copyright (C) 2007, 2008
|
||||
// Dave Freese, W1HKJ
|
||||
//
|
||||
// This file is part of fldigi
|
||||
//
|
||||
// fldigi 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 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// fldigi 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 gMFSK; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
//=============================================================================
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <string>
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/fl_ask.H>
|
||||
|
||||
#include "mt63.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
static int IntegLen = 32; // integration period for sync./data tracking
|
||||
|
||||
void mt63::tx_init(SoundBase *sb)
|
||||
{
|
||||
scard = sb;
|
||||
// int err;
|
||||
// err = Tx->Preset((int)bandwidth, Interleave);
|
||||
// if (err)
|
||||
// fprintf(stderr, "mt63_txinit: init failed\n");
|
||||
set_freq(500.0 + bandwidth / 2.0);
|
||||
flush = Tx->DataInterleave;
|
||||
}
|
||||
|
||||
void mt63::rx_init()
|
||||
{
|
||||
// int err;
|
||||
// err = Rx->Preset((int)bandwidth, Interleave, IntegLen);
|
||||
// if (err)
|
||||
// fprintf(stderr, "mt63_rxinit: init failed\n");
|
||||
set_freq(500.0 + bandwidth / 2.0);
|
||||
InpLevel->Preset(64.0, 0.75);
|
||||
escape = 0;
|
||||
}
|
||||
|
||||
int mt63::tx_process()
|
||||
{
|
||||
int c;
|
||||
|
||||
c = get_tx_char();
|
||||
if (c == 0x03) {
|
||||
stopflag = true;
|
||||
flush = Tx->DataInterleave;
|
||||
c = 0;
|
||||
}
|
||||
|
||||
if (stopflag && flush-- == 0)
|
||||
return -1;
|
||||
|
||||
if ((progdefaults.mt63_8bit && c > 255) || (!progdefaults.mt63_8bit && c > 127))
|
||||
c = '.';
|
||||
|
||||
put_echo_char(c);
|
||||
|
||||
if (c > 127) {
|
||||
c &= 127;
|
||||
Tx->SendChar(127);
|
||||
ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len);
|
||||
}
|
||||
|
||||
Tx->SendChar(c);
|
||||
ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mt63::rx_process(const double *buf, int len)
|
||||
{
|
||||
double snr;
|
||||
unsigned int c;
|
||||
int i;
|
||||
|
||||
if (Interleave != progdefaults.mt63_interleave) {
|
||||
Interleave = progdefaults.mt63_interleave;
|
||||
restart();
|
||||
}
|
||||
|
||||
if (InpBuff->EnsureSpace(len) == -1) {
|
||||
fprintf(stderr, "mt63_rxprocess: buffer error\n");
|
||||
return -1;
|
||||
}
|
||||
for (i = 0; i < len; i++)
|
||||
InpBuff->Data[i] = buf[i];
|
||||
InpBuff->Len = len;
|
||||
|
||||
InpLevel->Process(InpBuff);
|
||||
Rx->Process(InpBuff);
|
||||
|
||||
snr = Rx->FEC_SNR();
|
||||
if (snr > 99.9)
|
||||
snr = 99.9;
|
||||
display_metric(snr);
|
||||
|
||||
if (squelchon && snr < squelch)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < Rx->Output.Len; i++) {
|
||||
c = Rx->Output.Data[i];
|
||||
|
||||
if (!progdefaults.mt63_8bit) {
|
||||
put_rx_char(c);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((c < 8) && (escape == 0))
|
||||
continue;
|
||||
|
||||
if (c == 127) {
|
||||
escape = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (escape) {
|
||||
c += 128;
|
||||
escape = 0;
|
||||
}
|
||||
|
||||
put_rx_char(c);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mt63::restart()
|
||||
{
|
||||
int err;
|
||||
|
||||
put_MODEstatus(mode);
|
||||
digiscope->mode(Digiscope::BLANK);
|
||||
set_freq(500.0 + bandwidth / 2.0);
|
||||
|
||||
err = Tx->Preset((int)bandwidth, Interleave);
|
||||
if (err)
|
||||
fprintf(stderr, "mt63_txinit: init failed\n");
|
||||
// flush = Tx->DataInterleave;
|
||||
|
||||
err = Rx->Preset((int)bandwidth, Interleave, IntegLen);
|
||||
if (err)
|
||||
fprintf(stderr, "mt63_rxinit: init failed\n");
|
||||
InpLevel->Preset(64.0, 0.75);
|
||||
}
|
||||
|
||||
void mt63::init()
|
||||
{
|
||||
modem::init();
|
||||
restart();
|
||||
}
|
||||
|
||||
mt63::mt63 (trx_mode mt63_mode) : modem()
|
||||
{
|
||||
mode = mt63_mode;
|
||||
switch (mode) {
|
||||
case MODE_MT63_500:
|
||||
bandwidth = 500;
|
||||
break;
|
||||
case MODE_MT63_1000:
|
||||
bandwidth = 1000;
|
||||
break;
|
||||
case MODE_MT63_2000:
|
||||
bandwidth = 2000;
|
||||
break;
|
||||
}
|
||||
Interleave = progdefaults.mt63_interleave;
|
||||
|
||||
Tx = new MT63tx;
|
||||
Rx = new MT63rx;
|
||||
|
||||
InpLevel = new dspLevelMonitor;
|
||||
InpBuff = new double_buff;
|
||||
|
||||
samplerate = 8000;
|
||||
fragmentsize = 1024;
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
mt63::~mt63()
|
||||
{
|
||||
if (Tx) delete Tx;
|
||||
if (Rx) delete Rx;
|
||||
|
||||
if (InpLevel) delete InpLevel;
|
||||
if (InpBuff) delete InpBuff;
|
||||
}
|
||||
|
||||
/*
|
||||
static int mt63_txprocess(struct trx *trx)
|
||||
{
|
||||
struct mt63 *s = (struct mt63 *) trx->modem;
|
||||
int c;
|
||||
|
||||
c = trx_get_tx_char();
|
||||
|
||||
if (c == -1) {
|
||||
if (trx->stopflag && s->flush-- == 0)
|
||||
return -1;
|
||||
c = 0;
|
||||
} else
|
||||
s->flush = s->Tx->DataInterleave;
|
||||
|
||||
if ((trx->mt63_esc && c > 255) || (!trx->mt63_esc && c > 127))
|
||||
c = '.';
|
||||
|
||||
trx_put_echo_char(c);
|
||||
|
||||
if (c > 127) {
|
||||
c &= 127;
|
||||
s->Tx->SendChar(127);
|
||||
sound_write(s->Tx->Comb.Output.Data, s->Tx->Comb.Output.Len);
|
||||
}
|
||||
|
||||
s->Tx->SendChar(c);
|
||||
sound_write(s->Tx->Comb.Output.Data, s->Tx->Comb.Output.Len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
*/
|
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* mt63intl.dat -- interleave patterns
|
||||
*
|
||||
* Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC
|
||||
*
|
||||
* This file is part of MT63.
|
||||
*
|
||||
* MT63 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MT63 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 MT63; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
// interleave pattern for the original MT63ASC (short interleave)
|
||||
int ShortIntlvPatt[64] = {
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7,
|
||||
4,5,6,7 } ;
|
||||
|
||||
// interleave pattern for doubled interleave
|
||||
int LongIntlvPatt[64] = {
|
||||
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,0
|
||||
} ;
|
||||
|
||||
|
|
@ -0,0 +1,545 @@
|
|||
/*
|
||||
* symbol.dat -- Symbol shape for the MT63 modem, taken directly
|
||||
* from the MT63ASC code for the EVM56K.
|
||||
*
|
||||
* Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC
|
||||
*
|
||||
* This file is part of MT63.
|
||||
*
|
||||
* MT63 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 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MT63 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 MT63; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
const int SymbolLen=512; // the shape's length
|
||||
const int SymbolSepar=200; // the distance in samples between symbols on a carrier
|
||||
const int DataCarrSepar=4; // carriers must be spaced by 4 FFT bins
|
||||
// (complex FFT length equals to SymbolLen)
|
||||
|
||||
double SymbolShape[SymbolLen] = {
|
||||
-0.00000000 , // 0
|
||||
+0.00000665 , // 1
|
||||
+0.00002657 , // 2
|
||||
+0.00005975 , // 3
|
||||
+0.00010613 , // 4
|
||||
+0.00016562 , // 5
|
||||
+0.00023810 , // 6
|
||||
+0.00032341 , // 7
|
||||
+0.00042134 , // 8
|
||||
+0.00053162 , // 9
|
||||
+0.00065389 , // 10
|
||||
+0.00078773 , // 11
|
||||
+0.00093261 , // 12
|
||||
+0.00108789 , // 13
|
||||
+0.00125283 , // 14
|
||||
+0.00142653 , // 15
|
||||
+0.00160798 , // 16
|
||||
+0.00179599 , // 17
|
||||
+0.00198926 , // 18
|
||||
+0.00218628 , // 19
|
||||
+0.00238542 , // 20
|
||||
+0.00258487 , // 21
|
||||
+0.00278264 , // 22
|
||||
+0.00297662 , // 23
|
||||
+0.00316452 , // 24
|
||||
+0.00334394 , // 25
|
||||
+0.00351232 , // 26
|
||||
+0.00366701 , // 27
|
||||
+0.00380526 , // 28
|
||||
+0.00392424 , // 29
|
||||
+0.00402109 , // 30
|
||||
+0.00409288 , // 31
|
||||
+0.00413671 , // 32
|
||||
+0.00414969 , // 33
|
||||
+0.00412898 , // 34
|
||||
+0.00407182 , // 35
|
||||
+0.00397555 , // 36
|
||||
+0.00383764 , // 37
|
||||
+0.00365574 , // 38
|
||||
+0.00342767 , // 39
|
||||
+0.00315145 , // 40
|
||||
+0.00282534 , // 41
|
||||
+0.00244787 , // 42
|
||||
+0.00201781 , // 43
|
||||
+0.00153424 , // 44
|
||||
+0.00099653 , // 45
|
||||
+0.00040435 , // 46
|
||||
-0.00024231 , // 47
|
||||
-0.00094314 , // 48
|
||||
-0.00169753 , // 49
|
||||
-0.00250453 , // 50
|
||||
-0.00336293 , // 51
|
||||
-0.00427118 , // 52
|
||||
-0.00522749 , // 53
|
||||
-0.00622977 , // 54
|
||||
-0.00727569 , // 55
|
||||
-0.00836272 , // 56
|
||||
-0.00948809 , // 57
|
||||
-0.01064886 , // 58
|
||||
-0.01184193 , // 59
|
||||
-0.01306405 , // 60
|
||||
-0.01431189 , // 61
|
||||
-0.01558198 , // 62
|
||||
-0.01687083 , // 63
|
||||
-0.01817486 , // 64
|
||||
-0.01949051 , // 65
|
||||
-0.02081416 , // 66
|
||||
-0.02214223 , // 67
|
||||
-0.02347113 , // 68
|
||||
-0.02479733 , // 69
|
||||
-0.02611728 , // 70
|
||||
-0.02742752 , // 71
|
||||
-0.02872457 , // 72
|
||||
-0.03000504 , // 73
|
||||
-0.03126551 , // 74
|
||||
-0.03250262 , // 75
|
||||
-0.03371298 , // 76
|
||||
-0.03489320 , // 77
|
||||
-0.03603988 , // 78
|
||||
-0.03714954 , // 79
|
||||
-0.03821868 , // 80
|
||||
-0.03924367 , // 81
|
||||
-0.04022079 , // 82
|
||||
-0.04114620 , // 83
|
||||
-0.04201589 , // 84
|
||||
-0.04282570 , // 85
|
||||
-0.04357126 , // 86
|
||||
-0.04424801 , // 87
|
||||
-0.04485118 , // 88
|
||||
-0.04537575 , // 89
|
||||
-0.04581648 , // 90
|
||||
-0.04616787 , // 91
|
||||
-0.04642421 , // 92
|
||||
-0.04657955 , // 93
|
||||
-0.04662769 , // 94
|
||||
-0.04656225 , // 95
|
||||
-0.04637665 , // 96
|
||||
-0.04606414 , // 97
|
||||
-0.04561786 , // 98
|
||||
-0.04503082 , // 99
|
||||
-0.04429599 , // 100
|
||||
-0.04340631 , // 101
|
||||
-0.04235475 , // 102
|
||||
-0.04113436 , // 103
|
||||
-0.03973834 , // 104
|
||||
-0.03816006 , // 105
|
||||
-0.03639316 , // 106
|
||||
-0.03443155 , // 107
|
||||
-0.03226956 , // 108
|
||||
-0.02990192 , // 109
|
||||
-0.02732385 , // 110
|
||||
-0.02453112 , // 111
|
||||
-0.02152012 , // 112
|
||||
-0.01828789 , // 113
|
||||
-0.01483216 , // 114
|
||||
-0.01115146 , // 115
|
||||
-0.00724508 , // 116
|
||||
-0.00311317 , // 117
|
||||
+0.00124328 , // 118
|
||||
+0.00582236 , // 119
|
||||
+0.01062127 , // 120
|
||||
+0.01563627 , // 121
|
||||
+0.02086273 , // 122
|
||||
+0.02629504 , // 123
|
||||
+0.03192674 , // 124
|
||||
+0.03775043 , // 125
|
||||
+0.04375787 , // 126
|
||||
+0.04993995 , // 127
|
||||
+0.05628681 , // 128
|
||||
+0.06278780 , // 129
|
||||
+0.06943159 , // 130
|
||||
+0.07620621 , // 131
|
||||
+0.08309914 , // 132
|
||||
+0.09009732 , // 133
|
||||
+0.09718730 , // 134
|
||||
+0.10435526 , // 135
|
||||
+0.11158715 , // 136
|
||||
+0.11886870 , // 137
|
||||
+0.12618560 , // 138
|
||||
+0.13352351 , // 139
|
||||
+0.14086819 , // 140
|
||||
+0.14820561 , // 141
|
||||
+0.15552198 , // 142
|
||||
+0.16280389 , // 143
|
||||
+0.17003841 , // 144
|
||||
+0.17721311 , // 145
|
||||
+0.18431620 , // 146
|
||||
+0.19133661 , // 147
|
||||
+0.19826401 , // 148
|
||||
+0.20508896 , // 149
|
||||
+0.21180289 , // 150
|
||||
+0.21839823 , // 151
|
||||
+0.22486845 , // 152
|
||||
+0.23120806 , // 153
|
||||
+0.23741270 , // 154
|
||||
+0.24347919 , // 155
|
||||
+0.24940549 , // 156
|
||||
+0.25519079 , // 157
|
||||
+0.26083547 , // 158
|
||||
+0.26634116 , // 159
|
||||
+0.27171067 , // 160
|
||||
+0.27694807 , // 161
|
||||
+0.28205857 , // 162
|
||||
+0.28704860 , // 163
|
||||
+0.29192571 , // 164
|
||||
+0.29669855 , // 165
|
||||
+0.30137684 , // 166
|
||||
+0.30597130 , // 167
|
||||
+0.31049362 , // 168
|
||||
+0.31495636 , // 169
|
||||
+0.31937292 , // 170
|
||||
+0.32375741 , // 171
|
||||
+0.32812465 , // 172
|
||||
+0.33249001 , // 173
|
||||
+0.33686936 , // 174
|
||||
+0.34127898 , // 175
|
||||
+0.34573545 , // 176
|
||||
+0.35025554 , // 177
|
||||
+0.35485613 , // 178
|
||||
+0.35955412 , // 179
|
||||
+0.36436627 , // 180
|
||||
+0.36930915 , // 181
|
||||
+0.37439902 , // 182
|
||||
+0.37965170 , // 183
|
||||
+0.38508250 , // 184
|
||||
+0.39070609 , // 185
|
||||
+0.39653642 , // 186
|
||||
+0.40258662 , // 187
|
||||
+0.40886890 , // 188
|
||||
+0.41539446 , // 189
|
||||
+0.42217341 , // 190
|
||||
+0.42921470 , // 191
|
||||
+0.43652603 , // 192
|
||||
+0.44411383 , // 193
|
||||
+0.45198311 , // 194
|
||||
+0.46013753 , // 195
|
||||
+0.46857925 , // 196
|
||||
+0.47730896 , // 197
|
||||
+0.48632585 , // 198
|
||||
+0.49562756 , // 199
|
||||
+0.50521021 , // 200
|
||||
+0.51506840 , // 201
|
||||
+0.52519520 , // 202
|
||||
+0.53558220 , // 203
|
||||
+0.54621950 , // 204
|
||||
+0.55709582 , // 205
|
||||
+0.56819849 , // 206
|
||||
+0.57951351 , // 207
|
||||
+0.59102568 , // 208
|
||||
+0.60271860 , // 209
|
||||
+0.61457478 , // 210
|
||||
+0.62657574 , // 211
|
||||
+0.63870210 , // 212
|
||||
+0.65093366 , // 213
|
||||
+0.66324951 , // 214
|
||||
+0.67562817 , // 215
|
||||
+0.68804763 , // 216
|
||||
+0.70048553 , // 217
|
||||
+0.71291922 , // 218
|
||||
+0.72532590 , // 219
|
||||
+0.73768272 , // 220
|
||||
+0.74996688 , // 221
|
||||
+0.76215572 , // 222
|
||||
+0.77422687 , // 223
|
||||
+0.78615828 , // 224
|
||||
+0.79792836 , // 225
|
||||
+0.80951602 , // 226
|
||||
+0.82090079 , // 227
|
||||
+0.83206287 , // 228
|
||||
+0.84298315 , // 229
|
||||
+0.85364335 , // 230
|
||||
+0.86402598 , // 231
|
||||
+0.87411443 , // 232
|
||||
+0.88389296 , // 233
|
||||
+0.89334677 , // 234
|
||||
+0.90246195 , // 235
|
||||
+0.91122553 , // 236
|
||||
+0.91962547 , // 237
|
||||
+0.92765062 , // 238
|
||||
+0.93529073 , // 239
|
||||
+0.94253642 , // 240
|
||||
+0.94937916 , // 241
|
||||
+0.95581122 , // 242
|
||||
+0.96182562 , // 243
|
||||
+0.96741616 , // 244
|
||||
+0.97257728 , // 245
|
||||
+0.97730410 , // 246
|
||||
+0.98159233 , // 247
|
||||
+0.98543825 , // 248
|
||||
+0.98883864 , // 249
|
||||
+0.99179079 , // 250
|
||||
+0.99429241 , // 251
|
||||
+0.99634163 , // 252
|
||||
+0.99793696 , // 253
|
||||
+0.99907728 , // 254
|
||||
+0.99976178 , // 255
|
||||
+0.99999000 , // 256
|
||||
+0.99976178 , // 257
|
||||
+0.99907728 , // 258
|
||||
+0.99793696 , // 259
|
||||
+0.99634163 , // 260
|
||||
+0.99429241 , // 261
|
||||
+0.99179079 , // 262
|
||||
+0.98883864 , // 263
|
||||
+0.98543825 , // 264
|
||||
+0.98159233 , // 265
|
||||
+0.97730410 , // 266
|
||||
+0.97257728 , // 267
|
||||
+0.96741616 , // 268
|
||||
+0.96182562 , // 269
|
||||
+0.95581122 , // 270
|
||||
+0.94937916 , // 271
|
||||
+0.94253642 , // 272
|
||||
+0.93529073 , // 273
|
||||
+0.92765062 , // 274
|
||||
+0.91962547 , // 275
|
||||
+0.91122553 , // 276
|
||||
+0.90246195 , // 277
|
||||
+0.89334677 , // 278
|
||||
+0.88389296 , // 279
|
||||
+0.87411443 , // 280
|
||||
+0.86402598 , // 281
|
||||
+0.85364335 , // 282
|
||||
+0.84298315 , // 283
|
||||
+0.83206287 , // 284
|
||||
+0.82090079 , // 285
|
||||
+0.80951602 , // 286
|
||||
+0.79792836 , // 287
|
||||
+0.78615828 , // 288
|
||||
+0.77422687 , // 289
|
||||
+0.76215572 , // 290
|
||||
+0.74996688 , // 291
|
||||
+0.73768272 , // 292
|
||||
+0.72532590 , // 293
|
||||
+0.71291922 , // 294
|
||||
+0.70048553 , // 295
|
||||
+0.68804763 , // 296
|
||||
+0.67562817 , // 297
|
||||
+0.66324951 , // 298
|
||||
+0.65093366 , // 299
|
||||
+0.63870210 , // 300
|
||||
+0.62657574 , // 301
|
||||
+0.61457478 , // 302
|
||||
+0.60271860 , // 303
|
||||
+0.59102568 , // 304
|
||||
+0.57951351 , // 305
|
||||
+0.56819849 , // 306
|
||||
+0.55709582 , // 307
|
||||
+0.54621950 , // 308
|
||||
+0.53558220 , // 309
|
||||
+0.52519520 , // 310
|
||||
+0.51506840 , // 311
|
||||
+0.50521021 , // 312
|
||||
+0.49562756 , // 313
|
||||
+0.48632585 , // 314
|
||||
+0.47730896 , // 315
|
||||
+0.46857925 , // 316
|
||||
+0.46013753 , // 317
|
||||
+0.45198311 , // 318
|
||||
+0.44411383 , // 319
|
||||
+0.43652603 , // 320
|
||||
+0.42921470 , // 321
|
||||
+0.42217341 , // 322
|
||||
+0.41539446 , // 323
|
||||
+0.40886890 , // 324
|
||||
+0.40258662 , // 325
|
||||
+0.39653642 , // 326
|
||||
+0.39070609 , // 327
|
||||
+0.38508250 , // 328
|
||||
+0.37965170 , // 329
|
||||
+0.37439902 , // 330
|
||||
+0.36930915 , // 331
|
||||
+0.36436627 , // 332
|
||||
+0.35955412 , // 333
|
||||
+0.35485613 , // 334
|
||||
+0.35025554 , // 335
|
||||
+0.34573545 , // 336
|
||||
+0.34127898 , // 337
|
||||
+0.33686936 , // 338
|
||||
+0.33249001 , // 339
|
||||
+0.32812465 , // 340
|
||||
+0.32375741 , // 341
|
||||
+0.31937292 , // 342
|
||||
+0.31495636 , // 343
|
||||
+0.31049362 , // 344
|
||||
+0.30597130 , // 345
|
||||
+0.30137684 , // 346
|
||||
+0.29669855 , // 347
|
||||
+0.29192571 , // 348
|
||||
+0.28704860 , // 349
|
||||
+0.28205857 , // 350
|
||||
+0.27694807 , // 351
|
||||
+0.27171067 , // 352
|
||||
+0.26634116 , // 353
|
||||
+0.26083547 , // 354
|
||||
+0.25519079 , // 355
|
||||
+0.24940549 , // 356
|
||||
+0.24347919 , // 357
|
||||
+0.23741270 , // 358
|
||||
+0.23120806 , // 359
|
||||
+0.22486845 , // 360
|
||||
+0.21839823 , // 361
|
||||
+0.21180289 , // 362
|
||||
+0.20508896 , // 363
|
||||
+0.19826401 , // 364
|
||||
+0.19133661 , // 365
|
||||
+0.18431620 , // 366
|
||||
+0.17721311 , // 367
|
||||
+0.17003841 , // 368
|
||||
+0.16280389 , // 369
|
||||
+0.15552198 , // 370
|
||||
+0.14820561 , // 371
|
||||
+0.14086819 , // 372
|
||||
+0.13352351 , // 373
|
||||
+0.12618560 , // 374
|
||||
+0.11886870 , // 375
|
||||
+0.11158715 , // 376
|
||||
+0.10435526 , // 377
|
||||
+0.09718730 , // 378
|
||||
+0.09009732 , // 379
|
||||
+0.08309914 , // 380
|
||||
+0.07620621 , // 381
|
||||
+0.06943159 , // 382
|
||||
+0.06278780 , // 383
|
||||
+0.05628681 , // 384
|
||||
+0.04993995 , // 385
|
||||
+0.04375787 , // 386
|
||||
+0.03775043 , // 387
|
||||
+0.03192674 , // 388
|
||||
+0.02629504 , // 389
|
||||
+0.02086273 , // 390
|
||||
+0.01563627 , // 391
|
||||
+0.01062127 , // 392
|
||||
+0.00582236 , // 393
|
||||
+0.00124328 , // 394
|
||||
-0.00311317 , // 395
|
||||
-0.00724508 , // 396
|
||||
-0.01115146 , // 397
|
||||
-0.01483216 , // 398
|
||||
-0.01828789 , // 399
|
||||
-0.02152012 , // 400
|
||||
-0.02453112 , // 401
|
||||
-0.02732385 , // 402
|
||||
-0.02990192 , // 403
|
||||
-0.03226956 , // 404
|
||||
-0.03443155 , // 405
|
||||
-0.03639316 , // 406
|
||||
-0.03816006 , // 407
|
||||
-0.03973834 , // 408
|
||||
-0.04113436 , // 409
|
||||
-0.04235475 , // 410
|
||||
-0.04340631 , // 411
|
||||
-0.04429599 , // 412
|
||||
-0.04503082 , // 413
|
||||
-0.04561786 , // 414
|
||||
-0.04606414 , // 415
|
||||
-0.04637665 , // 416
|
||||
-0.04656225 , // 417
|
||||
-0.04662769 , // 418
|
||||
-0.04657955 , // 419
|
||||
-0.04642421 , // 420
|
||||
-0.04616787 , // 421
|
||||
-0.04581648 , // 422
|
||||
-0.04537575 , // 423
|
||||
-0.04485118 , // 424
|
||||
-0.04424801 , // 425
|
||||
-0.04357126 , // 426
|
||||
-0.04282570 , // 427
|
||||
-0.04201589 , // 428
|
||||
-0.04114620 , // 429
|
||||
-0.04022079 , // 430
|
||||
-0.03924367 , // 431
|
||||
-0.03821868 , // 432
|
||||
-0.03714954 , // 433
|
||||
-0.03603988 , // 434
|
||||
-0.03489320 , // 435
|
||||
-0.03371298 , // 436
|
||||
-0.03250262 , // 437
|
||||
-0.03126551 , // 438
|
||||
-0.03000504 , // 439
|
||||
-0.02872457 , // 440
|
||||
-0.02742752 , // 441
|
||||
-0.02611728 , // 442
|
||||
-0.02479733 , // 443
|
||||
-0.02347113 , // 444
|
||||
-0.02214223 , // 445
|
||||
-0.02081416 , // 446
|
||||
-0.01949051 , // 447
|
||||
-0.01817486 , // 448
|
||||
-0.01687083 , // 449
|
||||
-0.01558198 , // 450
|
||||
-0.01431189 , // 451
|
||||
-0.01306405 , // 452
|
||||
-0.01184193 , // 453
|
||||
-0.01064886 , // 454
|
||||
-0.00948809 , // 455
|
||||
-0.00836272 , // 456
|
||||
-0.00727569 , // 457
|
||||
-0.00622977 , // 458
|
||||
-0.00522749 , // 459
|
||||
-0.00427118 , // 460
|
||||
-0.00336293 , // 461
|
||||
-0.00250453 , // 462
|
||||
-0.00169753 , // 463
|
||||
-0.00094314 , // 464
|
||||
-0.00024231 , // 465
|
||||
+0.00040435 , // 466
|
||||
+0.00099653 , // 467
|
||||
+0.00153424 , // 468
|
||||
+0.00201781 , // 469
|
||||
+0.00244787 , // 470
|
||||
+0.00282534 , // 471
|
||||
+0.00315145 , // 472
|
||||
+0.00342767 , // 473
|
||||
+0.00365574 , // 474
|
||||
+0.00383764 , // 475
|
||||
+0.00397555 , // 476
|
||||
+0.00407182 , // 477
|
||||
+0.00412898 , // 478
|
||||
+0.00414969 , // 479
|
||||
+0.00413671 , // 480
|
||||
+0.00409288 , // 481
|
||||
+0.00402109 , // 482
|
||||
+0.00392424 , // 483
|
||||
+0.00380526 , // 484
|
||||
+0.00366701 , // 485
|
||||
+0.00351232 , // 486
|
||||
+0.00334394 , // 487
|
||||
+0.00316452 , // 488
|
||||
+0.00297662 , // 489
|
||||
+0.00278264 , // 490
|
||||
+0.00258487 , // 491
|
||||
+0.00238542 , // 492
|
||||
+0.00218628 , // 493
|
||||
+0.00198926 , // 494
|
||||
+0.00179599 , // 495
|
||||
+0.00160798 , // 496
|
||||
+0.00142653 , // 497
|
||||
+0.00125283 , // 498
|
||||
+0.00108789 , // 499
|
||||
+0.00093261 , // 500
|
||||
+0.00078773 , // 501
|
||||
+0.00065389 , // 502
|
||||
+0.00053162 , // 503
|
||||
+0.00042134 , // 504
|
||||
+0.00032341 , // 505
|
||||
+0.00023810 , // 506
|
||||
+0.00016562 , // 507
|
||||
+0.00010613 , // 508
|
||||
+0.00005975 , // 509
|
||||
+0.00002657 , // 510
|
||||
+0.00000665 // 511
|
||||
} ;
|
||||
|
||||
|
|
@ -14,6 +14,9 @@
|
|||
modem *cw_modem = 0;
|
||||
modem *mfsk8_modem = 0;
|
||||
modem *mfsk16_modem = 0;
|
||||
modem *mt63_500_modem = 0;
|
||||
modem *mt63_1000_modem = 0;
|
||||
modem *mt63_2000_modem = 0;
|
||||
modem *feld_modem = 0;
|
||||
modem *feld_slowmodem = 0;
|
||||
modem *feld_x5modem = 0;
|
||||
|
|
Ładowanie…
Reference in New Issue