mirror of
https://github.com/lwvmobile/dsd-fme.git
synced 2026-11-13 17:27:21 -05:00
T_Max Frame Sync Work; Reorganizing;
This commit is contained in:
@@ -15,6 +15,9 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
//Originally found at - https://github.com/LouisErigHerve/dsd
|
||||
//Modified for use in DSD-FME
|
||||
|
||||
#include "dsd.h"
|
||||
|
||||
char * getTimeL(void) //get pretty hh:mm:ss timestamp
|
||||
@@ -2919,4 +2922,18 @@ uint8_t ComputeCrc5Bit(uint8_t * DMRData)
|
||||
return CRC;
|
||||
} /* End ComputeCrc5Bit() */
|
||||
|
||||
uint32_t ConvertBitIntoBytes(uint8_t * BufferIn, uint32_t BitLength)
|
||||
{
|
||||
uint32_t Output = 0;
|
||||
uint32_t i;
|
||||
|
||||
for(i = 0; i < BitLength; i++)
|
||||
{
|
||||
Output <<= 1;
|
||||
Output |= (uint32_t)(BufferIn[i] & 1);
|
||||
}
|
||||
|
||||
return Output;
|
||||
} /* End ConvertBitIntoBytes() */
|
||||
|
||||
/* End of file */
|
||||
|
||||
@@ -177,10 +177,8 @@ void processdPMRvoice (dsd_opts * opts, dsd_state * state)
|
||||
x++;
|
||||
y++;
|
||||
z++;
|
||||
if (j == 3 && i == 28) //find sweet spot to cut off early
|
||||
{
|
||||
i = 40; //break early so FS2 sync can resync
|
||||
}
|
||||
//should be fixed now with the frame_sync t_max setup
|
||||
//no more early breaking required
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -265,7 +265,7 @@ static int digitize (dsd_opts* opts, dsd_state* state, int symbol)
|
||||
|
||||
else if ((state->synctype == 1) || (state->synctype == 3) || (state->synctype == 5) ||
|
||||
(state->synctype == 9) || (state->synctype == 11) || (state->synctype == 13) ||
|
||||
(state->synctype == 17) || (state->synctype == 36) )
|
||||
(state->synctype == 17) || (state->synctype == 29) || (state->synctype == 36) )
|
||||
|
||||
{
|
||||
// 1 -P25p1
|
||||
@@ -275,6 +275,8 @@ static int digitize (dsd_opts* opts, dsd_state* state, int symbol)
|
||||
// 11 -DMR (inverted signal voice frame)
|
||||
// 13 -DMR (inverted signal data frame)
|
||||
// 17 -NXDN (inverted data frame)
|
||||
// 29 -NXDN (inverted FSW)
|
||||
// 36 -P25p2
|
||||
|
||||
int valid;
|
||||
int dibit;
|
||||
@@ -284,7 +286,7 @@ static int digitize (dsd_opts* opts, dsd_state* state, int symbol)
|
||||
if (state->synctype == 1)
|
||||
{
|
||||
// Use the P25 heuristics if available
|
||||
valid = estimate_symbol(state->rf_mod, &(state->inv_p25_heuristics), state->last_dibit, symbol, &dibit);
|
||||
//valid = estimate_symbol(state->rf_mod, &(state->inv_p25_heuristics), state->last_dibit, symbol, &dibit);
|
||||
}
|
||||
|
||||
if (valid == 0)
|
||||
@@ -336,6 +338,8 @@ static int digitize (dsd_opts* opts, dsd_state* state, int symbol)
|
||||
// 10 +DMR (non inverted signal data frame)
|
||||
// 12 +DMR (non inverted signal voice frame)
|
||||
// 16 +NXDN (non inverted data frame)
|
||||
// 28 +NXND (FSW)
|
||||
// 35 +p25p2
|
||||
|
||||
int valid;
|
||||
int dibit;
|
||||
@@ -345,7 +349,7 @@ static int digitize (dsd_opts* opts, dsd_state* state, int symbol)
|
||||
if (state->synctype == 0)
|
||||
{
|
||||
// Use the P25 heuristics if available
|
||||
valid = estimate_symbol(state->rf_mod, &(state->p25_heuristics), state->last_dibit, symbol, &dibit);
|
||||
//valid = estimate_symbol(state->rf_mod, &(state->p25_heuristics), state->last_dibit, symbol, &dibit);
|
||||
}
|
||||
|
||||
if (valid == 0)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// DMR filter
|
||||
// Original DMR filter
|
||||
#define NZEROS 60
|
||||
float ngain = 7.423339364f;
|
||||
static float xv[NZEROS+1];
|
||||
@@ -21,70 +21,48 @@ float xcoeffs[] =
|
||||
-0.0083649323f,
|
||||
};
|
||||
|
||||
// NXDN48 filter
|
||||
//#define NXZEROS 134
|
||||
//float nxgain = 15.95930463f;
|
||||
|
||||
#define NXZEROS 91 //Osmocom OP25
|
||||
float nxgain = 1.0f; //Osmocom OP25
|
||||
|
||||
//reverted to original NXDN filters, do better with LICH/Data handling
|
||||
// NXDN48 filter - Original Version
|
||||
#define NXZEROS 134
|
||||
float nxgain = 15.95930463f;
|
||||
static float nxv[NXZEROS+1];
|
||||
|
||||
//OP25 Osmocom NXDN48 Coeffs seem to do well, will want to do some VS testing
|
||||
float nxcoeffs[] =
|
||||
{ 0.00203767f, 0.00491622f, 0.00748189f, 0.00934561f, 0.01017049f, 0.00972167f,
|
||||
0.00790748f, 0.00480597f, 0.00067202f, -0.00407743f, -0.00890019f, -0.01318478f,
|
||||
-0.01632047f, -0.01777371f, -0.01716241f, -0.01431852f, -0.00933066f, -0.00255979f,
|
||||
0.00537624f, 0.01364992f, 0.02130038f, 0.02733235f, 0.03082824f, 0.03106179f,
|
||||
0.02760061f, 0.02038545f, 0.00977572f, -0.0034462f, -0.01811514f, -0.03276675f,
|
||||
-0.04575844f, -0.05541762f, -0.06020353f, -0.0588669f, -0.05059129f, -0.03510097f,
|
||||
-0.01272309f, 0.01560398f, 0.04837926f, 0.08364189f, 0.11912012f, 0.15241359f,
|
||||
0.18119246f, 0.20339503f, 0.21740525f, 0.2221932f, 0.21740525f, 0.20339503f,
|
||||
0.18119246f, 0.15241359f, 0.11912012f, 0.08364189f, 0.04837926f, 0.01560398f,
|
||||
-0.01272309f, -0.03510097f, -0.05059129f, -0.0588669f, -0.06020353f, -0.05541762f,
|
||||
-0.04575844f, -0.03276675f, -0.01811514f, -0.0034462f, 0.00977572f, 0.02038545f,
|
||||
0.02760061f, 0.03106179f, 0.03082824f, 0.02733235f, 0.02130038f, 0.01364992f,
|
||||
0.00537624f, -0.00255979f, -0.00933066f, -0.01431852f, -0.01716241f, -0.01777371f,
|
||||
-0.01632047f, -0.01318478f, -0.00890019f, -0.00407743f, 0.00067202f, 0.00480597f,
|
||||
0.00790748f, 0.00972167f, 0.01017049f, 0.00934561f, 0.00748189f, 0.00491622f,
|
||||
0.00203767f};
|
||||
|
||||
//OLD nxCOEFFS
|
||||
// { +0.031462429f, +0.031747267f, +0.030401148f, +0.027362877f,
|
||||
// +0.022653298f, +0.016379869f, +0.008737200f, +0.000003302f,
|
||||
// -0.009468531f, -0.019262057f, -0.028914291f, -0.037935027f,
|
||||
// -0.045828927f, -0.052119261f, -0.056372283f, -0.058221106f,
|
||||
// -0.057387924f, -0.053703443f, -0.047122444f, -0.037734535f,
|
||||
// -0.025769308f, -0.011595336f, +0.004287292f, +0.021260954f,
|
||||
// +0.038610717f, +0.055550276f, +0.071252765f, +0.084885375f,
|
||||
// +0.095646450f, +0.102803611f, +0.105731303f, +0.103946126f,
|
||||
// +0.097138329f, +0.085197939f, +0.068234131f, +0.046586711f,
|
||||
// +0.020828821f, -0.008239664f, -0.039608255f, -0.072081234f,
|
||||
// -0.104311776f, -0.134843790f, -0.162160200f, -0.184736015f,
|
||||
// -0.201094346f, -0.209863285f, -0.209831516f, -0.200000470f,
|
||||
// -0.179630919f, -0.148282051f, -0.105841323f, -0.052543664f,
|
||||
// +0.011020985f, +0.083912428f, +0.164857408f, +0.252278939f,
|
||||
// +0.344336996f, +0.438979335f, +0.534000832f, +0.627109358f,
|
||||
// +0.715995947f, +0.798406824f, +0.872214756f, +0.935487176f,
|
||||
// +0.986548646f, +1.024035395f, +1.046939951f, +1.054644241f,
|
||||
// +1.046939951f, +1.024035395f, +0.986548646f, +0.935487176f,
|
||||
// +0.872214756f, +0.798406824f, +0.715995947f, +0.627109358f,
|
||||
// +0.534000832f, +0.438979335f, +0.344336996f, +0.252278939f,
|
||||
// +0.164857408f, +0.083912428f, +0.011020985f, -0.052543664f,
|
||||
// -0.105841323f, -0.148282051f, -0.179630919f, -0.200000470f,
|
||||
// -0.209831516f, -0.209863285f, -0.201094346f, -0.184736015f,
|
||||
// -0.162160200f, -0.134843790f, -0.104311776f, -0.072081234f,
|
||||
// -0.039608255f, -0.008239664f, +0.020828821f, +0.046586711f,
|
||||
// +0.068234131f, +0.085197939f, +0.097138329f, +0.103946126f,
|
||||
// +0.105731303f, +0.102803611f, +0.095646450f, +0.084885375f,
|
||||
// +0.071252765f, +0.055550276f, +0.038610717f, +0.021260954f,
|
||||
// +0.004287292f, -0.011595336f, -0.025769308f, -0.037734535f,
|
||||
// -0.047122444f, -0.053703443f, -0.057387924f, -0.058221106f,
|
||||
// -0.056372283f, -0.052119261f, -0.045828927f, -0.037935027f,
|
||||
// -0.028914291f, -0.019262057f, -0.009468531f, +0.000003302f,
|
||||
// +0.008737200f, +0.016379869f, +0.022653298f, +0.027362877f,
|
||||
// +0.030401148f, +0.031747267f, +0.031462429f,
|
||||
// };
|
||||
{ +0.031462429f, +0.031747267f, +0.030401148f, +0.027362877f,
|
||||
+0.022653298f, +0.016379869f, +0.008737200f, +0.000003302f,
|
||||
-0.009468531f, -0.019262057f, -0.028914291f, -0.037935027f,
|
||||
-0.045828927f, -0.052119261f, -0.056372283f, -0.058221106f,
|
||||
-0.057387924f, -0.053703443f, -0.047122444f, -0.037734535f,
|
||||
-0.025769308f, -0.011595336f, +0.004287292f, +0.021260954f,
|
||||
+0.038610717f, +0.055550276f, +0.071252765f, +0.084885375f,
|
||||
+0.095646450f, +0.102803611f, +0.105731303f, +0.103946126f,
|
||||
+0.097138329f, +0.085197939f, +0.068234131f, +0.046586711f,
|
||||
+0.020828821f, -0.008239664f, -0.039608255f, -0.072081234f,
|
||||
-0.104311776f, -0.134843790f, -0.162160200f, -0.184736015f,
|
||||
-0.201094346f, -0.209863285f, -0.209831516f, -0.200000470f,
|
||||
-0.179630919f, -0.148282051f, -0.105841323f, -0.052543664f,
|
||||
+0.011020985f, +0.083912428f, +0.164857408f, +0.252278939f,
|
||||
+0.344336996f, +0.438979335f, +0.534000832f, +0.627109358f,
|
||||
+0.715995947f, +0.798406824f, +0.872214756f, +0.935487176f,
|
||||
+0.986548646f, +1.024035395f, +1.046939951f, +1.054644241f,
|
||||
+1.046939951f, +1.024035395f, +0.986548646f, +0.935487176f,
|
||||
+0.872214756f, +0.798406824f, +0.715995947f, +0.627109358f,
|
||||
+0.534000832f, +0.438979335f, +0.344336996f, +0.252278939f,
|
||||
+0.164857408f, +0.083912428f, +0.011020985f, -0.052543664f,
|
||||
-0.105841323f, -0.148282051f, -0.179630919f, -0.200000470f,
|
||||
-0.209831516f, -0.209863285f, -0.201094346f, -0.184736015f,
|
||||
-0.162160200f, -0.134843790f, -0.104311776f, -0.072081234f,
|
||||
-0.039608255f, -0.008239664f, +0.020828821f, +0.046586711f,
|
||||
+0.068234131f, +0.085197939f, +0.097138329f, +0.103946126f,
|
||||
+0.105731303f, +0.102803611f, +0.095646450f, +0.084885375f,
|
||||
+0.071252765f, +0.055550276f, +0.038610717f, +0.021260954f,
|
||||
+0.004287292f, -0.011595336f, -0.025769308f, -0.037734535f,
|
||||
-0.047122444f, -0.053703443f, -0.057387924f, -0.058221106f,
|
||||
-0.056372283f, -0.052119261f, -0.045828927f, -0.037935027f,
|
||||
-0.028914291f, -0.019262057f, -0.009468531f, +0.000003302f,
|
||||
+0.008737200f, +0.016379869f, +0.022653298f, +0.027362877f,
|
||||
+0.030401148f, +0.031747267f, +0.031462429f,
|
||||
};
|
||||
|
||||
// DMR filter F4EXB
|
||||
#define DMRNZEROS 60
|
||||
@@ -110,6 +88,52 @@ const float dmrcoeffs[] =
|
||||
0.0147202645, -0.0186176083, -0.0428325003, -0.0543747957, -0.0528141756,
|
||||
-0.0404938748, -0.0216605133, -0.0013114705, 0.0159662432, 0.0269200615, 0.0301506278};
|
||||
|
||||
// dPMR filter, version of F4EXB
|
||||
static float dpmrxv[NXZEROS+1];
|
||||
|
||||
// dPMR filter, version of F4EXB
|
||||
#define DPMRNZEROS 134
|
||||
|
||||
// dPMR filter, version of F4EXB
|
||||
const float dpmrgain = 14.6083498224f;
|
||||
|
||||
// dPMR filter - root raised cosine alpha=0.2 Ts = 3325 S/s Fc = 48 kHz - zero at boundaries appears to be slightly better
|
||||
const float dpmrcoeffs[] =
|
||||
{-0.0000983004, 0.0058388841, 0.0119748846, 0.0179185547, 0.0232592816,
|
||||
0.0275919612, 0.0305433586, 0.0317982965, 0.0311240307,
|
||||
0.0283911865, 0.0235897433, 0.0168387650, 0.0083888763,
|
||||
-0.0013831396, -0.0119878087, -0.0228442151, -0.0333082708,
|
||||
-0.0427067804, -0.0503756642, -0.0557003599, -0.0581561791,
|
||||
-0.0573462646, -0.0530347941, -0.0451732069, -0.0339174991,
|
||||
-0.0196350217, -0.0028997157, 0.0155246961, 0.0347134030,
|
||||
0.0536202583, 0.0711271166, 0.0861006725, 0.0974542022,
|
||||
0.1042112035, 0.1055676660, 0.1009496091, 0.0900625944,
|
||||
0.0729301774, 0.0499186839, 0.0217462748, -0.0105250265,
|
||||
-0.0455148664, -0.0815673067, -0.1168095612, -0.1492246435,
|
||||
-0.1767350726, -0.1972941202, -0.2089805758, -0.2100926829,
|
||||
-0.1992367833, -0.1754063031, -0.1380470370, -0.0871052089,
|
||||
-0.0230554989, 0.0530929052, 0.1398131936, 0.2351006721,
|
||||
0.3365341927, 0.4413570929, 0.5465745033, 0.6490630781,
|
||||
0.7456885564, 0.8334261381, 0.9094784589, 0.9713859928,
|
||||
1.0171250045, 1.0451886943, 1.0546479089, 1.0451886943,
|
||||
1.0171250045, 0.9713859928, 0.9094784589, 0.8334261381,
|
||||
0.7456885564, 0.6490630781, 0.5465745033, 0.4413570929,
|
||||
0.3365341927, 0.2351006721, 0.1398131936, 0.0530929052,
|
||||
-0.0230554989, -0.0871052089, -0.1380470370, -0.1754063031,
|
||||
-0.1992367833, -0.2100926829, -0.2089805758, -0.1972941202,
|
||||
-0.1767350726, -0.1492246435, -0.1168095612, -0.0815673067,
|
||||
-0.0455148664, -0.0105250265, 0.0217462748, 0.0499186839,
|
||||
0.0729301774, 0.0900625944, 0.1009496091, 0.1055676660,
|
||||
0.1042112035, 0.0974542022, 0.0861006725, 0.0711271166,
|
||||
0.0536202583, 0.0347134030, 0.0155246961, -0.0028997157,
|
||||
-0.0196350217, -0.0339174991, -0.0451732069, -0.0530347941,
|
||||
-0.0573462646, -0.0581561791, -0.0557003599, -0.0503756642,
|
||||
-0.0427067804, -0.0333082708, -0.0228442151, -0.0119878087,
|
||||
-0.0013831396, 0.0083888763, 0.0168387650, 0.0235897433,
|
||||
0.0283911865, 0.0311240307, 0.0317982965, 0.0305433586,
|
||||
0.0275919612, 0.0232592816, 0.0179185547, 0.0119748846,
|
||||
0.0058388841, -0.0000983004};
|
||||
|
||||
|
||||
|
||||
short dsd_input_filter(short sample, int mode);
|
||||
@@ -123,7 +147,13 @@ dmr_filter(short sample)
|
||||
short
|
||||
nxdn_filter(short sample)
|
||||
{
|
||||
return dsd_input_filter(sample, 2);
|
||||
return dsd_input_filter(sample, 2);
|
||||
}
|
||||
|
||||
short
|
||||
dpmr_filter(short sample)
|
||||
{
|
||||
return dsd_input_filter(sample, 4);
|
||||
}
|
||||
|
||||
|
||||
@@ -144,7 +174,7 @@ dsd_input_filter(short sample, int mode)
|
||||
case 2:
|
||||
gain = nxgain;
|
||||
v = nxv;
|
||||
coeffs = nxcoeffs;
|
||||
coeffs = (float *)nxcoeffs;
|
||||
zeros = NXZEROS;
|
||||
break;
|
||||
case 3:
|
||||
@@ -153,6 +183,12 @@ dsd_input_filter(short sample, int mode)
|
||||
coeffs = (float *)dmrcoeffs;
|
||||
zeros = DMRNZEROS;
|
||||
break;
|
||||
case 4:
|
||||
gain = dpmrgain;
|
||||
v = dpmrxv;
|
||||
coeffs = (float *)dpmrcoeffs;
|
||||
zeros = DPMRNZEROS;
|
||||
break;
|
||||
default:
|
||||
return sample;
|
||||
}
|
||||
|
||||
@@ -84,54 +84,13 @@ processFrame (dsd_opts * opts, dsd_state * state)
|
||||
state->minref = state->min;
|
||||
}
|
||||
|
||||
if ((state->synctype == 8) || (state->synctype == 9)) //NXDN Voice
|
||||
{
|
||||
//state->rf_mod = 2; //wrong type of modulation HERE HERE
|
||||
state->nac = 0;
|
||||
state->lastsrc = 0;
|
||||
state->lasttg = 0;
|
||||
if (opts->errorbars == 1)
|
||||
{
|
||||
if (opts->verbose > 0)
|
||||
{
|
||||
level = (int) state->max / 164;
|
||||
//fprintf (stderr, "inlvl: %2i%% ", level);
|
||||
}
|
||||
}
|
||||
state->nac = 0;
|
||||
if ((opts->mbe_out_dir[0] != 0) && (opts->mbe_out_f == NULL))
|
||||
{
|
||||
openMbeOutFile (opts, state);
|
||||
}
|
||||
sprintf (state->fsubtype, " VOICE ");
|
||||
processNXDNVoice (opts, state);
|
||||
//ProcessNXDNFrame (opts, state, 0);
|
||||
return;
|
||||
}
|
||||
else if ((state->synctype == 16) || (state->synctype == 17)) //NXDN Data
|
||||
{
|
||||
//state->rf_mod = 2;
|
||||
state->nac = 0;
|
||||
state->lastsrc = 0;
|
||||
state->lasttg = 0;
|
||||
if (opts->errorbars == 1)
|
||||
{
|
||||
if (opts->verbose > 0)
|
||||
{
|
||||
level = (int) state->max / 164;
|
||||
//fprintf (stderr, "inlvl: %2i%% ", level);
|
||||
}
|
||||
}
|
||||
state->nac = 0;
|
||||
if ((opts->mbe_out_dir[0] != 0) && (opts->mbe_out_f == NULL))
|
||||
{
|
||||
openMbeOutFile (opts, state);
|
||||
}
|
||||
sprintf (state->fsubtype, " DATA ");
|
||||
processNXDNData (opts, state);
|
||||
//ProcessNXDNFrame (opts, state, 0);
|
||||
return;
|
||||
}
|
||||
//NXDN FSW
|
||||
if ((state->synctype == 28) || (state->synctype == 29))
|
||||
{
|
||||
nxdn_frame (opts, state);
|
||||
//no MBEout...use symbol capture bin instead!
|
||||
return;
|
||||
}
|
||||
else if ((state->synctype == 6) || (state->synctype == 7))
|
||||
{
|
||||
state->nac = 0;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -201,7 +201,7 @@ processMbeFrame (dsd_opts * opts, dsd_state * state, char imbe_fr[8][23], char a
|
||||
saveAmbe2450Data (opts, state, ambe_d);
|
||||
}
|
||||
}
|
||||
else if ((state->synctype == 8) || (state->synctype == 9))
|
||||
else if ((state->synctype == 28) || (state->synctype == 29)) //was 8 and 9
|
||||
{
|
||||
|
||||
state->errs = mbe_eccAmbe3600x2450C0 (ambe_fr);
|
||||
|
||||
@@ -178,18 +178,25 @@ getSymbol (dsd_opts * opts, dsd_state * state, int have_sync)
|
||||
state->lastsynctype == 20 || state->lastsynctype == 21 ||
|
||||
state->lastsynctype == 22 || state->lastsynctype == 23 ||
|
||||
state->lastsynctype == 24 || state->lastsynctype == 25 ||
|
||||
state->lastsynctype == 26 || state->lastsynctype == 27 ) //||
|
||||
//state->lastsynctype == 35 || state->lastsynctype == 36) //phase 2
|
||||
state->lastsynctype == 26 || state->lastsynctype == 27 ||
|
||||
state->lastsynctype == 28 || state->lastsynctype == 29 ) //||
|
||||
//state->lastsynctype == 35 || state->lastsynctype == 36) //phase 2 C4FM disc tap input
|
||||
{
|
||||
if(state->samplesPerSymbol == 20)
|
||||
//if(state->samplesPerSymbol == 20)
|
||||
if(opts->frame_nxdn48 == 1)
|
||||
{
|
||||
sample = nxdn_filter(sample);
|
||||
}
|
||||
//else if (state->lastsynctype >= 20 && state->lastsynctype <=27) //this the right range?
|
||||
else if (opts->frame_dpmr == 1)
|
||||
{
|
||||
sample = dpmr_filter(sample);
|
||||
}
|
||||
else if (state->samplesPerSymbol == 8) //phase 2 cqpsk
|
||||
{
|
||||
//sample = dmr_filter(sample); //work on filter later
|
||||
}
|
||||
else // the 12.5KHz NXDN filter is the same as the DMR filter
|
||||
else // the 12.5KHz NXDN filter is the same as the DMR filter...hopefully
|
||||
{
|
||||
sample = dmr_filter(sample);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user