9
#include "configuration.h"
10
#include "confdialog.h"
13
#include "rsid_fft.cxx"
18
RSID_BPSK31 = 1, RSID_QPSK31 = 110, RSID_BPSK63 = 2, RSID_QPSK63 = 3,
19
RSID_BPSK125 = 4, RSID_QPSK125 = 5, RSID_BPSK250 = 126, RSID_QPSK250 = 127,
21
RSID_UNKNOWN_1 = 7, RSID_UNKNOWN_2 = 8,
23
RSID_MT63_500_LG = 9, RSID_MT63_500_ST = 10, RSID_MT63_500_VST = 11,
24
RSID_MT63_1000_LG = 12, RSID_MT63_1000_ST = 13, RSID_MT63_1000_VST = 14,
25
RSID_MT63_2000_LG = 15, RSID_MT63_2000_ST = 17, RSID_MT63_2000_VST = 18,
27
RSID_PSKAM10 = 19, RSID_PSKAM31 = 20, RSID_PSKAM50 = 21, RSID_PSK63F = 22,
28
RSID_PSK220F = 23, RSID_CHIP64 = 24, RSID_CHIP128 = 25,
32
RSID_CCW_OOK_12 = 27, RSID_CCW_OOK_24 = 28, RSID_CCW_OOK_48 = 29,
33
RSID_CCW_FSK_12 = 30, RSID_CCW_FSK_24 = 31, RSID_CCW_FSK_48 = 33,
35
RSID_PACTOR1_FEC = 34, RSID_PACKET_300 = 35, RSID_PACKET_1200 = 36,
37
RSID_RTTY_ASCII_7 = 37, RSID_RTTY_ASCII_8 = 38, RSID_RTTY_45 = 39,
38
RSID_RTTY_50 = 40, RSID_RTTY_75 = 41,
42
RSID_THROB_1 = 43, RSID_THROB_2 = 44, RSID_THROB_4 = 45,
43
RSID_THROBX_1 = 46, RSID_THROBX_2 = 47, RSID_THROBX_4 = 146,
45
RSID_CONTESTIA_8_250 = 49, RSID_CONTESTIA_16_500 = 50, RSID_CONTESTIA_32_1000 = 51,
46
RSID_CONTESTIA_8_500 = 52, RSID_CONTESTIA_16_1000 = 53, RSID_CONTESTIA_4_500 = 54,
47
RSID_CONTESTIA_4_250 = 55,
51
RSID_MFSK8 = 60, RSID_MFSK16 = 57, RSID_MFSK32 = 147,
52
RSID_MFSK11 = 148, RSID_MFSK22 = 152,
54
RSID_RTTYM_8_250 = 61, RSID_RTTYM_16_500 = 62, RSID_RTTYM_32_1000 = 63,
55
RSID_RTTYM_8_500 = 65, RSID_RTTYM_16_1000 = 66, RSID_RTTYM_4_500 = 67,
56
RSID_RTTYM_4_250 = 68,
58
RSID_OLIVIA_8_250 = 69, RSID_OLIVIA_16_500 = 70, RSID_OLIVIA_32_1000 = 71,
59
RSID_OLIVIA_8_500 = 72, RSID_OLIVIA_16_1000 = 73, RSID_OLIVIA_4_500 = 74,
60
RSID_OLIVIA_4_250 = 75,
62
RSID_PAX = 76, RSID_PAX2 = 77, RSID_DOMINOF = 78, RSID_FAX = 79, RSID_SSTV = 81,
64
RSID_DOMINOEX_4 = 84, RSID_DOMINOEX_5 = 85, RSID_DOMINOEX_8 = 86,
65
RSID_DOMINOEX_11 = 87, RSID_DOMINOEX_16 = 88, RSID_DOMINOEX_22 = 90,
66
RSID_DOMINOEX_4_FEC = 92, RSID_DOMINOEX_5_FEC = 93, RSID_DOMINOEX_8_FEC = 97,
67
RSID_DOMINOEX_11_FEC = 98, RSID_DOMINOEX_16_FEC = 99, RSID_DOMINOEX_22_FEC = 101,
69
RSID_FELD_HELL = 104, RSID_PSK_HELL = 105, RSID_HELL_80 = 106,
70
RSID_FM_HELL_105 = 107, RSID_FM_HELL_245 = 108,
72
RSID_THOR_4 = 136, RSID_THOR_5 = 139, RSID_THOR_8 = 137,
73
RSID_THOR_11 = 143, RSID_THOR_16 = 138, RSID_THOR_22 = 145,
76
RSIDs cRsId::rsid_ids[] = {
77
{ RSID_BPSK31, MODE_BPSK31 },
78
{ RSID_QPSK31, MODE_QPSK31 },
79
{ RSID_BPSK63, MODE_PSK63 },
80
{ RSID_QPSK63, MODE_QPSK63 },
81
{ RSID_BPSK125, MODE_PSK125 },
82
{ RSID_QPSK125, MODE_QPSK125 },
83
{ RSID_BPSK250, MODE_PSK250 },
84
{ RSID_QPSK250, MODE_QPSK250 },
86
{ RSID_UNKNOWN_1, NUM_MODES },
87
{ RSID_UNKNOWN_2, NUM_MODES },
89
{ RSID_MT63_500_LG, MODE_MT63_500 },
90
{ RSID_MT63_500_ST, MODE_MT63_500 },
91
{ RSID_MT63_500_VST, MODE_MT63_500 },
92
{ RSID_MT63_1000_LG, MODE_MT63_1000 },
93
{ RSID_MT63_1000_ST, MODE_MT63_1000 },
94
{ RSID_MT63_1000_VST, MODE_MT63_1000 },
95
{ RSID_MT63_2000_LG, MODE_MT63_2000 },
96
{ RSID_MT63_2000_ST, MODE_MT63_2000 },
97
{ RSID_MT63_2000_VST, MODE_MT63_2000 },
99
{ RSID_PSKAM10, NUM_MODES },
100
{ RSID_PSKAM31, NUM_MODES },
101
{ RSID_PSKAM50, NUM_MODES },
102
{ RSID_PSK63F, NUM_MODES },
103
{ RSID_PSK220F, NUM_MODES },
104
{ RSID_CHIP64, NUM_MODES },
105
{ RSID_CHIP128, NUM_MODES },
107
{ RSID_CW, MODE_CW },
109
{ RSID_CCW_OOK_12, NUM_MODES },
110
{ RSID_CCW_OOK_24, NUM_MODES },
111
{ RSID_CCW_OOK_48, NUM_MODES },
112
{ RSID_CCW_FSK_12, NUM_MODES },
113
{ RSID_CCW_FSK_24, NUM_MODES },
114
{ RSID_CCW_FSK_48, NUM_MODES },
116
{ RSID_PACTOR1_FEC, NUM_MODES },
117
{ RSID_PACKET_300, NUM_MODES },
118
{ RSID_PACKET_1200, NUM_MODES },
120
{ RSID_RTTY_ASCII_7, MODE_RTTY },
121
{ RSID_RTTY_ASCII_8, MODE_RTTY },
122
{ RSID_RTTY_45, MODE_RTTY },
123
{ RSID_RTTY_50 , MODE_RTTY },
124
{ RSID_RTTY_75 , MODE_RTTY },
126
{ RSID_AMTOR_FEC, NUM_MODES },
128
{ RSID_THROB_1, MODE_THROB1 },
129
{ RSID_THROB_2, MODE_THROB2 },
130
{ RSID_THROB_4, MODE_THROB4 },
131
{ RSID_THROBX_1, MODE_THROBX1 },
132
{ RSID_THROBX_2, MODE_THROBX2 },
133
{ RSID_THROBX_4, MODE_THROBX4 },
135
{ RSID_CONTESTIA_8_250, NUM_MODES },
136
{ RSID_CONTESTIA_16_500, NUM_MODES },
137
{ RSID_CONTESTIA_32_1000, NUM_MODES },
138
{ RSID_CONTESTIA_8_500, NUM_MODES },
139
{ RSID_CONTESTIA_16_1000, NUM_MODES },
140
{ RSID_CONTESTIA_4_500, NUM_MODES },
141
{ RSID_CONTESTIA_4_250, NUM_MODES },
143
{ RSID_VOICE, NUM_MODES },
145
{ RSID_MFSK8, MODE_MFSK8 },
146
{ RSID_MFSK16, MODE_MFSK16 },
147
{ RSID_MFSK32, MODE_MFSK32 },
149
{ RSID_MFSK11, MODE_MFSK11 },
150
{ RSID_MFSK22, MODE_MFSK22 },
152
{ RSID_MFSK11, NUM_MODES },
153
{ RSID_MFSK22, NUM_MODES },
156
{ RSID_RTTYM_8_250, NUM_MODES },
157
{ RSID_RTTYM_16_500, NUM_MODES },
158
{ RSID_RTTYM_32_1000, NUM_MODES },
159
{ RSID_RTTYM_8_500, NUM_MODES },
160
{ RSID_RTTYM_16_1000, NUM_MODES },
161
{ RSID_RTTYM_4_500, NUM_MODES },
162
{ RSID_RTTYM_4_250, NUM_MODES },
164
{ RSID_OLIVIA_8_250, MODE_OLIVIA },
165
{ RSID_OLIVIA_16_500, MODE_OLIVIA },
166
{ RSID_OLIVIA_32_1000, MODE_OLIVIA },
167
{ RSID_OLIVIA_8_500, MODE_OLIVIA },
168
{ RSID_OLIVIA_16_1000, MODE_OLIVIA },
169
{ RSID_OLIVIA_4_500, MODE_OLIVIA },
170
{ RSID_OLIVIA_4_250, MODE_OLIVIA },
172
{ RSID_PAX, NUM_MODES },
173
{ RSID_PAX2, NUM_MODES },
174
{ RSID_DOMINOF, NUM_MODES },
175
{ RSID_FAX, NUM_MODES },
176
{ RSID_SSTV, NUM_MODES },
178
{ RSID_DOMINOEX_4, MODE_DOMINOEX4 },
179
{ RSID_DOMINOEX_5, MODE_DOMINOEX5 },
180
{ RSID_DOMINOEX_8, MODE_DOMINOEX8 },
181
{ RSID_DOMINOEX_11, MODE_DOMINOEX11 },
182
{ RSID_DOMINOEX_16, MODE_DOMINOEX16 },
183
{ RSID_DOMINOEX_22, MODE_DOMINOEX22 },
184
{ RSID_DOMINOEX_4_FEC, MODE_DOMINOEX4 },
185
{ RSID_DOMINOEX_5_FEC, MODE_DOMINOEX5 },
186
{ RSID_DOMINOEX_8_FEC, MODE_DOMINOEX8 },
187
{ RSID_DOMINOEX_11_FEC, MODE_DOMINOEX11 },
188
{ RSID_DOMINOEX_16_FEC, MODE_DOMINOEX16 },
189
{ RSID_DOMINOEX_22_FEC, MODE_DOMINOEX22 },
191
{ RSID_FELD_HELL, MODE_FELDHELL },
192
{ RSID_PSK_HELL, NUM_MODES },
193
{ RSID_HELL_80 , MODE_HELL80 },
194
{ RSID_FM_HELL_105, MODE_FSKH105 },
195
{ RSID_FM_HELL_245, NUM_MODES },
197
{ RSID_THOR_4, MODE_THOR4 },
198
{ RSID_THOR_8, MODE_THOR8 },
199
{ RSID_THOR_16, MODE_THOR16 },
200
{ RSID_THOR_5, MODE_THOR5 },
201
{ RSID_THOR_11, MODE_THOR11 },
202
{ RSID_THOR_22, MODE_THOR22 },
204
{ RSID_NONE, NUM_MODES }
207
const int cRsId::Squares[256] = {
208
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
209
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
210
0, 2, 4, 6, 8,10,12,14, 9,11,13,15, 1, 3, 5, 7,
211
0, 3, 6, 5,12,15,10, 9, 1, 2, 7, 4,13,14,11, 8,
212
0, 4, 8,12, 9,13, 1, 5,11,15, 3, 7, 2, 6,10,14,
213
0, 5,10,15,13, 8, 7, 2, 3, 6, 9,12,14,11, 4, 1,
214
0, 6,12,10, 1, 7,13,11, 2, 4,14, 8, 3, 5,15, 9,
215
0, 7,14, 9, 5, 2,11,12,10,13, 4, 3,15, 8, 1, 6,
216
0, 8, 9, 1,11, 3, 2,10,15, 7, 6,14, 4,12,13, 5,
217
0, 9,11, 2,15, 6, 4,13, 7,14,12, 5, 8, 1, 3,10,
218
0,10,13, 7, 3, 9,14, 4, 6,12,11, 1, 5,15, 8, 2,
219
0,11,15, 4, 7,12, 8, 3,14, 5, 1,10, 9, 2, 6,13,
220
0,12, 1,13, 2,14, 3,15, 4, 8, 5, 9, 6,10, 7,11,
221
0,13, 3,14, 6,11, 5, 8,12, 1,15, 2,10, 7, 9, 4,
222
0,14, 5,11,10, 4,15, 1,13, 3, 8, 6, 7, 9, 2,12,
223
0,15, 7, 8,14, 1, 9, 6, 5,10, 2,13,11, 4,12, 3
226
const int cRsId::indices[] = {
227
2, 4, 8, 9, 11, 15, 7, 14, 5, 10, 13, 3
232
memset (aInputSamples, 0, RSID_ARRAY_SIZE * sizeof(double));
233
memset (aFFTReal, 0, RSID_ARRAY_SIZE * sizeof(double));
234
memset (aFFTAmpl, 0, RSID_FFT_SIZE * sizeof(double));
235
memset (fftwindow, 0, RSID_ARRAY_SIZE * sizeof(double));
237
memset (aHashTable1, 255, 256);
238
memset (aHashTable2, 255, 256);
240
// compute current size of rsid_ids
242
while (rsid_ids[rsid_ids_size].rs) rsid_ids_size++;
244
pCodes = new uchar[rsid_ids_size * RSID_NSYMBOLS];
245
memset (pCodes, 0, rsid_ids_size * RSID_NSYMBOLS);
247
// Initialization of assigned mode/submode IDs.
248
// HashTable is used for finding a code with lowest Hamming distance.
250
for (int i = 0; i < rsid_ids_size; i++) {
251
uchar *c = pCodes + i * RSID_NSYMBOLS;
254
Encode(rsid_ids[i].rs, c);
255
hash1 = c[11] | (c[12] << 4);
256
hash2 = c[13] | (c[14] << 4);
258
aHashTable1[hash1] = i;
259
aHashTable2[hash2] = i;
262
for (int i = 0; i < RSID_NTIMES; i++)
263
for (int j = 0; j < RSID_FFT_SIZE; j++)
268
BlackmanWindow(fftwindow, RSID_FFT_SIZE);
270
nBinLow = RSID_RESOL + 1;
271
nBinHigh = RSID_FFT_SIZE - 32;
273
bPrevTimeSliceValid = false;
286
bPrevTimeSliceValid = false;
288
memset (aInputSamples, 0, RSID_ARRAY_SIZE * sizeof(double));
289
memset (aFFTReal, 0, RSID_ARRAY_SIZE * sizeof(double));
290
memset (aFFTAmpl, 0, RSID_FFT_SIZE * sizeof(double));
291
for (int i = 0; i < RSID_NTIMES; i++)
292
for (int j = 0; j < RSID_FFT_SIZE; j++)
296
void cRsId::Encode(int code, uchar *rsid)
299
rsid[1] = (code >> 4) & 0x0f;
300
rsid[2] = code & 0x0f;
301
for (int i = 3; i < RSID_NSYMBOLS; i++)
303
for (int i = 0; i < 12; i++) {
304
for (int j = RSID_NSYMBOLS - 1; j > 0; j--)
305
rsid[j] = rsid[j - 1] ^ Squares[(rsid[j] << 4) + indices[i]];
306
rsid[0] = Squares[(rsid[0] << 4) + indices[i]];
311
void cRsId::CalculateBuckets(const double *pSpectrum, int iBegin, int iEnd)
313
double Amp = 0.0, AmpMax = 0.0;
314
int iBucketMax = iBegin - RSID_RESOL;
316
bool firstpass = true;
318
for (i = iBegin; i < iEnd; i += RSID_RESOL) {
320
AmpMax = pSpectrum[i];
322
for (j = i + RSID_RESOL; j < i + RSID_NTIMES + RSID_RESOL; j += RSID_RESOL) {
338
aBuckets[iTime][i] = (iBucketMax - i) >> 1;
343
void cRsId::search( const double *pSamples, int nSamples )
346
bool bReverse = false;
348
double centerfreq = active_modem->get_freq();
350
if (progdefaults.rsidWideSearch) {
351
nBinLow = RSID_RESOL + 1;
352
nBinHigh = RSID_FFT_SIZE - 32;
354
nBinLow = (int)((centerfreq - 100.0 * RSID_RESOL) * 2048.0 / 11025.0);
355
nBinHigh = (int)((centerfreq + 100.0 * RSID_RESOL) * 2048.0 / 11025.0);
358
if (wf->Reverse() == true && wf->USB() == true) bReverse = true;
359
if (wf->Reverse() == false && wf->USB() == false) bReverse = true;
362
if (ns > RSID_ARRAY_SIZE / 4) {
363
ns = RSID_ARRAY_SIZE / 4;
367
nBinLow = RSID_FFT_SIZE - nBinHigh;
368
nBinHigh = RSID_FFT_SIZE - nBinLow;
371
memmove (aInputSamples, aInputSamples + ns, ns * sizeof(double));
372
memcpy (aInputSamples + ns, pSamples, ns * sizeof(double));
374
memset (aFFTReal, 0, RSID_ARRAY_SIZE * sizeof(double));
375
memcpy (aFFTReal, aInputSamples, RSID_FFT_SIZE * sizeof(double));
377
// for (int i = 0; i < RSID_FFT_SIZE; i++)
378
// aFFTReal[i] = aInputSamples[i] * fftwindow[i];
380
rsrfft( aFFTReal, 11);
382
memset(aFFTAmpl, 0, RSID_FFT_SIZE * sizeof(double));
383
for (i = 1; i < RSID_FFT_SIZE; i++) {
385
Real = aFFTReal[RSID_FFT_SIZE - i];
386
Imag = aFFTReal[RSID_FFT_SIZE + i];
389
Imag = aFFTReal[2 * RSID_FFT_SIZE - i];
391
aFFTAmpl[i] = Real * Real + Imag * Imag;
397
if (search_amp ( SymbolOut, BinOut ) ){
399
BinOut = 1024 - BinOut - 31;
400
apply(SymbolOut, BinOut);
404
void cRsId::apply(int iSymbol, int iBin)
407
double freq = (iBin + (RSID_NSYMBOLS - 1) * RSID_RESOL / 2) * 11025.0 / 2048.0;
410
for (int n = 0; n < rsid_ids_size; n++)
411
if (rsid_ids[n].rs == iSymbol) {
412
mbin = rsid_ids[n].mode;
418
if (mbin == NUM_MODES) return;
422
case RSID_RTTY_ASCII_7:
423
progdefaults.rtty_baud = 5;
424
progdefaults.rtty_bits = 1;
425
progdefaults.rtty_shift = 9;
426
REQ(&set_rtty_tab_widgets);
428
case RSID_RTTY_ASCII_8:
429
progdefaults.rtty_baud = 5;
430
progdefaults.rtty_bits = 2;
431
progdefaults.rtty_shift = 9;
432
REQ(&set_rtty_tab_widgets);
435
progdefaults.rtty_baud = 1;
436
progdefaults.rtty_bits = 0;
437
progdefaults.rtty_shift = 3;
438
REQ(&set_rtty_tab_widgets);
441
progdefaults.rtty_baud = 2;
442
progdefaults.rtty_bits = 0;
443
progdefaults.rtty_shift = 3;
444
REQ(&set_rtty_tab_widgets);
447
progdefaults.rtty_baud = 4;
448
progdefaults.rtty_bits = 0;
449
progdefaults.rtty_shift = 9;
450
REQ(&set_rtty_tab_widgets);
452
// special MultiPsk FEC modes
453
case RSID_DOMINOEX_4_FEC: case RSID_DOMINOEX_5_FEC: case RSID_DOMINOEX_8_FEC:
454
case RSID_DOMINOEX_11_FEC: case RSID_DOMINOEX_16_FEC: case RSID_DOMINOEX_22_FEC:
455
progdefaults.DOMINOEX_FEC = true;
458
case RSID_OLIVIA_8_250:
459
progdefaults.oliviatones = 2;
460
progdefaults.oliviabw = 1;
461
REQ(&set_olivia_tab_widgets);
463
case RSID_OLIVIA_16_500:
464
progdefaults.oliviatones = 3;
465
progdefaults.oliviabw = 2;
466
REQ(&set_olivia_tab_widgets);
468
case RSID_OLIVIA_32_1000:
469
progdefaults.oliviatones = 4;
470
progdefaults.oliviabw = 3;
471
REQ(&set_olivia_tab_widgets);
473
case RSID_OLIVIA_8_500:
474
progdefaults.oliviatones = 2;
475
progdefaults.oliviabw = 2;
476
REQ(&set_olivia_tab_widgets);
478
case RSID_OLIVIA_16_1000:
479
progdefaults.oliviatones = 3;
480
progdefaults.oliviabw = 3;
481
REQ(&set_olivia_tab_widgets);
483
case RSID_OLIVIA_4_500:
484
progdefaults.oliviatones = 1;
485
progdefaults.oliviabw = 2;
486
REQ(&set_olivia_tab_widgets);
488
case RSID_OLIVIA_4_250:
489
progdefaults.oliviatones = 1;
490
progdefaults.oliviabw = 1;
491
REQ(&set_olivia_tab_widgets);
494
case RSID_MT63_500_LG: case RSID_MT63_1000_LG: case RSID_MT63_2000_LG:
495
progdefaults.mt63_interleave = 64;
497
case RSID_MT63_500_ST: case RSID_MT63_1000_ST: case RSID_MT63_2000_ST:
498
case RSID_MT63_500_VST: case RSID_MT63_1000_VST: case RSID_MT63_2000_VST:
499
progdefaults.mt63_interleave = 32;
506
REQ(&configuration::loadDefaults, &progdefaults);
508
active_modem->set_freq(freq);
509
REQ(init_modem, mbin);
513
//=============================================================================
514
// search_amp routine #1
515
//=============================================================================
517
int cRsId::HammingDistance(int iBucket, uchar *p2)
520
int j = iTime - RSID_NTIMES + 1; // first value
523
for (int i = 0; i < RSID_NSYMBOLS; i++) {
524
if (aBuckets[j][iBucket] != p2[i])//*p2++)
528
if (j >= RSID_NTIMES)
534
bool cRsId::search_amp( int &SymbolOut, int &BinOut)
537
int iDistanceMin = 99; // infinity
541
int iEnd = nBinHigh - RSID_NTIMES;//30;
544
if (++iTime == RSID_NTIMES)
547
i1 = iTime - 3 * RSID_RESOL;//6;
548
i2 = i1 + RSID_RESOL;//2;
549
i3 = i2 + RSID_RESOL;//2;
560
CalculateBuckets ( aFFTAmpl, nBinLow, iEnd);//nBinHigh - 30);
561
CalculateBuckets ( aFFTAmpl, nBinLow + 1, iEnd);//nBinHigh - 30);
563
for (i = nBinLow; i < iEnd; ++ i) {
564
j = aHashTable1[aBuckets[i1][i] | (aBuckets[i2][i] << 4)];
565
if (j < rsid_ids_size) { //!= 255) {
566
iDistance = HammingDistance(i, pCodes + j * RSID_NSYMBOLS);
567
if (iDistance < 2 && iDistance < iDistanceMin) {
568
iDistanceMin = iDistance;
569
iSymbol = rsid_ids[j].rs;
573
j = aHashTable2[aBuckets[i3][i] | (aBuckets[iTime][i] << 4)];
574
if (j < rsid_ids_size) { //!= 255) {
575
iDistance = HammingDistance (i, pCodes + j * RSID_NSYMBOLS);
576
if (iDistance < 2 && iDistance < iDistanceMin) {
577
iDistanceMin = iDistance;
578
iSymbol = rsid_ids[j].rs;
585
// No RSID found in this time slice.
586
// If there is a code stored from the previous time slice, return it.
587
if (bPrevTimeSliceValid) {
588
SymbolOut = iPrevSymbol;
590
DistanceOut = iPrevDistance;
592
bPrevTimeSliceValid = false;
598
if (! bPrevTimeSliceValid ||
599
iDistanceMin <= iPrevDistance) {
600
iPrevSymbol = iSymbol;
602
iPrevDistance = iDistanceMin;
604
bPrevTimeSliceValid = true;
608
//=============================================================================
609
// transmit rsid code for current mode
610
//=============================================================================
615
uchar rsid[RSID_NSYMBOLS];
621
sr = active_modem->get_samplerate();
622
symlen = (int)floor(RSID_SYMLEN * sr);
623
fr = 1.0 * active_modem->get_txfreq() - (11025.0 * 7 / 1024);
625
trx_mode mode = active_modem->get_mode();
626
uchar rmode = RSID_NONE;
630
if (progdefaults.rtty_baud == 5 && progdefaults.rtty_bits == 1 && progdefaults.rtty_shift == 9)
631
rmode = RSID_RTTY_ASCII_7;
632
else if (progdefaults.rtty_baud == 5 && progdefaults.rtty_bits == 1 && progdefaults.rtty_shift == 9)
633
rmode = RSID_RTTY_ASCII_8;
634
else if (progdefaults.rtty_baud == 1 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 3)
635
rmode = RSID_RTTY_45;
636
else if (progdefaults.rtty_baud == 2 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 3)
637
rmode = RSID_RTTY_50;
638
else if (progdefaults.rtty_baud == 4 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 9)
639
rmode = RSID_RTTY_75;
641
rmode = RSID_RTTY_45;; // 45 baud Baudot, shift 170
645
if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 1)
646
rmode = RSID_OLIVIA_8_250;
647
else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 2)
648
rmode = RSID_OLIVIA_16_500;
649
else if (progdefaults.oliviatones == 4 && progdefaults.oliviabw == 3)
650
rmode = RSID_OLIVIA_32_1000;
651
else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 2)
652
rmode = RSID_OLIVIA_8_500;
653
else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 3)
654
rmode = RSID_OLIVIA_16_1000;
655
else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 2)
656
rmode = RSID_OLIVIA_4_500;
657
else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 1)
658
rmode = RSID_OLIVIA_4_250;
660
rmode = RSID_OLIVIA_16_500;
664
if (progdefaults.DOMINOEX_FEC)
665
rmode = RSID_DOMINOEX_4_FEC;
668
if (progdefaults.DOMINOEX_FEC)
669
rmode = RSID_DOMINOEX_5_FEC;
672
if (progdefaults.DOMINOEX_FEC)
673
rmode = RSID_DOMINOEX_8_FEC;
675
case MODE_DOMINOEX11:
676
if (progdefaults.DOMINOEX_FEC)
677
rmode = RSID_DOMINOEX_11_FEC;
679
case MODE_DOMINOEX16:
680
if (progdefaults.DOMINOEX_FEC)
681
rmode = RSID_DOMINOEX_16_FEC;
683
case MODE_DOMINOEX22:
684
if (progdefaults.DOMINOEX_FEC)
685
rmode = RSID_DOMINOEX_22_FEC;
689
if (progdefaults.mt63_interleave == 32)
690
rmode = RSID_MT63_500_ST;
693
if (progdefaults.mt63_interleave == 32)
694
rmode = RSID_MT63_1000_ST;
697
if (progdefaults.mt63_interleave == 32)
698
rmode = RSID_MT63_2000_ST;
702
// if rmode is still unset, look it up
703
if (rmode == RSID_NONE) {
704
for (size_t i = 0; i < sizeof(rsid_ids)/sizeof(*rsid_ids); i++) {
705
if (mode == rsid_ids[i].mode) {
706
rmode = rsid_ids[i].rs;
711
if (rmode == RSID_NONE)
716
outbuf = new double[symlen];
718
// transmit sequence of 15 symbols (tones)
720
for (int i = 0; i < 15; i++) {
722
if (active_modem->get_reverse())
724
freq = fr + iTone * 11025.0 / 1024;
725
phaseincr = 2.0 * M_PI * freq / sr;
727
for (int j = 0; j < symlen; j++) {
729
if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI;
730
outbuf[j] = sin(phase);
732
active_modem->ModulateXmtr(outbuf, symlen);
735
// transmit 3 symbol periods of silence
736
for (int j = 0; j < symlen; j++) outbuf[j] = 0.0;
737
active_modem->ModulateXmtr(outbuf, symlen);
738
active_modem->ModulateXmtr(outbuf, symlen);
739
active_modem->ModulateXmtr(outbuf, symlen);