mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-03-24 04:58:46 -04:00
Rempove remaining QRA64 code and direcories.
This commit is contained in:
parent
4b1077f897
commit
a8200fdfdd
@ -1,30 +0,0 @@
|
||||
FC = gfortran
|
||||
CC = gcc
|
||||
CFLAGS = -O2 -Wall -I. -D_WIN32
|
||||
|
||||
# Default rules
|
||||
%.o: %.c
|
||||
${CC} ${CFLAGS} -c $<
|
||||
%.o: %.f
|
||||
${FC} ${FFLAGS} -c $<
|
||||
%.o: %.F
|
||||
${FC} ${FFLAGS} -c $<
|
||||
%.o: %.f90
|
||||
${FC} ${FFLAGS} -c $<
|
||||
%.o: %.F90
|
||||
${FC} ${FFLAGS} -c $<
|
||||
|
||||
all: qra64.exe
|
||||
|
||||
OBJS1 = main.o qra64.o
|
||||
qra64.exe: $(OBJS1)
|
||||
${CC} -o qra64.exe $(OBJS1) ../qracodes/libqra64.a -lm
|
||||
|
||||
OBJS2 = qra64sim.o options.o wavhdr.o
|
||||
qra64sim.exe: $(OBJS2)
|
||||
${FC} -o qra64sim.exe $(OBJS2) ../qracodes/libqra64.a -lm
|
||||
|
||||
.PHONY : clean
|
||||
|
||||
clean:
|
||||
$(RM) *.o qra64.exe qra64sim.exe
|
@ -1,302 +0,0 @@
|
||||
// Gaussian energy fading tables for QRA64
|
||||
static const int glen_tab_gauss[64] = {
|
||||
2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2,
|
||||
3, 3, 3, 3, 3, 3, 3, 3,
|
||||
4, 4, 4, 4, 5, 5, 5, 6,
|
||||
6, 6, 7, 7, 8, 8, 9, 10,
|
||||
10, 11, 12, 13, 14, 15, 17, 18,
|
||||
19, 21, 23, 25, 27, 29, 32, 34,
|
||||
37, 41, 44, 48, 52, 57, 62, 65
|
||||
};
|
||||
static const float ggauss1[2] = {
|
||||
0.0296f, 0.9101f
|
||||
};
|
||||
static const float ggauss2[2] = {
|
||||
0.0350f, 0.8954f
|
||||
};
|
||||
static const float ggauss3[2] = {
|
||||
0.0411f, 0.8787f
|
||||
};
|
||||
static const float ggauss4[2] = {
|
||||
0.0483f, 0.8598f
|
||||
};
|
||||
static const float ggauss5[2] = {
|
||||
0.0566f, 0.8387f
|
||||
};
|
||||
static const float ggauss6[2] = {
|
||||
0.0660f, 0.8154f
|
||||
};
|
||||
static const float ggauss7[2] = {
|
||||
0.0767f, 0.7898f
|
||||
};
|
||||
static const float ggauss8[2] = {
|
||||
0.0886f, 0.7621f
|
||||
};
|
||||
static const float ggauss9[2] = {
|
||||
0.1017f, 0.7325f
|
||||
};
|
||||
static const float ggauss10[2] = {
|
||||
0.1159f, 0.7012f
|
||||
};
|
||||
static const float ggauss11[2] = {
|
||||
0.1310f, 0.6687f
|
||||
};
|
||||
static const float ggauss12[2] = {
|
||||
0.1465f, 0.6352f
|
||||
};
|
||||
static const float ggauss13[2] = {
|
||||
0.1621f, 0.6013f
|
||||
};
|
||||
static const float ggauss14[2] = {
|
||||
0.1771f, 0.5674f
|
||||
};
|
||||
static const float ggauss15[2] = {
|
||||
0.1911f, 0.5339f
|
||||
};
|
||||
static const float ggauss16[2] = {
|
||||
0.2034f, 0.5010f
|
||||
};
|
||||
static const float ggauss17[3] = {
|
||||
0.0299f, 0.2135f, 0.4690f
|
||||
};
|
||||
static const float ggauss18[3] = {
|
||||
0.0369f, 0.2212f, 0.4383f
|
||||
};
|
||||
static const float ggauss19[3] = {
|
||||
0.0454f, 0.2263f, 0.4088f
|
||||
};
|
||||
static const float ggauss20[3] = {
|
||||
0.0552f, 0.2286f, 0.3806f
|
||||
};
|
||||
static const float ggauss21[3] = {
|
||||
0.0658f, 0.2284f, 0.3539f
|
||||
};
|
||||
static const float ggauss22[3] = {
|
||||
0.0766f, 0.2258f, 0.3287f
|
||||
};
|
||||
static const float ggauss23[3] = {
|
||||
0.0869f, 0.2212f, 0.3049f
|
||||
};
|
||||
static const float ggauss24[3] = {
|
||||
0.0962f, 0.2148f, 0.2826f
|
||||
};
|
||||
static const float ggauss25[4] = {
|
||||
0.0351f, 0.1041f, 0.2071f, 0.2616f
|
||||
};
|
||||
static const float ggauss26[4] = {
|
||||
0.0429f, 0.1102f, 0.1984f, 0.2420f
|
||||
};
|
||||
static const float ggauss27[4] = {
|
||||
0.0508f, 0.1145f, 0.1890f, 0.2237f
|
||||
};
|
||||
static const float ggauss28[4] = {
|
||||
0.0582f, 0.1169f, 0.1791f, 0.2067f
|
||||
};
|
||||
static const float ggauss29[5] = {
|
||||
0.0289f, 0.0648f, 0.1176f, 0.1689f, 0.1908f
|
||||
};
|
||||
static const float ggauss30[5] = {
|
||||
0.0351f, 0.0703f, 0.1168f, 0.1588f, 0.1760f
|
||||
};
|
||||
static const float ggauss31[5] = {
|
||||
0.0411f, 0.0745f, 0.1146f, 0.1488f, 0.1623f
|
||||
};
|
||||
static const float ggauss32[6] = {
|
||||
0.0246f, 0.0466f, 0.0773f, 0.1115f, 0.1390f, 0.1497f
|
||||
};
|
||||
static const float ggauss33[6] = {
|
||||
0.0297f, 0.0512f, 0.0788f, 0.1075f, 0.1295f, 0.1379f
|
||||
};
|
||||
static const float ggauss34[6] = {
|
||||
0.0345f, 0.0549f, 0.0791f, 0.1029f, 0.1205f, 0.1270f
|
||||
};
|
||||
static const float ggauss35[7] = {
|
||||
0.0240f, 0.0387f, 0.0575f, 0.0784f, 0.0979f, 0.1118f, 0.1169f
|
||||
};
|
||||
static const float ggauss36[7] = {
|
||||
0.0281f, 0.0422f, 0.0590f, 0.0767f, 0.0926f, 0.1037f, 0.1076f
|
||||
};
|
||||
static const float ggauss37[8] = {
|
||||
0.0212f, 0.0318f, 0.0449f, 0.0596f, 0.0744f, 0.0872f, 0.0960f, 0.0991f
|
||||
};
|
||||
static const float ggauss38[8] = {
|
||||
0.0247f, 0.0348f, 0.0467f, 0.0593f, 0.0716f, 0.0819f, 0.0887f, 0.0911f
|
||||
};
|
||||
static const float ggauss39[9] = {
|
||||
0.0199f, 0.0278f, 0.0372f, 0.0476f, 0.0584f, 0.0684f, 0.0766f, 0.0819f,
|
||||
0.0838f
|
||||
};
|
||||
static const float ggauss40[10] = {
|
||||
0.0166f, 0.0228f, 0.0303f, 0.0388f, 0.0478f, 0.0568f, 0.0649f, 0.0714f,
|
||||
0.0756f, 0.0771f
|
||||
};
|
||||
static const float ggauss41[10] = {
|
||||
0.0193f, 0.0254f, 0.0322f, 0.0397f, 0.0474f, 0.0548f, 0.0613f, 0.0664f,
|
||||
0.0697f, 0.0709f
|
||||
};
|
||||
static const float ggauss42[11] = {
|
||||
0.0168f, 0.0217f, 0.0273f, 0.0335f, 0.0399f, 0.0464f, 0.0524f, 0.0576f,
|
||||
0.0617f, 0.0643f, 0.0651f
|
||||
};
|
||||
static const float ggauss43[12] = {
|
||||
0.0151f, 0.0191f, 0.0237f, 0.0288f, 0.0342f, 0.0396f, 0.0449f, 0.0498f,
|
||||
0.0540f, 0.0572f, 0.0592f, 0.0599f
|
||||
};
|
||||
static const float ggauss44[13] = {
|
||||
0.0138f, 0.0171f, 0.0210f, 0.0252f, 0.0297f, 0.0343f, 0.0388f, 0.0432f,
|
||||
0.0471f, 0.0504f, 0.0529f, 0.0545f, 0.0550f
|
||||
};
|
||||
static const float ggauss45[14] = {
|
||||
0.0128f, 0.0157f, 0.0189f, 0.0224f, 0.0261f, 0.0300f, 0.0339f, 0.0377f,
|
||||
0.0412f, 0.0444f, 0.0470f, 0.0489f, 0.0501f, 0.0505f
|
||||
};
|
||||
static const float ggauss46[15] = {
|
||||
0.0121f, 0.0146f, 0.0173f, 0.0202f, 0.0234f, 0.0266f, 0.0299f, 0.0332f,
|
||||
0.0363f, 0.0391f, 0.0416f, 0.0437f, 0.0452f, 0.0461f, 0.0464f
|
||||
};
|
||||
static const float ggauss47[17] = {
|
||||
0.0097f, 0.0116f, 0.0138f, 0.0161f, 0.0186f, 0.0212f, 0.0239f, 0.0267f,
|
||||
0.0294f, 0.0321f, 0.0346f, 0.0369f, 0.0389f, 0.0405f, 0.0417f, 0.0424f,
|
||||
0.0427f
|
||||
};
|
||||
static const float ggauss48[18] = {
|
||||
0.0096f, 0.0113f, 0.0131f, 0.0151f, 0.0172f, 0.0194f, 0.0217f, 0.0241f,
|
||||
0.0264f, 0.0287f, 0.0308f, 0.0329f, 0.0347f, 0.0362f, 0.0375f, 0.0384f,
|
||||
0.0390f, 0.0392f
|
||||
};
|
||||
static const float ggauss49[19] = {
|
||||
0.0095f, 0.0110f, 0.0126f, 0.0143f, 0.0161f, 0.0180f, 0.0199f, 0.0219f,
|
||||
0.0239f, 0.0258f, 0.0277f, 0.0294f, 0.0310f, 0.0325f, 0.0337f, 0.0347f,
|
||||
0.0354f, 0.0358f, 0.0360f
|
||||
};
|
||||
static const float ggauss50[21] = {
|
||||
0.0083f, 0.0095f, 0.0108f, 0.0122f, 0.0136f, 0.0152f, 0.0168f, 0.0184f,
|
||||
0.0201f, 0.0217f, 0.0234f, 0.0250f, 0.0265f, 0.0279f, 0.0292f, 0.0303f,
|
||||
0.0313f, 0.0320f, 0.0326f, 0.0329f, 0.0330f
|
||||
};
|
||||
static const float ggauss51[23] = {
|
||||
0.0074f, 0.0084f, 0.0095f, 0.0106f, 0.0118f, 0.0131f, 0.0144f, 0.0157f,
|
||||
0.0171f, 0.0185f, 0.0199f, 0.0213f, 0.0227f, 0.0240f, 0.0252f, 0.0263f,
|
||||
0.0273f, 0.0282f, 0.0290f, 0.0296f, 0.0300f, 0.0303f, 0.0303f
|
||||
};
|
||||
static const float ggauss52[25] = {
|
||||
0.0068f, 0.0076f, 0.0085f, 0.0094f, 0.0104f, 0.0115f, 0.0126f, 0.0137f,
|
||||
0.0149f, 0.0160f, 0.0172f, 0.0184f, 0.0196f, 0.0207f, 0.0218f, 0.0228f,
|
||||
0.0238f, 0.0247f, 0.0255f, 0.0262f, 0.0268f, 0.0273f, 0.0276f, 0.0278f,
|
||||
0.0279f
|
||||
};
|
||||
static const float ggauss53[27] = {
|
||||
0.0063f, 0.0070f, 0.0078f, 0.0086f, 0.0094f, 0.0103f, 0.0112f, 0.0121f,
|
||||
0.0131f, 0.0141f, 0.0151f, 0.0161f, 0.0170f, 0.0180f, 0.0190f, 0.0199f,
|
||||
0.0208f, 0.0216f, 0.0224f, 0.0231f, 0.0237f, 0.0243f, 0.0247f, 0.0251f,
|
||||
0.0254f, 0.0255f, 0.0256f
|
||||
};
|
||||
static const float ggauss54[29] = {
|
||||
0.0060f, 0.0066f, 0.0072f, 0.0079f, 0.0086f, 0.0093f, 0.0101f, 0.0109f,
|
||||
0.0117f, 0.0125f, 0.0133f, 0.0142f, 0.0150f, 0.0159f, 0.0167f, 0.0175f,
|
||||
0.0183f, 0.0190f, 0.0197f, 0.0204f, 0.0210f, 0.0216f, 0.0221f, 0.0225f,
|
||||
0.0228f, 0.0231f, 0.0233f, 0.0234f, 0.0235f
|
||||
};
|
||||
static const float ggauss55[32] = {
|
||||
0.0053f, 0.0058f, 0.0063f, 0.0068f, 0.0074f, 0.0080f, 0.0086f, 0.0093f,
|
||||
0.0099f, 0.0106f, 0.0113f, 0.0120f, 0.0127f, 0.0134f, 0.0141f, 0.0148f,
|
||||
0.0155f, 0.0162f, 0.0168f, 0.0174f, 0.0180f, 0.0186f, 0.0191f, 0.0196f,
|
||||
0.0201f, 0.0204f, 0.0208f, 0.0211f, 0.0213f, 0.0214f, 0.0215f, 0.0216f
|
||||
};
|
||||
static const float ggauss56[34] = {
|
||||
0.0052f, 0.0056f, 0.0060f, 0.0065f, 0.0070f, 0.0075f, 0.0080f, 0.0086f,
|
||||
0.0091f, 0.0097f, 0.0103f, 0.0109f, 0.0115f, 0.0121f, 0.0127f, 0.0133f,
|
||||
0.0138f, 0.0144f, 0.0150f, 0.0155f, 0.0161f, 0.0166f, 0.0170f, 0.0175f,
|
||||
0.0179f, 0.0183f, 0.0186f, 0.0189f, 0.0192f, 0.0194f, 0.0196f, 0.0197f,
|
||||
0.0198f, 0.0198f
|
||||
};
|
||||
static const float ggauss57[37] = {
|
||||
0.0047f, 0.0051f, 0.0055f, 0.0058f, 0.0063f, 0.0067f, 0.0071f, 0.0076f,
|
||||
0.0080f, 0.0085f, 0.0090f, 0.0095f, 0.0100f, 0.0105f, 0.0110f, 0.0115f,
|
||||
0.0120f, 0.0125f, 0.0130f, 0.0134f, 0.0139f, 0.0144f, 0.0148f, 0.0152f,
|
||||
0.0156f, 0.0160f, 0.0164f, 0.0167f, 0.0170f, 0.0173f, 0.0175f, 0.0177f,
|
||||
0.0179f, 0.0180f, 0.0181f, 0.0181f, 0.0182f
|
||||
};
|
||||
static const float ggauss58[41] = {
|
||||
0.0041f, 0.0044f, 0.0047f, 0.0050f, 0.0054f, 0.0057f, 0.0060f, 0.0064f,
|
||||
0.0068f, 0.0072f, 0.0076f, 0.0080f, 0.0084f, 0.0088f, 0.0092f, 0.0096f,
|
||||
0.0101f, 0.0105f, 0.0109f, 0.0113f, 0.0117f, 0.0121f, 0.0125f, 0.0129f,
|
||||
0.0133f, 0.0137f, 0.0140f, 0.0144f, 0.0147f, 0.0150f, 0.0153f, 0.0155f,
|
||||
0.0158f, 0.0160f, 0.0162f, 0.0163f, 0.0164f, 0.0165f, 0.0166f, 0.0167f,
|
||||
0.0167f
|
||||
};
|
||||
static const float ggauss59[44] = {
|
||||
0.0039f, 0.0042f, 0.0044f, 0.0047f, 0.0050f, 0.0053f, 0.0056f, 0.0059f,
|
||||
0.0062f, 0.0065f, 0.0068f, 0.0072f, 0.0075f, 0.0079f, 0.0082f, 0.0086f,
|
||||
0.0089f, 0.0093f, 0.0096f, 0.0100f, 0.0104f, 0.0107f, 0.0110f, 0.0114f,
|
||||
0.0117f, 0.0120f, 0.0124f, 0.0127f, 0.0130f, 0.0132f, 0.0135f, 0.0138f,
|
||||
0.0140f, 0.0142f, 0.0144f, 0.0146f, 0.0148f, 0.0149f, 0.0150f, 0.0151f,
|
||||
0.0152f, 0.0153f, 0.0153f, 0.0153f
|
||||
};
|
||||
static const float ggauss60[48] = {
|
||||
0.0036f, 0.0038f, 0.0040f, 0.0042f, 0.0044f, 0.0047f, 0.0049f, 0.0052f,
|
||||
0.0055f, 0.0057f, 0.0060f, 0.0063f, 0.0066f, 0.0068f, 0.0071f, 0.0074f,
|
||||
0.0077f, 0.0080f, 0.0083f, 0.0086f, 0.0089f, 0.0092f, 0.0095f, 0.0098f,
|
||||
0.0101f, 0.0104f, 0.0107f, 0.0109f, 0.0112f, 0.0115f, 0.0117f, 0.0120f,
|
||||
0.0122f, 0.0124f, 0.0126f, 0.0128f, 0.0130f, 0.0132f, 0.0134f, 0.0135f,
|
||||
0.0136f, 0.0137f, 0.0138f, 0.0139f, 0.0140f, 0.0140f, 0.0140f, 0.0140f
|
||||
};
|
||||
static const float ggauss61[52] = {
|
||||
0.0033f, 0.0035f, 0.0037f, 0.0039f, 0.0041f, 0.0043f, 0.0045f, 0.0047f,
|
||||
0.0049f, 0.0051f, 0.0053f, 0.0056f, 0.0058f, 0.0060f, 0.0063f, 0.0065f,
|
||||
0.0068f, 0.0070f, 0.0073f, 0.0075f, 0.0078f, 0.0080f, 0.0083f, 0.0085f,
|
||||
0.0088f, 0.0090f, 0.0093f, 0.0095f, 0.0098f, 0.0100f, 0.0102f, 0.0105f,
|
||||
0.0107f, 0.0109f, 0.0111f, 0.0113f, 0.0115f, 0.0116f, 0.0118f, 0.0120f,
|
||||
0.0121f, 0.0122f, 0.0124f, 0.0125f, 0.0126f, 0.0126f, 0.0127f, 0.0128f,
|
||||
0.0128f, 0.0129f, 0.0129f, 0.0129f
|
||||
};
|
||||
static const float ggauss62[57] = {
|
||||
0.0030f, 0.0031f, 0.0033f, 0.0034f, 0.0036f, 0.0038f, 0.0039f, 0.0041f,
|
||||
0.0043f, 0.0045f, 0.0047f, 0.0048f, 0.0050f, 0.0052f, 0.0054f, 0.0056f,
|
||||
0.0058f, 0.0060f, 0.0063f, 0.0065f, 0.0067f, 0.0069f, 0.0071f, 0.0073f,
|
||||
0.0075f, 0.0077f, 0.0080f, 0.0082f, 0.0084f, 0.0086f, 0.0088f, 0.0090f,
|
||||
0.0092f, 0.0094f, 0.0096f, 0.0097f, 0.0099f, 0.0101f, 0.0103f, 0.0104f,
|
||||
0.0106f, 0.0107f, 0.0108f, 0.0110f, 0.0111f, 0.0112f, 0.0113f, 0.0114f,
|
||||
0.0115f, 0.0116f, 0.0116f, 0.0117f, 0.0117f, 0.0118f, 0.0118f, 0.0118f,
|
||||
0.0118f
|
||||
};
|
||||
static const float ggauss63[62] = {
|
||||
0.0027f, 0.0029f, 0.0030f, 0.0031f, 0.0032f, 0.0034f, 0.0035f, 0.0037f,
|
||||
0.0038f, 0.0040f, 0.0041f, 0.0043f, 0.0045f, 0.0046f, 0.0048f, 0.0049f,
|
||||
0.0051f, 0.0053f, 0.0055f, 0.0056f, 0.0058f, 0.0060f, 0.0062f, 0.0063f,
|
||||
0.0065f, 0.0067f, 0.0069f, 0.0071f, 0.0072f, 0.0074f, 0.0076f, 0.0078f,
|
||||
0.0079f, 0.0081f, 0.0083f, 0.0084f, 0.0086f, 0.0088f, 0.0089f, 0.0091f,
|
||||
0.0092f, 0.0094f, 0.0095f, 0.0096f, 0.0098f, 0.0099f, 0.0100f, 0.0101f,
|
||||
0.0102f, 0.0103f, 0.0104f, 0.0105f, 0.0105f, 0.0106f, 0.0107f, 0.0107f,
|
||||
0.0108f, 0.0108f, 0.0108f, 0.0108f, 0.0109f, 0.0109f
|
||||
};
|
||||
static const float ggauss64[65] = {
|
||||
0.0028f, 0.0029f, 0.0030f, 0.0031f, 0.0032f, 0.0034f, 0.0035f, 0.0036f,
|
||||
0.0037f, 0.0039f, 0.0040f, 0.0041f, 0.0043f, 0.0044f, 0.0046f, 0.0047f,
|
||||
0.0048f, 0.0050f, 0.0051f, 0.0053f, 0.0054f, 0.0056f, 0.0057f, 0.0059f,
|
||||
0.0060f, 0.0062f, 0.0063f, 0.0065f, 0.0066f, 0.0068f, 0.0069f, 0.0071f,
|
||||
0.0072f, 0.0074f, 0.0075f, 0.0077f, 0.0078f, 0.0079f, 0.0081f, 0.0082f,
|
||||
0.0083f, 0.0084f, 0.0086f, 0.0087f, 0.0088f, 0.0089f, 0.0090f, 0.0091f,
|
||||
0.0092f, 0.0093f, 0.0094f, 0.0094f, 0.0095f, 0.0096f, 0.0097f, 0.0097f,
|
||||
0.0098f, 0.0098f, 0.0099f, 0.0099f, 0.0099f, 0.0099f, 0.0100f, 0.0100f,
|
||||
0.0100f
|
||||
};
|
||||
static const float *gptr_tab_gauss[64] = {
|
||||
ggauss1, ggauss2, ggauss3, ggauss4,
|
||||
ggauss5, ggauss6, ggauss7, ggauss8,
|
||||
ggauss9, ggauss10, ggauss11, ggauss12,
|
||||
ggauss13, ggauss14, ggauss15, ggauss16,
|
||||
ggauss17, ggauss18, ggauss19, ggauss20,
|
||||
ggauss21, ggauss22, ggauss23, ggauss24,
|
||||
ggauss25, ggauss26, ggauss27, ggauss28,
|
||||
ggauss29, ggauss30, ggauss31, ggauss32,
|
||||
ggauss33, ggauss34, ggauss35, ggauss36,
|
||||
ggauss37, ggauss38, ggauss39, ggauss40,
|
||||
ggauss41, ggauss42, ggauss43, ggauss44,
|
||||
ggauss45, ggauss46, ggauss47, ggauss48,
|
||||
ggauss49, ggauss50, ggauss51, ggauss52,
|
||||
ggauss53, ggauss54, ggauss55, ggauss56,
|
||||
ggauss57, ggauss58, ggauss59, ggauss60,
|
||||
ggauss61, ggauss62, ggauss63, ggauss64
|
||||
};
|
@ -1,304 +0,0 @@
|
||||
// Lorentz energy fading tables for QRA64
|
||||
static const int glen_tab_lorentz[64] = {
|
||||
2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 3, 3,
|
||||
3, 3, 3, 3, 3, 4, 4, 4,
|
||||
4, 4, 5, 5, 5, 5, 6, 6,
|
||||
7, 7, 7, 8, 8, 9, 10, 10,
|
||||
11, 12, 13, 14, 15, 16, 17, 19,
|
||||
20, 22, 23, 25, 27, 30, 32, 35,
|
||||
38, 41, 45, 49, 53, 57, 62, 65
|
||||
};
|
||||
static const float glorentz1[2] = {
|
||||
0.0214f, 0.9107f
|
||||
};
|
||||
static const float glorentz2[2] = {
|
||||
0.0244f, 0.9030f
|
||||
};
|
||||
static const float glorentz3[2] = {
|
||||
0.0280f, 0.8950f
|
||||
};
|
||||
static const float glorentz4[2] = {
|
||||
0.0314f, 0.8865f
|
||||
};
|
||||
static const float glorentz5[2] = {
|
||||
0.0349f, 0.8773f
|
||||
};
|
||||
static const float glorentz6[2] = {
|
||||
0.0388f, 0.8675f
|
||||
};
|
||||
static const float glorentz7[2] = {
|
||||
0.0426f, 0.8571f
|
||||
};
|
||||
static const float glorentz8[2] = {
|
||||
0.0463f, 0.8459f
|
||||
};
|
||||
static const float glorentz9[2] = {
|
||||
0.0500f, 0.8339f
|
||||
};
|
||||
static const float glorentz10[2] = {
|
||||
0.0538f, 0.8210f
|
||||
};
|
||||
static const float glorentz11[2] = {
|
||||
0.0579f, 0.8074f
|
||||
};
|
||||
static const float glorentz12[2] = {
|
||||
0.0622f, 0.7930f
|
||||
};
|
||||
static const float glorentz13[2] = {
|
||||
0.0668f, 0.7777f
|
||||
};
|
||||
static const float glorentz14[2] = {
|
||||
0.0715f, 0.7616f
|
||||
};
|
||||
static const float glorentz15[3] = {
|
||||
0.0196f, 0.0765f, 0.7445f
|
||||
};
|
||||
static const float glorentz16[3] = {
|
||||
0.0210f, 0.0816f, 0.7267f
|
||||
};
|
||||
static const float glorentz17[3] = {
|
||||
0.0226f, 0.0870f, 0.7080f
|
||||
};
|
||||
static const float glorentz18[3] = {
|
||||
0.0242f, 0.0925f, 0.6885f
|
||||
};
|
||||
static const float glorentz19[3] = {
|
||||
0.0259f, 0.0981f, 0.6682f
|
||||
};
|
||||
static const float glorentz20[3] = {
|
||||
0.0277f, 0.1039f, 0.6472f
|
||||
};
|
||||
static const float glorentz21[3] = {
|
||||
0.0296f, 0.1097f, 0.6255f
|
||||
};
|
||||
static const float glorentz22[4] = {
|
||||
0.0143f, 0.0316f, 0.1155f, 0.6031f
|
||||
};
|
||||
static const float glorentz23[4] = {
|
||||
0.0153f, 0.0337f, 0.1213f, 0.5803f
|
||||
};
|
||||
static const float glorentz24[4] = {
|
||||
0.0163f, 0.0358f, 0.1270f, 0.5570f
|
||||
};
|
||||
static const float glorentz25[4] = {
|
||||
0.0174f, 0.0381f, 0.1325f, 0.5333f
|
||||
};
|
||||
static const float glorentz26[4] = {
|
||||
0.0186f, 0.0405f, 0.1378f, 0.5095f
|
||||
};
|
||||
static const float glorentz27[5] = {
|
||||
0.0113f, 0.0198f, 0.0429f, 0.1428f, 0.4855f
|
||||
};
|
||||
static const float glorentz28[5] = {
|
||||
0.0120f, 0.0211f, 0.0455f, 0.1473f, 0.4615f
|
||||
};
|
||||
static const float glorentz29[5] = {
|
||||
0.0129f, 0.0225f, 0.0481f, 0.1514f, 0.4376f
|
||||
};
|
||||
static const float glorentz30[5] = {
|
||||
0.0137f, 0.0239f, 0.0508f, 0.1549f, 0.4140f
|
||||
};
|
||||
static const float glorentz31[6] = {
|
||||
0.0095f, 0.0147f, 0.0254f, 0.0536f, 0.1578f, 0.3907f
|
||||
};
|
||||
static const float glorentz32[6] = {
|
||||
0.0101f, 0.0156f, 0.0270f, 0.0564f, 0.1600f, 0.3680f
|
||||
};
|
||||
static const float glorentz33[7] = {
|
||||
0.0076f, 0.0109f, 0.0167f, 0.0287f, 0.0592f, 0.1614f, 0.3458f
|
||||
};
|
||||
static const float glorentz34[7] = {
|
||||
0.0081f, 0.0116f, 0.0178f, 0.0305f, 0.0621f, 0.1620f, 0.3243f
|
||||
};
|
||||
static const float glorentz35[7] = {
|
||||
0.0087f, 0.0124f, 0.0190f, 0.0324f, 0.0649f, 0.1618f, 0.3035f
|
||||
};
|
||||
static const float glorentz36[8] = {
|
||||
0.0069f, 0.0093f, 0.0133f, 0.0203f, 0.0343f, 0.0676f, 0.1607f, 0.2836f
|
||||
};
|
||||
static const float glorentz37[8] = {
|
||||
0.0074f, 0.0100f, 0.0142f, 0.0216f, 0.0362f, 0.0702f, 0.1588f, 0.2645f
|
||||
};
|
||||
static const float glorentz38[9] = {
|
||||
0.0061f, 0.0080f, 0.0107f, 0.0152f, 0.0230f, 0.0382f, 0.0726f, 0.1561f,
|
||||
0.2464f
|
||||
};
|
||||
static const float glorentz39[10] = {
|
||||
0.0052f, 0.0066f, 0.0086f, 0.0115f, 0.0162f, 0.0244f, 0.0402f, 0.0747f,
|
||||
0.1526f, 0.2291f
|
||||
};
|
||||
static const float glorentz40[10] = {
|
||||
0.0056f, 0.0071f, 0.0092f, 0.0123f, 0.0173f, 0.0259f, 0.0422f, 0.0766f,
|
||||
0.1484f, 0.2128f
|
||||
};
|
||||
static const float glorentz41[11] = {
|
||||
0.0049f, 0.0061f, 0.0076f, 0.0098f, 0.0132f, 0.0184f, 0.0274f, 0.0441f,
|
||||
0.0780f, 0.1437f, 0.1975f
|
||||
};
|
||||
static const float glorentz42[12] = {
|
||||
0.0044f, 0.0053f, 0.0065f, 0.0082f, 0.0106f, 0.0141f, 0.0196f, 0.0290f,
|
||||
0.0460f, 0.0791f, 0.1384f, 0.1831f
|
||||
};
|
||||
static const float glorentz43[13] = {
|
||||
0.0040f, 0.0048f, 0.0057f, 0.0070f, 0.0088f, 0.0113f, 0.0150f, 0.0209f,
|
||||
0.0305f, 0.0477f, 0.0797f, 0.1327f, 0.1695f
|
||||
};
|
||||
static const float glorentz44[14] = {
|
||||
0.0037f, 0.0043f, 0.0051f, 0.0062f, 0.0075f, 0.0094f, 0.0121f, 0.0160f,
|
||||
0.0221f, 0.0321f, 0.0493f, 0.0799f, 0.1267f, 0.1568f
|
||||
};
|
||||
static const float glorentz45[15] = {
|
||||
0.0035f, 0.0040f, 0.0047f, 0.0055f, 0.0066f, 0.0081f, 0.0101f, 0.0129f,
|
||||
0.0171f, 0.0234f, 0.0335f, 0.0506f, 0.0795f, 0.1204f, 0.1450f
|
||||
};
|
||||
static const float glorentz46[16] = {
|
||||
0.0033f, 0.0037f, 0.0043f, 0.0050f, 0.0059f, 0.0071f, 0.0087f, 0.0108f,
|
||||
0.0138f, 0.0181f, 0.0246f, 0.0349f, 0.0517f, 0.0786f, 0.1141f, 0.1340f
|
||||
};
|
||||
static const float glorentz47[17] = {
|
||||
0.0031f, 0.0035f, 0.0040f, 0.0046f, 0.0054f, 0.0064f, 0.0077f, 0.0093f,
|
||||
0.0116f, 0.0147f, 0.0192f, 0.0259f, 0.0362f, 0.0525f, 0.0773f, 0.1076f,
|
||||
0.1237f
|
||||
};
|
||||
static const float glorentz48[19] = {
|
||||
0.0027f, 0.0030f, 0.0034f, 0.0038f, 0.0043f, 0.0050f, 0.0058f, 0.0069f,
|
||||
0.0082f, 0.0100f, 0.0123f, 0.0156f, 0.0203f, 0.0271f, 0.0374f, 0.0530f,
|
||||
0.0755f, 0.1013f, 0.1141f
|
||||
};
|
||||
static const float glorentz49[20] = {
|
||||
0.0026f, 0.0029f, 0.0032f, 0.0036f, 0.0041f, 0.0047f, 0.0054f, 0.0063f,
|
||||
0.0074f, 0.0088f, 0.0107f, 0.0131f, 0.0165f, 0.0213f, 0.0282f, 0.0383f,
|
||||
0.0531f, 0.0734f, 0.0950f, 0.1053f
|
||||
};
|
||||
static const float glorentz50[22] = {
|
||||
0.0023f, 0.0025f, 0.0028f, 0.0031f, 0.0035f, 0.0039f, 0.0044f, 0.0050f,
|
||||
0.0058f, 0.0067f, 0.0079f, 0.0094f, 0.0114f, 0.0139f, 0.0175f, 0.0223f,
|
||||
0.0292f, 0.0391f, 0.0529f, 0.0709f, 0.0889f, 0.0971f
|
||||
};
|
||||
static const float glorentz51[23] = {
|
||||
0.0023f, 0.0025f, 0.0027f, 0.0030f, 0.0034f, 0.0037f, 0.0042f, 0.0048f,
|
||||
0.0054f, 0.0062f, 0.0072f, 0.0085f, 0.0100f, 0.0121f, 0.0148f, 0.0184f,
|
||||
0.0233f, 0.0301f, 0.0396f, 0.0524f, 0.0681f, 0.0829f, 0.0894f
|
||||
};
|
||||
static const float glorentz52[25] = {
|
||||
0.0021f, 0.0023f, 0.0025f, 0.0027f, 0.0030f, 0.0033f, 0.0036f, 0.0040f,
|
||||
0.0045f, 0.0051f, 0.0058f, 0.0067f, 0.0077f, 0.0090f, 0.0107f, 0.0128f,
|
||||
0.0156f, 0.0192f, 0.0242f, 0.0308f, 0.0398f, 0.0515f, 0.0650f, 0.0772f,
|
||||
0.0824f
|
||||
};
|
||||
static const float glorentz53[27] = {
|
||||
0.0019f, 0.0021f, 0.0022f, 0.0024f, 0.0027f, 0.0029f, 0.0032f, 0.0035f,
|
||||
0.0039f, 0.0044f, 0.0049f, 0.0055f, 0.0062f, 0.0072f, 0.0083f, 0.0096f,
|
||||
0.0113f, 0.0135f, 0.0164f, 0.0201f, 0.0249f, 0.0314f, 0.0398f, 0.0502f,
|
||||
0.0619f, 0.0718f, 0.0759f
|
||||
};
|
||||
static const float glorentz54[30] = {
|
||||
0.0017f, 0.0018f, 0.0019f, 0.0021f, 0.0022f, 0.0024f, 0.0026f, 0.0029f,
|
||||
0.0031f, 0.0034f, 0.0038f, 0.0042f, 0.0047f, 0.0052f, 0.0059f, 0.0067f,
|
||||
0.0076f, 0.0088f, 0.0102f, 0.0120f, 0.0143f, 0.0171f, 0.0208f, 0.0256f,
|
||||
0.0317f, 0.0395f, 0.0488f, 0.0586f, 0.0666f, 0.0698f
|
||||
};
|
||||
static const float glorentz55[32] = {
|
||||
0.0016f, 0.0017f, 0.0018f, 0.0019f, 0.0021f, 0.0022f, 0.0024f, 0.0026f,
|
||||
0.0028f, 0.0031f, 0.0034f, 0.0037f, 0.0041f, 0.0045f, 0.0050f, 0.0056f,
|
||||
0.0063f, 0.0071f, 0.0081f, 0.0094f, 0.0108f, 0.0127f, 0.0149f, 0.0178f,
|
||||
0.0214f, 0.0261f, 0.0318f, 0.0389f, 0.0470f, 0.0553f, 0.0618f, 0.0643f
|
||||
};
|
||||
static const float glorentz56[35] = {
|
||||
0.0014f, 0.0015f, 0.0016f, 0.0017f, 0.0018f, 0.0020f, 0.0021f, 0.0023f,
|
||||
0.0024f, 0.0026f, 0.0028f, 0.0031f, 0.0033f, 0.0036f, 0.0040f, 0.0044f,
|
||||
0.0049f, 0.0054f, 0.0060f, 0.0067f, 0.0076f, 0.0087f, 0.0099f, 0.0114f,
|
||||
0.0133f, 0.0156f, 0.0184f, 0.0220f, 0.0264f, 0.0318f, 0.0381f, 0.0451f,
|
||||
0.0520f, 0.0572f, 0.0591f
|
||||
};
|
||||
static const float glorentz57[38] = {
|
||||
0.0013f, 0.0014f, 0.0015f, 0.0016f, 0.0017f, 0.0018f, 0.0019f, 0.0020f,
|
||||
0.0021f, 0.0023f, 0.0024f, 0.0026f, 0.0028f, 0.0031f, 0.0033f, 0.0036f,
|
||||
0.0039f, 0.0043f, 0.0047f, 0.0052f, 0.0058f, 0.0064f, 0.0072f, 0.0081f,
|
||||
0.0092f, 0.0104f, 0.0120f, 0.0139f, 0.0162f, 0.0190f, 0.0224f, 0.0265f,
|
||||
0.0315f, 0.0371f, 0.0431f, 0.0487f, 0.0529f, 0.0544f
|
||||
};
|
||||
static const float glorentz58[41] = {
|
||||
0.0012f, 0.0013f, 0.0014f, 0.0014f, 0.0015f, 0.0016f, 0.0017f, 0.0018f,
|
||||
0.0019f, 0.0020f, 0.0022f, 0.0023f, 0.0025f, 0.0026f, 0.0028f, 0.0030f,
|
||||
0.0033f, 0.0036f, 0.0039f, 0.0042f, 0.0046f, 0.0050f, 0.0056f, 0.0061f,
|
||||
0.0068f, 0.0076f, 0.0086f, 0.0097f, 0.0110f, 0.0125f, 0.0144f, 0.0167f,
|
||||
0.0194f, 0.0226f, 0.0265f, 0.0309f, 0.0359f, 0.0409f, 0.0455f, 0.0488f,
|
||||
0.0500f
|
||||
};
|
||||
static const float glorentz59[45] = {
|
||||
0.0011f, 0.0012f, 0.0012f, 0.0013f, 0.0013f, 0.0014f, 0.0015f, 0.0016f,
|
||||
0.0016f, 0.0017f, 0.0018f, 0.0019f, 0.0021f, 0.0022f, 0.0023f, 0.0025f,
|
||||
0.0026f, 0.0028f, 0.0030f, 0.0033f, 0.0035f, 0.0038f, 0.0041f, 0.0045f,
|
||||
0.0049f, 0.0054f, 0.0059f, 0.0065f, 0.0072f, 0.0081f, 0.0090f, 0.0102f,
|
||||
0.0115f, 0.0130f, 0.0149f, 0.0171f, 0.0197f, 0.0227f, 0.0263f, 0.0302f,
|
||||
0.0345f, 0.0387f, 0.0425f, 0.0451f, 0.0460f
|
||||
};
|
||||
static const float glorentz60[49] = {
|
||||
0.0010f, 0.0011f, 0.0011f, 0.0012f, 0.0012f, 0.0013f, 0.0013f, 0.0014f,
|
||||
0.0014f, 0.0015f, 0.0016f, 0.0017f, 0.0018f, 0.0019f, 0.0020f, 0.0021f,
|
||||
0.0022f, 0.0024f, 0.0025f, 0.0027f, 0.0028f, 0.0030f, 0.0033f, 0.0035f,
|
||||
0.0038f, 0.0041f, 0.0044f, 0.0048f, 0.0052f, 0.0057f, 0.0063f, 0.0069f,
|
||||
0.0077f, 0.0085f, 0.0095f, 0.0106f, 0.0119f, 0.0135f, 0.0153f, 0.0174f,
|
||||
0.0199f, 0.0227f, 0.0259f, 0.0293f, 0.0330f, 0.0365f, 0.0395f, 0.0415f,
|
||||
0.0423f
|
||||
};
|
||||
static const float glorentz61[53] = {
|
||||
0.0009f, 0.0010f, 0.0010f, 0.0011f, 0.0011f, 0.0011f, 0.0012f, 0.0012f,
|
||||
0.0013f, 0.0014f, 0.0014f, 0.0015f, 0.0016f, 0.0016f, 0.0017f, 0.0018f,
|
||||
0.0019f, 0.0020f, 0.0021f, 0.0023f, 0.0024f, 0.0025f, 0.0027f, 0.0029f,
|
||||
0.0031f, 0.0033f, 0.0035f, 0.0038f, 0.0041f, 0.0044f, 0.0047f, 0.0051f,
|
||||
0.0056f, 0.0061f, 0.0067f, 0.0073f, 0.0081f, 0.0089f, 0.0099f, 0.0110f,
|
||||
0.0124f, 0.0139f, 0.0156f, 0.0176f, 0.0199f, 0.0225f, 0.0253f, 0.0283f,
|
||||
0.0314f, 0.0343f, 0.0367f, 0.0383f, 0.0389f
|
||||
};
|
||||
static const float glorentz62[57] = {
|
||||
0.0009f, 0.0009f, 0.0009f, 0.0010f, 0.0010f, 0.0011f, 0.0011f, 0.0011f,
|
||||
0.0012f, 0.0012f, 0.0013f, 0.0013f, 0.0014f, 0.0015f, 0.0015f, 0.0016f,
|
||||
0.0017f, 0.0018f, 0.0019f, 0.0020f, 0.0021f, 0.0022f, 0.0023f, 0.0024f,
|
||||
0.0026f, 0.0027f, 0.0029f, 0.0031f, 0.0033f, 0.0035f, 0.0038f, 0.0040f,
|
||||
0.0043f, 0.0047f, 0.0050f, 0.0055f, 0.0059f, 0.0064f, 0.0070f, 0.0077f,
|
||||
0.0085f, 0.0093f, 0.0103f, 0.0114f, 0.0127f, 0.0142f, 0.0158f, 0.0177f,
|
||||
0.0198f, 0.0221f, 0.0246f, 0.0272f, 0.0297f, 0.0321f, 0.0340f, 0.0353f,
|
||||
0.0357f
|
||||
};
|
||||
static const float glorentz63[62] = {
|
||||
0.0008f, 0.0008f, 0.0009f, 0.0009f, 0.0009f, 0.0010f, 0.0010f, 0.0010f,
|
||||
0.0011f, 0.0011f, 0.0011f, 0.0012f, 0.0012f, 0.0013f, 0.0013f, 0.0014f,
|
||||
0.0015f, 0.0015f, 0.0016f, 0.0017f, 0.0017f, 0.0018f, 0.0019f, 0.0020f,
|
||||
0.0021f, 0.0022f, 0.0023f, 0.0025f, 0.0026f, 0.0028f, 0.0029f, 0.0031f,
|
||||
0.0033f, 0.0035f, 0.0038f, 0.0040f, 0.0043f, 0.0046f, 0.0050f, 0.0053f,
|
||||
0.0058f, 0.0062f, 0.0068f, 0.0074f, 0.0081f, 0.0088f, 0.0097f, 0.0106f,
|
||||
0.0117f, 0.0130f, 0.0144f, 0.0159f, 0.0176f, 0.0195f, 0.0216f, 0.0237f,
|
||||
0.0259f, 0.0280f, 0.0299f, 0.0315f, 0.0325f, 0.0328f
|
||||
};
|
||||
static const float glorentz64[65] = {
|
||||
0.0008f, 0.0008f, 0.0008f, 0.0009f, 0.0009f, 0.0009f, 0.0010f, 0.0010f,
|
||||
0.0010f, 0.0011f, 0.0011f, 0.0012f, 0.0012f, 0.0012f, 0.0013f, 0.0013f,
|
||||
0.0014f, 0.0014f, 0.0015f, 0.0016f, 0.0016f, 0.0017f, 0.0018f, 0.0019f,
|
||||
0.0020f, 0.0021f, 0.0022f, 0.0023f, 0.0024f, 0.0025f, 0.0027f, 0.0028f,
|
||||
0.0030f, 0.0031f, 0.0033f, 0.0035f, 0.0038f, 0.0040f, 0.0043f, 0.0046f,
|
||||
0.0049f, 0.0052f, 0.0056f, 0.0061f, 0.0066f, 0.0071f, 0.0077f, 0.0084f,
|
||||
0.0091f, 0.0100f, 0.0109f, 0.0120f, 0.0132f, 0.0145f, 0.0159f, 0.0175f,
|
||||
0.0192f, 0.0209f, 0.0228f, 0.0246f, 0.0264f, 0.0279f, 0.0291f, 0.0299f,
|
||||
0.0301f
|
||||
};
|
||||
static const float *gptr_tab_lorentz[64] = {
|
||||
glorentz1, glorentz2, glorentz3, glorentz4,
|
||||
glorentz5, glorentz6, glorentz7, glorentz8,
|
||||
glorentz9, glorentz10, glorentz11, glorentz12,
|
||||
glorentz13, glorentz14, glorentz15, glorentz16,
|
||||
glorentz17, glorentz18, glorentz19, glorentz20,
|
||||
glorentz21, glorentz22, glorentz23, glorentz24,
|
||||
glorentz25, glorentz26, glorentz27, glorentz28,
|
||||
glorentz29, glorentz30, glorentz31, glorentz32,
|
||||
glorentz33, glorentz34, glorentz35, glorentz36,
|
||||
glorentz37, glorentz38, glorentz39, glorentz40,
|
||||
glorentz41, glorentz42, glorentz43, glorentz44,
|
||||
glorentz45, glorentz46, glorentz47, glorentz48,
|
||||
glorentz49, glorentz50, glorentz51, glorentz52,
|
||||
glorentz53, glorentz54, glorentz55, glorentz56,
|
||||
glorentz57, glorentz58, glorentz59, glorentz60,
|
||||
glorentz61, glorentz62, glorentz63, glorentz64
|
||||
};
|
@ -1,746 +0,0 @@
|
||||
/*
|
||||
main.c
|
||||
QRA64 mode encode/decode tests
|
||||
|
||||
(c) 2016 - Nico Palermo, IV3NWV
|
||||
|
||||
Thanks to Andrea Montefusco IW0HDV for his help on adapting the sources
|
||||
to OSs other than MS Windows
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
This file is part of the qracodes project, a Forward Error Control
|
||||
encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes.
|
||||
|
||||
Files in this package:
|
||||
main.c - this file
|
||||
qra64.c/.h - qra64 mode encode/decoding functions
|
||||
|
||||
../qracodes/normrnd.{c,h} - random gaussian number generator
|
||||
../qracodes/npfwht.{c,h} - Fast Walsh-Hadamard Transforms
|
||||
../qracodes/pdmath.{c,h} - Elementary math on probability distributions
|
||||
../qracodes/qra12_63_64_irr_b.{c,h} - Tables for a QRA(12,63) irregular RA
|
||||
code over GF(64)
|
||||
../qracodes/qra13_64_64_irr_e.{c,h} - Tables for a QRA(13,64) irregular RA
|
||||
code over GF(64)
|
||||
../qracodes/qracodes.{c,h} - QRA codes encoding/decoding functions
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
qracodes 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 3 of the License, or
|
||||
(at your option) any later version.
|
||||
qracodes 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 qracodes source distribution.
|
||||
If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
The code used by the QRA64 mode is the code: QRA13_64_64_IRR_E: K=13
|
||||
N=64 Q=64 irregular QRA code (defined in qra13_64_64_irr_e.{h,c}).
|
||||
|
||||
This code has been designed to include a CRC as the 13th information
|
||||
symbol and improve the code UER (Undetected Error Rate). The CRC
|
||||
symbol is not sent along the channel (the codes are punctured) and the
|
||||
resulting code is still a (12,63) code with an effective code rate of
|
||||
R = 12/63.
|
||||
*/
|
||||
|
||||
// OS dependent defines and includes ------------------------------------------
|
||||
|
||||
#if _WIN32 // note the underscore: without it, it's not msdn official!
|
||||
// Windows (x64 and x86)
|
||||
#include <windows.h> // required only for GetTickCount(...)
|
||||
#include <process.h> // _beginthread
|
||||
#endif
|
||||
|
||||
#if __linux__
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
unsigned GetTickCount(void) {
|
||||
struct timespec ts;
|
||||
unsigned theTick = 0U;
|
||||
clock_gettime( CLOCK_REALTIME, &ts );
|
||||
theTick = ts.tv_nsec / 1000000;
|
||||
theTick += ts.tv_sec * 1000;
|
||||
return theTick;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if __APPLE__
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "qra64.h"
|
||||
#include "../qracodes/normrnd.h" // gaussian numbers generator
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// channel types
|
||||
#define CHANNEL_AWGN 0
|
||||
#define CHANNEL_RAYLEIGH 1
|
||||
#define CHANNEL_FASTFADE 2
|
||||
|
||||
#define JT65_SNR_EBNO_OFFSET 29.1f // with the synch used in JT65
|
||||
#define QRA64_SNR_EBNO_OFFSET 31.0f // with the costas array synch
|
||||
|
||||
void printwordd(char *msg, int *x, int size)
|
||||
{
|
||||
int k;
|
||||
printf("\n%s ",msg);
|
||||
for (k=0;k<size;k++)
|
||||
printf("%2d ",x[k]);
|
||||
printf("\n");
|
||||
}
|
||||
void printwordh(char *msg, int *x, int size)
|
||||
{
|
||||
int k;
|
||||
printf("\n%s ",msg);
|
||||
for (k=0;k<size;k++)
|
||||
printf("%02hx ",x[k]);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
#define NSAMPLES (QRA64_N*QRA64_M)
|
||||
|
||||
static float rp[NSAMPLES];
|
||||
static float rq[NSAMPLES];
|
||||
static float chp[NSAMPLES];
|
||||
static float chq[NSAMPLES];
|
||||
static float r[NSAMPLES];
|
||||
|
||||
float *mfskchannel(int *x, int channel_type, float EbNodB)
|
||||
{
|
||||
/*
|
||||
Simulate an MFSK channel, either AWGN or Rayleigh.
|
||||
|
||||
x is a pointer to the transmitted codeword, an array of QRA64_N
|
||||
integers in the range 0..63.
|
||||
|
||||
Returns the received symbol energies (squared amplitudes) as an array of
|
||||
(QRA64_M*QRA64_N) floats. The first QRA64_M entries of this array are
|
||||
the energies of the first symbol in the codeword. The second QRA64_M
|
||||
entries are those of the second symbol, and so on up to the last codeword
|
||||
symbol.
|
||||
*/
|
||||
const float No = 1.0f; // noise spectral density
|
||||
const float sigma = (float)sqrt(No/2.0f); // std dev of noise I/Q components
|
||||
const float sigmach = (float)sqrt(1/2.0f); // std dev of channel I/Q gains
|
||||
const float R = 1.0f*QRA64_K/QRA64_N;
|
||||
|
||||
float EbNo = (float)pow(10,EbNodB/10);
|
||||
float EsNo = 1.0f*QRA64_m*R*EbNo;
|
||||
float Es = EsNo*No;
|
||||
float A = (float)sqrt(Es);
|
||||
int k;
|
||||
|
||||
normrnd_s(rp,NSAMPLES,0,sigma);
|
||||
normrnd_s(rq,NSAMPLES,0,sigma);
|
||||
|
||||
if(EbNodB>-15)
|
||||
if (channel_type == CHANNEL_AWGN)
|
||||
for (k=0;k<QRA64_N;k++)
|
||||
rp[k*QRA64_M+x[k]]+=A;
|
||||
else
|
||||
if (channel_type == CHANNEL_RAYLEIGH) {
|
||||
normrnd_s(chp,QRA64_N,0,sigmach);
|
||||
normrnd_s(chq,QRA64_N,0,sigmach);
|
||||
for (k=0;k<QRA64_N;k++) {
|
||||
rp[k*QRA64_M+x[k]]+=A*chp[k];
|
||||
rq[k*QRA64_M+x[k]]+=A*chq[k];
|
||||
}
|
||||
}
|
||||
else {
|
||||
return 0; // unknown channel type
|
||||
}
|
||||
|
||||
// compute the squares of the amplitudes of the received samples
|
||||
for (k=0;k<NSAMPLES;k++)
|
||||
r[k] = rp[k]*rp[k] + rq[k]*rq[k];
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
// These defines are some packed fields as computed by JT65
|
||||
#define CALL_IV3NWV 0x7F85AE7
|
||||
#define CALL_K1JT 0xF70DDD7
|
||||
#define GRID_JN66 0x3AE4 // JN66
|
||||
#define GRID_73 0x7ED0 // 73
|
||||
|
||||
char decode_type[12][32] = {
|
||||
"[? ? ?] AP0",
|
||||
"[CQ ? ?] AP27",
|
||||
"[CQ ? ] AP42",
|
||||
"[CALL ? ?] AP29",
|
||||
"[CALL ? ] AP44",
|
||||
"[CALL CALL ?] AP57",
|
||||
"[? CALL ?] AP29",
|
||||
"[? CALL ] AP44",
|
||||
"[CALL CALL G] AP72",
|
||||
"[CQ CALL ?] AP55",
|
||||
"[CQ CALL ] AP70",
|
||||
"[CQ CALL G] AP70"
|
||||
};
|
||||
char apmode_type[3][32] = {
|
||||
"NO AP",
|
||||
"AUTO AP",
|
||||
"USER AP"
|
||||
};
|
||||
|
||||
int test_proc_1(int channel_type, float EbNodB, int mode)
|
||||
{
|
||||
/*
|
||||
Here we simulate the following (dummy) QSO:
|
||||
|
||||
1) CQ IV3NWV
|
||||
2) IV3NWV K1JT
|
||||
3) K1JT IV3NWV 73
|
||||
4) IV3NWV K1JT 73
|
||||
|
||||
No message repetition is attempted
|
||||
|
||||
The QSO is counted as successfull if IV3NWV received the last message
|
||||
When mode=QRA_AUTOAP each decoder attempts to decode the message sent
|
||||
by the other station using the a-priori information derived by what
|
||||
has been already decoded in a previous phase of the QSO if decoding
|
||||
with no a-priori information has not been successful.
|
||||
|
||||
Step 1) K1JT's decoder first attempts to decode msgs of type [? ? ?]
|
||||
and if this attempt fails, it attempts to decode [CQ/QRZ ? ?] or
|
||||
[CQ/QRZ ?] msgs
|
||||
|
||||
Step 2) if IV3NWV's decoder is unable to decode K1JT's without AP it
|
||||
attempts to decode messages of the type [IV3NWV ? ?] and [IV3NWV ?].
|
||||
|
||||
Step 3) K1JT's decoder attempts to decode [? ? ?] and [K1JT IV3NWV ?]
|
||||
(this last decode type has been enabled by K1JT's encoder at step 2)
|
||||
|
||||
Step 4) IV3NWV's decoder attempts to decode [? ? ?] and [IV3NWV K1JT
|
||||
?] (this last decode type has been enabled by IV3NWV's encoder at step
|
||||
3)
|
||||
|
||||
At each step the simulation reports if a decode was successful. In
|
||||
this case it also reports the type of decode (see table decode_type
|
||||
above)
|
||||
|
||||
When mode=QRA_NOAP, only [? ? ?] decodes are attempted and no a-priori
|
||||
information is used by the decoder
|
||||
|
||||
The function returns 0 if all of the four messages have been decoded
|
||||
by their recipients (with no retries) and -1 if any of them could not
|
||||
be decoded
|
||||
*/
|
||||
|
||||
int x[QRA64_K], xdec[QRA64_K];
|
||||
int y[QRA64_N];
|
||||
float *rx;
|
||||
int rc;
|
||||
|
||||
// Each simulated station must use its own codec since it might work with
|
||||
// different a-priori information.
|
||||
qra64codec *codec_iv3nwv = qra64_init(mode); // codec for IV3NWV
|
||||
qra64codec *codec_k1jt = qra64_init(mode); // codec for K1JT
|
||||
|
||||
// Step 1a: IV3NWV makes a CQ call (with no grid)
|
||||
printf("IV3NWV tx: CQ IV3NWV\n");
|
||||
encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_BLANK);
|
||||
qra64_encode(codec_iv3nwv, y, x);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
|
||||
// Step 1b: K1JT attempts to decode [? ? ?], [CQ/QRZ ? ?] or [CQ/QRZ ?]
|
||||
rc = qra64_decode(codec_k1jt, 0, xdec,rx);
|
||||
if (rc>=0) { // decoded
|
||||
printf("K1JT rx: received with apcode=%d %s\n",rc, decode_type[rc]);
|
||||
|
||||
// Step 2a: K1JT replies to IV3NWV (with no grid)
|
||||
printf("K1JT tx: IV3NWV K1JT\n");
|
||||
encodemsg_jt65(x,CALL_IV3NWV,CALL_K1JT, GRID_BLANK);
|
||||
qra64_encode(codec_k1jt, y, x);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
|
||||
// Step 2b: IV3NWV attempts to decode [? ? ?], [IV3NWV ? ?] or [IV3NWV ?]
|
||||
rc = qra64_decode(codec_iv3nwv, 0, xdec,rx);
|
||||
if (rc>=0) { // decoded
|
||||
printf("IV3NWV rx: received with apcode=%d %s\n",rc, decode_type[rc]);
|
||||
|
||||
// Step 3a: IV3NWV replies to K1JT with a 73
|
||||
printf("IV3NWV tx: K1JT IV3NWV 73\n");
|
||||
encodemsg_jt65(x,CALL_K1JT,CALL_IV3NWV, GRID_73);
|
||||
qra64_encode(codec_iv3nwv, y, x);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
|
||||
// Step 3b: K1JT attempts to decode [? ? ?] or [K1JT IV3NWV ?]
|
||||
rc = qra64_decode(codec_k1jt, 0, xdec,rx);
|
||||
if (rc>=0) { // decoded
|
||||
printf("K1JT rx: received with apcode=%d %s\n",rc, decode_type[rc]);
|
||||
|
||||
// Step 4a: K1JT replies to IV3NWV with a 73
|
||||
printf("K1JT tx: IV3NWV K1JT 73\n");
|
||||
encodemsg_jt65(x,CALL_IV3NWV,CALL_K1JT, GRID_73);
|
||||
qra64_encode(codec_k1jt, y, x);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
|
||||
// Step 4b: IV3NWV attempts to decode [? ? ?], [IV3NWV ? ?], or [IV3NWV ?]
|
||||
rc = qra64_decode(codec_iv3nwv, 0, xdec,rx);
|
||||
if (rc>=0) { // decoded
|
||||
printf("IV3NWV rx: received with apcode=%d %s\n",rc, decode_type[rc]);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("no decode\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int test_proc_2(int channel_type, float EbNodB, int mode)
|
||||
{
|
||||
/*
|
||||
Here we simulate the decoder of K1JT after K1JT has sent a msg [IV3NWV K1JT]
|
||||
and IV3NWV sends him the msg [K1JT IV3NWV JN66].
|
||||
|
||||
If mode=QRA_NOAP, K1JT decoder attempts to decode only msgs of type [? ? ?].
|
||||
|
||||
If mode=QRA_AUTOP, K1JT decoder will attempt to decode also the msgs
|
||||
[K1JT IV3NWV] and [K1JT IV3NWV ?].
|
||||
|
||||
In the case a decode is successful the return code of the qra64_decode function
|
||||
indicates the amount of a-priori information required to decode the received
|
||||
message according to this table:
|
||||
|
||||
rc=0 [? ? ?] AP0
|
||||
rc=1 [CQ ? ?] AP27
|
||||
rc=2 [CQ ? ] AP42
|
||||
rc=3 [CALL ? ?] AP29
|
||||
rc=4 [CALL ? ] AP44
|
||||
rc=5 [CALL CALL ?] AP57
|
||||
rc=6 [? CALL ?] AP29
|
||||
rc=7 [? CALL ] AP44
|
||||
rc=8 [CALL CALL GRID] AP72
|
||||
rc=9 [CQ CALL ?] AP55
|
||||
rc=10 [CQ CALL ] AP70
|
||||
rc=11 [CQ CALL GRID] AP70
|
||||
|
||||
The return code is <0 when decoding is unsuccessful
|
||||
|
||||
This test simulates the situation ntx times and reports how many times
|
||||
a particular type decode among the above 6 cases succeded.
|
||||
*/
|
||||
|
||||
int x[QRA64_K], xdec[QRA64_K];
|
||||
int y[QRA64_N];
|
||||
float *rx;
|
||||
float ebnodbest, ebnodbavg=0;
|
||||
int rc,k;
|
||||
|
||||
int ndecok[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int nundet = 0;
|
||||
int ntx = 200,ndec=0;
|
||||
|
||||
qra64codec *codec_iv3nwv = qra64_init(mode); // codec for IV3NWV
|
||||
qra64codec *codec_k1jt = qra64_init(mode); // codec for K1JT
|
||||
|
||||
printf("\nQRA64 Test #2 - Decoding with AP knowledge (SNR-Eb/No offset = %.1f dB)\n\n",
|
||||
QRA64_SNR_EBNO_OFFSET);
|
||||
|
||||
// This will enable K1JT's decoder to look for calls directed to him [K1JT ? ?/b]
|
||||
// printf("K1JT decoder enabled for [K1JT ? ?/blank]\n");
|
||||
// qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_MYCALL);
|
||||
|
||||
// This will enable K1JT's decoder to look for IV3NWV calls directed to him [K1JT IV3NWV ?/b]
|
||||
// printf("K1JT decoder enabled for [K1JT IV3NWV ?]\n");
|
||||
// qra64_apset(codec_k1jt, CALL_CQ,CALL_IV3NWV,0,APTYPE_BOTHCALLS);
|
||||
|
||||
// This will enable K1JT's decoder to look for msges sent by IV3NWV [? IV3NWV ?]
|
||||
// printf("K1JT decoder enabled for [? IV3NWV ?/blank]\n");
|
||||
// qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_BLANK,APTYPE_HISCALL);
|
||||
|
||||
// This will enable K1JT's decoder to look for full-knowledge [K1JT IV3NWV JN66] msgs
|
||||
printf("K1JT decoder enabled for [K1JT IV3NWV JN66]\n");
|
||||
qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,GRID_JN66,APTYPE_FULL);
|
||||
|
||||
// This will enable K1JT's decoder to look for calls from IV3NWV [CQ IV3NWV ?/b] msgs
|
||||
printf("K1JT decoder enabled for [CQ IV3NWV ?/b/JN66]\n");
|
||||
qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_JN66,APTYPE_CQHISCALL);
|
||||
|
||||
|
||||
// Dx station IV3NWV calls
|
||||
printf("\nIV3NWV encoder sends msg: [K1JT IV3NWV JN66]\n\n");
|
||||
encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_JN66);
|
||||
|
||||
// printf("\nIV3NWV encoder sends msg: [CQ IV3NWV JN66]\n\n");
|
||||
// encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_JN66);
|
||||
|
||||
// printf("\nIV3NWV encoder sends msg: [CQ IV3NWV]\n\n");
|
||||
// encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_BLANK);
|
||||
qra64_encode(codec_iv3nwv, y, x);
|
||||
|
||||
printf("Simulating K1JT decoder up to AP72\n");
|
||||
|
||||
for (k=0;k<ntx;k++) {
|
||||
printf(".");
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
rc = qra64_decode(codec_k1jt, &ebnodbest, xdec,rx);
|
||||
if (rc>=0) {
|
||||
ebnodbavg +=ebnodbest;
|
||||
if (memcmp(xdec,x,12*sizeof(int))==0)
|
||||
ndecok[rc]++;
|
||||
else
|
||||
nundet++;
|
||||
}
|
||||
}
|
||||
printf("\n\n");
|
||||
|
||||
|
||||
printf("Transimtted msgs:%d\nDecoded msgs:\n\n",ntx);
|
||||
for (k=0;k<12;k++) {
|
||||
printf("%3d with %s\n",ndecok[k],decode_type[k]);
|
||||
ndec += ndecok[k];
|
||||
}
|
||||
printf("\nTotal: %d/%d (%d undetected errors)\n\n",ndec,ntx,nundet);
|
||||
printf("");
|
||||
|
||||
ebnodbavg/=(ndec+nundet);
|
||||
printf("Estimated SNR (average in dB) = %.2f dB\n\n",ebnodbavg-QRA64_SNR_EBNO_OFFSET);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int test_fastfading(float EbNodB, float B90, int fadingModel, int submode, int apmode, int olddec, int channel_type, int ntx)
|
||||
{
|
||||
int x[QRA64_K], xdec[QRA64_K];
|
||||
int y[QRA64_N];
|
||||
float *rx;
|
||||
float ebnodbest, ebnodbavg=0;
|
||||
int rc,k;
|
||||
float rxolddec[QRA64_N*QRA64_M]; // holds the energies at nominal tone freqs
|
||||
|
||||
int ndecok[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
int nundet = 0;
|
||||
int ndec=0;
|
||||
|
||||
qra64codec *codec_iv3nwv;
|
||||
qra64codec *codec_k1jt;
|
||||
|
||||
codec_iv3nwv=qra64_init(QRA_NOAP);
|
||||
codec_k1jt =qra64_init(apmode);
|
||||
|
||||
if (channel_type==2) { // fast-fading case
|
||||
printf("Simulating the fast-fading channel\n");
|
||||
printf("B90=%.2f Hz - Fading Model=%s - Submode=QRA64%c\n",B90,fadingModel?"Lorentz":"Gauss",submode+'A');
|
||||
printf("Decoder metric = %s\n",olddec?"AWGN":"Matched to fast-fading signal");
|
||||
}
|
||||
else {
|
||||
printf("Simulating the %s channel\n",channel_type?"Rayleigh block fading":"AWGN");
|
||||
printf("Decoder metric = AWGN\n");
|
||||
}
|
||||
|
||||
|
||||
printf("\nEncoding msg [K1JT IV3NWV JN66]\n");
|
||||
encodemsg_jt65(x,CALL_K1JT,CALL_IV3NWV,GRID_JN66);
|
||||
// printf("[");
|
||||
// for (k=0;k<11;k++) printf("%02hX ",x[k]); printf("%02hX]\n",x[11]);
|
||||
|
||||
qra64_encode(codec_iv3nwv, y, x);
|
||||
printf("%d transmissions will be simulated\n\n",ntx);
|
||||
|
||||
if (apmode==QRA_USERAP) {
|
||||
// This will enable K1JT's decoder to look for cq/qrz calls [CQ/QRZ ? ?/b]
|
||||
printf("K1JT decoder enabled for [CQ ? ?/blank]\n");
|
||||
qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_CQQRZ);
|
||||
|
||||
// This will enable K1JT's decoder to look for calls directed to him [K1JT ? ?/b]
|
||||
printf("K1JT decoder enabled for [K1JT ? ?/blank]\n");
|
||||
qra64_apset(codec_k1jt, CALL_K1JT,0,0,APTYPE_MYCALL);
|
||||
|
||||
// This will enable K1JT's decoder to look for msges sent by IV3NWV [? IV3NWV ?]
|
||||
printf("K1JT decoder enabled for [? IV3NWV ?/blank]\n");
|
||||
qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_BLANK,APTYPE_HISCALL);
|
||||
|
||||
// This will enable K1JT's decoder to look for IV3NWV calls directed to him [K1JT IV3NWV ?/b]
|
||||
printf("K1JT decoder enabled for [K1JT IV3NWV ?]\n");
|
||||
qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,0,APTYPE_BOTHCALLS);
|
||||
|
||||
// This will enable K1JT's decoder to look for full-knowledge [K1JT IV3NWV JN66] msgs
|
||||
printf("K1JT decoder enabled for [K1JT IV3NWV JN66]\n");
|
||||
qra64_apset(codec_k1jt, CALL_K1JT,CALL_IV3NWV,GRID_JN66,APTYPE_FULL);
|
||||
|
||||
// This will enable K1JT's decoder to look for calls from IV3NWV [CQ IV3NWV ?/b] msgs
|
||||
printf("K1JT decoder enabled for [CQ IV3NWV ?/b/JN66]\n");
|
||||
qra64_apset(codec_k1jt, 0,CALL_IV3NWV,GRID_JN66,APTYPE_CQHISCALL);
|
||||
|
||||
}
|
||||
|
||||
printf("\nNow decoding with K1JT's decoder...\n");
|
||||
/*
|
||||
if (channel_type==2) // simulate a fast-faded signal
|
||||
printf("Simulating a fast-fading channel with given B90 and spread type\n");
|
||||
else
|
||||
printf("Simulating a %s channel\n",channel_type?"Rayleigh block fading":"AWGN");
|
||||
*/
|
||||
for (k=0;k<ntx;k++) {
|
||||
|
||||
if ((k%10)==0)
|
||||
printf(" %5.1f %%\r",100.0*k/ntx);
|
||||
// printf("."); // work in progress
|
||||
|
||||
if (channel_type==2) {
|
||||
// generate a fast-faded signal
|
||||
rc = qra64_fastfading_channel(&rx,y,submode,EbNodB,B90,fadingModel);
|
||||
if (rc<0) {
|
||||
printf("\nqra64_fastfading_channel error. rc=%d\n",rc);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else // generate a awgn or Rayleigh block fading signal
|
||||
rx = mfskchannel(y, channel_type, EbNodB);
|
||||
|
||||
|
||||
if (channel_type==2) // fast-fading case
|
||||
if (olddec==1) {
|
||||
int k, j;
|
||||
int jj = 1<<submode;
|
||||
int bps = QRA64_M*(2+jj);
|
||||
float *rxbase;
|
||||
float *out = rxolddec;
|
||||
// calc energies at nominal freqs
|
||||
for (k=0;k<QRA64_N;k++) {
|
||||
rxbase = rx + QRA64_M + k*bps;
|
||||
for (j=0;j<QRA64_M;j++) {
|
||||
*out++=*rxbase;
|
||||
rxbase+=jj;
|
||||
}
|
||||
}
|
||||
// decode with awgn decoder
|
||||
rc = qra64_decode(codec_k1jt,&ebnodbest,xdec,rxolddec);
|
||||
}
|
||||
else // use fast-fading decoder
|
||||
rc = qra64_decode_fastfading(codec_k1jt,&ebnodbest,xdec,rx,submode,B90,fadingModel);
|
||||
else // awgn or rayleigh channel. use the old decoder whatever the olddec option is
|
||||
rc = qra64_decode(codec_k1jt,&ebnodbest,xdec,rx);
|
||||
|
||||
|
||||
|
||||
if (rc>=0) {
|
||||
ebnodbavg +=ebnodbest;
|
||||
if (memcmp(xdec,x,12*sizeof(int))==0)
|
||||
ndecok[rc]++;
|
||||
else {
|
||||
fprintf(stderr,"\nUndetected error with rc=%d\n",rc);
|
||||
nundet++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
printf(" %5.1f %%\r",100.0*k/ntx);
|
||||
|
||||
printf("\n\n");
|
||||
|
||||
printf("Msgs transmitted:%d\nMsg decoded:\n\n",ntx);
|
||||
for (k=0;k<12;k++) {
|
||||
printf("rc=%2d %3d with %s\n",k,ndecok[k],decode_type[k]);
|
||||
ndec += ndecok[k];
|
||||
}
|
||||
printf("\nTotal: %d/%d (%d undetected errors)\n\n",ndec,ntx,nundet);
|
||||
printf("");
|
||||
|
||||
if (ndec>0) {
|
||||
ebnodbavg/=(ndec+nundet);
|
||||
printf("Estimated SNR (average in dB) = %.2f dB\n\n",ebnodbavg-QRA64_SNR_EBNO_OFFSET);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void syntax(void)
|
||||
{
|
||||
|
||||
printf("\nQRA64 Mode Tests\n");
|
||||
printf("2016, Nico Palermo - IV3NWV\n\n");
|
||||
printf("---------------------------\n\n");
|
||||
printf("Syntax: qra64 [-s<snrdb>] [-c<channel>] [-a<ap-type>] [-t<testtype>] [-h]\n");
|
||||
printf("Options: \n");
|
||||
printf(" -s<snrdb> : set simulation SNR in 2500 Hz BW (default:-27.5 dB)\n");
|
||||
printf(" -c<channel> : set channel type 0=AWGN (default) 1=Rayleigh 2=Fast-fading\n");
|
||||
printf(" -a<ap-type> : set decode type 0=NOAP 1=AUTOAP (default) 2=USERAP\n");
|
||||
printf(" -t<testtype>: 0=simulate seq of msgs between IV3NWV and K1JT (default)\n");
|
||||
printf(" 1=simulate K1JT receiving K1JT IV3NWV JN66\n");
|
||||
printf(" 2=simulate fast-fading/awgn/rayliegh decoders performance\n");
|
||||
printf(" -n<ntx> : simulate the transmission of ntx codewords (default=100)\n");
|
||||
|
||||
printf("Options used only for fast-fading simulations (-c2):\n");
|
||||
printf(" -b : 90%% fading bandwidth in Hz [1..230 Hz] (default = 2.5 Hz)\n");
|
||||
printf(" -m : fading model. 0=Gauss, 1=Lorentz (default = Lorentz)\n");
|
||||
printf(" -q : qra64 submode. 0=QRA64A,... 4=QRA64E (default = QRA64A)\n");
|
||||
printf(" -d : use the old awgn decoder\n");
|
||||
printf(" -h: this help\n");
|
||||
printf("Example:\n");
|
||||
printf(" qra64 -t2 -c2 -a2 -b50 -m1 -q2 -n10000 -s-26\n");
|
||||
printf(" runs the error performance test (-t2)\n");
|
||||
printf(" with USER_AP (-a2)\n");
|
||||
printf(" simulating a fast fading channel (-c2)\n");
|
||||
printf(" with B90 = 50 Hz (-b50), Lorentz Doppler (-m1), mode QRA64C (-q2)\n");
|
||||
printf(" ntx = 10000 codewords (-n10000) and SNR = -26 dB (-s-26)\n");
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int k, rc, nok=0;
|
||||
float SNRdB = -27.5f;
|
||||
unsigned int channel = CHANNEL_AWGN;
|
||||
unsigned int mode = QRA_AUTOAP;
|
||||
unsigned int testtype=0;
|
||||
int nqso = 100;
|
||||
float EbNodB;
|
||||
float B90 = 2.5;
|
||||
int fadingModel = 1;
|
||||
int submode = 0;
|
||||
int olddec = 0;
|
||||
int ntx = 100;
|
||||
|
||||
// Parse the command line
|
||||
while(--argc) {
|
||||
argv++;
|
||||
|
||||
if (strncmp(*argv,"-h",2)==0) {
|
||||
syntax();
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-n",2)==0) {
|
||||
ntx = ( int)atoi((*argv)+2);
|
||||
if (ntx<100 || ntx>1000000) {
|
||||
printf("Invalid -n option. ntx must be in the range [100..1000000]\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-a",2)==0) {
|
||||
mode = ( int)atoi((*argv)+2);
|
||||
if (mode>2) {
|
||||
printf("Invalid decoding mode\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-s",2)==0) {
|
||||
SNRdB = (float)atof((*argv)+2);
|
||||
if (SNRdB>20 || SNRdB<-50) {
|
||||
printf("SNR should be in the range [-50..20]\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-t",2)==0) {
|
||||
testtype = ( int)atoi((*argv)+2);
|
||||
if (testtype>2) {
|
||||
printf("Invalid test type\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-c",2)==0) {
|
||||
channel = ( int)atoi((*argv)+2);
|
||||
if (channel>CHANNEL_FASTFADE) {
|
||||
printf("Invalid channel type\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-b",2)==0) {
|
||||
B90 = (float)atof((*argv)+2);
|
||||
if (B90<1 || B90>230) {
|
||||
printf("Invalid B90\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-m",2)==0) {
|
||||
fadingModel = (int)atoi((*argv)+2);
|
||||
if (fadingModel<0 || fadingModel>1) {
|
||||
printf("Invalid fading model\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-q",2)==0) {
|
||||
submode = (int)atoi((*argv)+2);
|
||||
if (submode<0 || submode>4) {
|
||||
printf("Invalid submode\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-d",2)==0) {
|
||||
olddec = 1;
|
||||
}
|
||||
else {
|
||||
printf("Invalid option\n");
|
||||
syntax();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (testtype<2) // old tests
|
||||
if (channel==CHANNEL_FASTFADE) {
|
||||
printf("Invalid Option. Test type 0 and 1 supports only AWGN or Rayleigh Channel model\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
EbNodB = SNRdB+QRA64_SNR_EBNO_OFFSET;
|
||||
|
||||
#if defined(__linux__) || defined(__unix__)
|
||||
srand48(GetTickCount());
|
||||
#endif
|
||||
|
||||
if (testtype==0) {
|
||||
for (k=0;k<nqso;k++) {
|
||||
printf("\n\n------------------------\n");
|
||||
rc = test_proc_1(channel, EbNodB, mode);
|
||||
if (rc==0)
|
||||
nok++;
|
||||
}
|
||||
printf("\n\n%d/%d QSOs to end without repetitions\n",nok,nqso);
|
||||
printf("Input SNR = %.1fdB channel=%s ap-mode=%s\n\n",
|
||||
SNRdB,
|
||||
channel==CHANNEL_AWGN?"AWGN":"RAYLEIGH",
|
||||
apmode_type[mode]
|
||||
);
|
||||
}
|
||||
else if (testtype==1) {
|
||||
test_proc_2(channel, EbNodB, mode);
|
||||
printf("Input SNR = %.1fdB channel=%s ap-mode=%s\n\n",
|
||||
SNRdB,
|
||||
channel==CHANNEL_AWGN?"AWGN":"RAYLEIGH",
|
||||
apmode_type[mode]
|
||||
);
|
||||
}
|
||||
else {
|
||||
printf("Input SNR = %.1fdB ap-mode=%s\n\n",
|
||||
SNRdB,
|
||||
apmode_type[mode]
|
||||
);
|
||||
test_fastfading(EbNodB,B90,fadingModel,submode,mode,olddec, channel, ntx);
|
||||
}
|
||||
return 0;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,269 +0,0 @@
|
||||
// qra64.h
|
||||
// Encoding/decoding functions for the QRA64 mode
|
||||
//
|
||||
// (c) 2016 - Nico Palermo, IV3NWV
|
||||
// ------------------------------------------------------------------------------
|
||||
// This file is part of the qracodes project, a Forward Error Control
|
||||
// encoding/decoding package based on Q-ary RA (Repeat and Accumulate) LDPC codes.
|
||||
//
|
||||
// qracodes 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 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
// qracodes 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 qracodes source distribution.
|
||||
// If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#ifndef _qra64_h_
|
||||
#define _qra64_h_
|
||||
|
||||
// qra64_init(...) initialization flags
|
||||
#define QRA_NOAP 0 // don't use a-priori knowledge
|
||||
#define QRA_AUTOAP 1 // use auto a-priori knowledge
|
||||
#define QRA_USERAP 2 // a-priori knowledge messages provided by the user
|
||||
|
||||
// QRA code parameters
|
||||
#define QRA64_K 12 // information symbols
|
||||
#define QRA64_N 63 // codeword length
|
||||
#define QRA64_C 51 // (number of parity checks C=(N-K))
|
||||
#define QRA64_M 64 // code alphabet size
|
||||
#define QRA64_m 6 // bits per symbol
|
||||
|
||||
// packed predefined callsigns and fields as defined in JT65
|
||||
#define CALL_CQ 0xFA08319
|
||||
#define CALL_QRZ 0xFA0831A
|
||||
#define CALL_CQ000 0xFA0831B
|
||||
#define CALL_CQ999 0xFA08702
|
||||
#define CALL_CQDX 0x5624C39
|
||||
#define CALL_DE 0xFF641D1
|
||||
#define GRID_BLANK 0x7E91
|
||||
|
||||
// Types of a-priori knowledge messages
|
||||
#define APTYPE_CQQRZ 0 // [cq/qrz ? ?/blank]
|
||||
#define APTYPE_MYCALL 1 // [mycall ? ?/blank]
|
||||
#define APTYPE_HISCALL 2 // [? hiscall ?/blank]
|
||||
#define APTYPE_BOTHCALLS 3 // [mycall hiscall ?]
|
||||
#define APTYPE_FULL 4 // [mycall hiscall grid]
|
||||
#define APTYPE_CQHISCALL 5 // [cq/qrz hiscall ?/blank]
|
||||
#define APTYPE_SIZE (APTYPE_CQHISCALL+1)
|
||||
|
||||
typedef struct {
|
||||
float decEsNoMetric;
|
||||
int apflags;
|
||||
int apmsg_set[APTYPE_SIZE]; // indicate which ap type knowledge has
|
||||
// been set by the user
|
||||
// ap messages buffers
|
||||
int apmsg_cqqrz[12]; // [cq/qrz ? ?/blank]
|
||||
int apmsg_call1[12]; // [mycall ? ?/blank]
|
||||
int apmsg_call2[12]; // [? hiscall ?/blank]
|
||||
int apmsg_call1_call2[12]; // [mycall hiscall ?]
|
||||
int apmsg_call1_call2_grid[12]; // [mycall hiscall grid]
|
||||
int apmsg_cq_call2[12]; // [cq hiscall ?/blank]
|
||||
int apmsg_cq_call2_grid[12]; // [cq hiscall grid]
|
||||
|
||||
// ap messages masks
|
||||
int apmask_cqqrz[12];
|
||||
int apmask_cqqrz_ooo[12];
|
||||
int apmask_call1[12];
|
||||
int apmask_call1_ooo[12];
|
||||
int apmask_call2[12];
|
||||
int apmask_call2_ooo[12];
|
||||
int apmask_call1_call2[12];
|
||||
int apmask_call1_call2_grid[12];
|
||||
int apmask_cq_call2[12];
|
||||
int apmask_cq_call2_ooo[12];
|
||||
} qra64codec;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
qra64codec *qra64_init(int flags);
|
||||
// QRA64 mode initialization function
|
||||
// arguments:
|
||||
// flags: set the decoder mode
|
||||
// QRA_NOAP use no a-priori information
|
||||
// QRA_AUTOAP use any relevant previous decodes
|
||||
// QRA_USERAP use a-priori information provided via qra64_apset(...)
|
||||
// returns:
|
||||
// Pointer to initialized qra64codec data structure
|
||||
// this pointer should be passed to the encoding/decoding functions
|
||||
//
|
||||
// 0 if unsuccessful (can't allocate memory)
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void qra64_encode(qra64codec *pcodec, int *y, const int *x);
|
||||
// QRA64 encoder
|
||||
// arguments:
|
||||
// pcodec = pointer to a qra64codec data structure as returned by qra64_init
|
||||
// x = pointer to the message to be encoded, int x[12]
|
||||
// x must point to an array of integers (i.e. defined as int x[12])
|
||||
// y = pointer to encoded message, int y[63]=
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
int qra64_decode(qra64codec *pcodec, float *ebno, int *x, const float *r);
|
||||
// QRA64 mode decoder
|
||||
// arguments:
|
||||
// pcodec = pointer to a qra64codec data structure as returned by qra64_init
|
||||
// ebno = pointer to a float where the avg Eb/No (in dB) will be stored
|
||||
// in case of successfull decoding
|
||||
// (pass a null pointer if not interested)
|
||||
// x = pointer to decoded message, int x[12]
|
||||
// r = pointer to received symbol energies (squared amplitudes)
|
||||
// r must point to an array of length QRA64_M*QRA64_N (=64*63=4032)
|
||||
// The first QRA_M entries should be the energies of the first
|
||||
// symbol in the codeword; the last QRA_M entries should be the
|
||||
// energies of the last symbol in the codeword
|
||||
//
|
||||
// return code:
|
||||
//
|
||||
// The return code is <0 when decoding is unsuccessful
|
||||
// -16 indicates that the definition of QRA64_NMSG does not match what required by the code
|
||||
// If the decoding process is successfull the return code is accordingly to the following table
|
||||
// rc=0 [? ? ?] AP0 (decoding with no a-priori)
|
||||
// rc=1 [CQ ? ?] AP27
|
||||
// rc=2 [CQ ? ] AP44
|
||||
// rc=3 [CALL ? ?] AP29
|
||||
// rc=4 [CALL ? ] AP45
|
||||
// rc=5 [CALL CALL ?] AP57
|
||||
// rc=6 [? CALL ?] AP29
|
||||
// rc=7 [? CALL ] AP45
|
||||
// rc=8 [CALL CALL GRID] AP72 (actually a AP68 mask to reduce false decodes)
|
||||
// rc=9 [CQ CALL ?] AP55
|
||||
// rc=10 [CQ CALL ] AP70 (actaully a AP68 mask to reduce false decodes)
|
||||
|
||||
// return codes in the range 1-10 indicate the amount and the type of a-priori
|
||||
// information was required to decode the received message.
|
||||
|
||||
|
||||
// Decode a QRA64 msg using a fast-fading metric
|
||||
int qra64_decode_fastfading(
|
||||
qra64codec *pcodec, // ptr to the codec structure
|
||||
float *ebno, // ptr to where the estimated Eb/No value will be saved
|
||||
int *x, // ptr to decoded message
|
||||
const float *rxen, // ptr to received symbol energies array
|
||||
const int submode, // submode idx (0=QRA64A ... 4=QRA64E)
|
||||
const float B90, // spread bandwidth (90% fractional energy)
|
||||
const int fadingModel); // 0=Gaussian 1=Lorentzian fade model
|
||||
//
|
||||
// rxen: The array of the received bin energies
|
||||
// Bins must be spaced by integer multiples of the symbol rate (1/Ts Hz)
|
||||
// The array must be an array of total length U = L x N where:
|
||||
// L: is the number of frequency bins per message symbol (see after)
|
||||
// N: is the number of symbols in a QRA64 msg (63)
|
||||
//
|
||||
// The number of bins/symbol L depends on the selected submode accordingly to
|
||||
// the following rule:
|
||||
// L = (64+64*2^submode+64) = 64*(2+2^submode)
|
||||
// Tone 0 is always supposed to be at offset 64 in the array.
|
||||
// The m-th tone nominal frequency is located at offset 64 + m*2^submode (m=0..63)
|
||||
//
|
||||
// Submode A: (2^submode = 1)
|
||||
// L = 64*3 = 196 bins/symbol
|
||||
// Total length of the energies array: U = 192*63 = 12096 floats
|
||||
//
|
||||
// Submode B: (2^submode = 2)
|
||||
// L = 64*4 = 256 bins/symbol
|
||||
// Total length of the energies array: U = 256*63 = 16128 floats
|
||||
//
|
||||
// Submode C: (2^submode = 4)
|
||||
// L = 64*6 = 384 bins/symbol
|
||||
// Total length of the energies array: U = 384*63 = 24192 floats
|
||||
//
|
||||
// Submode D: (2^submode = 8)
|
||||
// L = 64*10 = 640 bins/symbol
|
||||
// Total length of the energies array: U = 640*63 = 40320 floats
|
||||
//
|
||||
// Submode E: (2^submode = 16)
|
||||
// L = 64*18 = 1152 bins/symbol
|
||||
// Total length of the energies array: U = 1152*63 = 72576 floats
|
||||
//
|
||||
// Note: The rxen array is modified and reused for internal calculations.
|
||||
//
|
||||
//
|
||||
// B90: spread fading bandwidth in Hz (90% fractional average energy)
|
||||
//
|
||||
// B90 should be in the range 1 Hz ... 238 Hz
|
||||
// The value passed to the call is rounded to the closest value among the
|
||||
// 64 available values:
|
||||
// B = 1.09^k Hz, with k=0,1,...,63
|
||||
//
|
||||
// I.e. B90=27 Hz will be approximated in this way:
|
||||
// k = rnd(log(27)/log(1.09)) = 38
|
||||
// B90 = 1.09^k = 1.09^38 = 26.4 Hz
|
||||
//
|
||||
// For any input value the maximum rounding error is not larger than +/- 5%
|
||||
//
|
||||
// return codes: same return codes of qra64_decode (+some additional error codes)
|
||||
|
||||
|
||||
// Simulate the fast-fading channel (to be used with qra64_decode_fastfading)
|
||||
int qra64_fastfading_channel(
|
||||
float **rxen,
|
||||
const int *xmsg,
|
||||
const int submode,
|
||||
const float EbN0dB,
|
||||
const float B90,
|
||||
const int fadingModel);
|
||||
// Simulate transmission over a fading channel with given B90, fading model and submode
|
||||
// and non coherent detection.
|
||||
// Sets rxen to point to an array of bin energies formatted as required
|
||||
// by the (fast-fading) decoding routine.
|
||||
// returns 0 on success or negative values on error conditions
|
||||
|
||||
|
||||
int qra64_apset(qra64codec *pcodec, const int mycall, const int hiscall, const int grid, const int aptype);
|
||||
// Set decoder a-priori knowledge accordingly to the type of the message to
|
||||
// look up for
|
||||
// arguments:
|
||||
// pcodec = pointer to a qra64codec data structure as returned by qra64_init
|
||||
// mycall = mycall to look for
|
||||
// hiscall = hiscall to look for
|
||||
// grid = grid to look for
|
||||
// aptype = define the type of AP to be set:
|
||||
// APTYPE_CQQRZ set [cq/qrz ? ?/blank]
|
||||
// APTYPE_MYCALL set [mycall ? ?/blank]
|
||||
// APTYPE_HISCALL set [? hiscall ?/blank]
|
||||
// APTYPE_BOTHCALLS set [mycall hiscall ?]
|
||||
// APTYPE_FULL set [mycall hiscall grid]
|
||||
// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank]
|
||||
|
||||
// returns:
|
||||
// 0 on success
|
||||
// -1 when qra64_init was called with the QRA_NOAP flag
|
||||
// -2 invalid apytpe (valid range [APTYPE_CQQRZ..APTYPE_CQHISCALL]
|
||||
// (APTYPE_CQQRZ [cq/qrz ? ?] is set by default )
|
||||
|
||||
void qra64_apdisable(qra64codec *pcodec, const int aptype);
|
||||
// disable specific AP type
|
||||
// arguments:
|
||||
// pcodec = pointer to a qra64codec data structure as returned by qra64_init
|
||||
// aptype = define the type of AP to be disabled
|
||||
// APTYPE_CQQRZ disable [cq/qrz ? ?/blank]
|
||||
// APTYPE_MYCALL disable [mycall ? ?/blank]
|
||||
// APTYPE_HISCALL disable [ ? hiscall ?/blank]
|
||||
// APTYPE_BOTHCALLS disable [mycall hiscall ? ]
|
||||
// APTYPE_FULL disable [mycall hiscall grid]
|
||||
// APTYPE_CQHISCALL set [cq/qrz hiscall ?/blank]
|
||||
|
||||
void qra64_close(qra64codec *pcodec);
|
||||
// Free memory allocated by qra64_init
|
||||
// arguments:
|
||||
// pcodec = pointer to a qra64codec data structure as returned by qra64_init
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// encode/decode std msgs in 12 symbols as done in jt65
|
||||
void encodemsg_jt65(int *y, const int call1, const int call2, const int grid);
|
||||
void decodemsg_jt65(int *call1, int *call2, int *grid, const int *x);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _qra64_h_
|
File diff suppressed because it is too large
Load Diff
@ -1,65 +0,0 @@
|
||||
// qra64_subs.c
|
||||
// Fortran interface routines for QRA64
|
||||
|
||||
#include "qra64.h"
|
||||
#include <stdio.h>
|
||||
|
||||
static qra64codec *pqra64codec = NULL;
|
||||
|
||||
void qra64_enc_(int x[], int y[])
|
||||
{
|
||||
if (pqra64codec==NULL) pqra64codec = qra64_init(QRA_USERAP);
|
||||
qra64_encode(pqra64codec, y, x);
|
||||
}
|
||||
|
||||
void qra64_dec_(float r[], int* nc1, int* nc2, int* ng2, int* APtype,
|
||||
int* iset, int* ns0, float* b0, int* nf0,
|
||||
int xdec[], float* snr, int* rc)
|
||||
{
|
||||
/*
|
||||
APtype: AP
|
||||
-----------------------------------------------------------------------
|
||||
-1 0 (no AP information)
|
||||
0 [CQ/QRZ ? ? ] 25/37
|
||||
1 [MyCall ? ? ] 25/37
|
||||
2 [ ? HisCall ? ] 25/37
|
||||
3 [MyCall HisCall ? ] 49/68
|
||||
4 [MyCall HisCall grid] 68
|
||||
5 [CQ/QRZ HisCall ? ] 49/68
|
||||
|
||||
rc Message format AP APTYPE Comments
|
||||
------------------------------------------------------------------------
|
||||
-16 Failed sanity check
|
||||
-2 Decoded but CRC failed
|
||||
-1 No decode
|
||||
0 [ ? ? ? ] 0 -1 Decode with no AP info
|
||||
1 [CQ/QRZ ? ? ] 25 0
|
||||
2 [CQ/QRZ ? _ ] 37 0
|
||||
3 [MyCall ? ? ] 25 1
|
||||
4 [MyCall ? _ ] 37 1
|
||||
5 [MyCall HisCall ? ] 49 3
|
||||
6 [ ? HisCall ? ] 25 2 Optional
|
||||
7 [ ? HisCall _ ] 37 2 Optional
|
||||
8 [MyCall HisCall Grid] 68 4
|
||||
9 [CQ/QRZ HisCall ? ] 49 5 Optional (not needed?)
|
||||
10 [CQ/QRZ HisCall _ ] 68 5 Optional
|
||||
11 [CQ/QRZ HisCall Grid] 68 ? Optional
|
||||
*/
|
||||
|
||||
float EbNodBEstimated;
|
||||
int err=0;
|
||||
int nSubmode=*ns0;
|
||||
float b90=*b0;
|
||||
int nFadingModel=*nf0;
|
||||
|
||||
if(pqra64codec==NULL) pqra64codec = qra64_init(QRA_USERAP);
|
||||
err=qra64_apset(pqra64codec,*nc1,*nc2,*ng2,*APtype);
|
||||
if(err<0) printf("ERROR: qra64_apset returned %d\n",err);
|
||||
|
||||
if(*iset==0) {
|
||||
*rc = qra64_decode_fastfading(pqra64codec,&EbNodBEstimated,xdec,r,
|
||||
nSubmode,b90,nFadingModel);
|
||||
*snr = EbNodBEstimated - 31.0;
|
||||
}
|
||||
}
|
||||
|
@ -1,88 +0,0 @@
|
||||
$ qra64_nico -h
|
||||
|
||||
QRA64 Mode Tests
|
||||
2016, Nico Palermo - IV3NWV
|
||||
|
||||
---------------------------
|
||||
|
||||
Syntax: qra64 [-s<snrdb>] [-c<channel>] [-a<ap-type>] [-t<testtype>] [-h]
|
||||
Options:
|
||||
-s<snrdb> : set simulation SNR in 2500 Hz BW (default:-27.5 dB)
|
||||
-c<channel> : set channel type 0=AWGN (default) 1=Rayleigh
|
||||
-a<ap-type> : set decode type 0=NOAP 1=AUTOAP (default) 2=USERAP
|
||||
-t<testtype>: 0=simulate seq of msgs between IV3NWV and K1JT (default)
|
||||
1=simulate K1JT receiving K1JT IV3NWV JN66
|
||||
2=simulate fast-fading routines (option -c ignored)
|
||||
Options used only for fast-fading simulations:
|
||||
-b : 90% fading bandwidth in Hz [1..230 Hz] (default = 2.5 Hz)
|
||||
-m : fading model. 0=Gauss, 1=Lorentz (default = Lorentz)
|
||||
-q : qra64 submode. 0=QRA64A,... 4=QRA64E (default = QRA64A)
|
||||
-h: this help
|
||||
|
||||
|
||||
#############################################################################
|
||||
Usage example:
|
||||
|
||||
qra64 -c2 -t2 -a2 -b50 -m1 -q2 -s-26.0 -n50000
|
||||
|
||||
Simulate a fast-fading channel (-c2)
|
||||
Evaluate decoder performance (-t2) with
|
||||
USER_AP (-a2)
|
||||
B90 = 50 Hz (-b50)
|
||||
Lorentz model (-m1)
|
||||
submode QRA64C (-q2)
|
||||
Input SNR = -26.0 dB (-s-26.0)
|
||||
Simulate 50000 transmissions (-n50000)
|
||||
|
||||
(type qra64 -h for command syntax)
|
||||
|
||||
Command Output:
|
||||
|
||||
Input SNR = -26.0dB ap-mode=USER AP
|
||||
|
||||
Simulating the fast-fading channel
|
||||
B90=50.00 Hz - Fading Model=Lorentz - Submode=QRA64C
|
||||
Decoder metric = Matched to fast-fading signal
|
||||
|
||||
Encoding msg [K1JT IV3NWV JN66]
|
||||
50000 transmissions will be simulated
|
||||
|
||||
K1JT decoder enabled for [CQ ? ?/blank]
|
||||
K1JT decoder enabled for [K1JT ? ?/blank]
|
||||
K1JT decoder enabled for [? IV3NWV ?/blank]
|
||||
K1JT decoder enabled for [K1JT IV3NWV ?]
|
||||
K1JT decoder enabled for [K1JT IV3NWV JN66]
|
||||
K1JT decoder enabled for [CQ IV3NWV ?/b/JN66]
|
||||
|
||||
Now decoding with K1JT's decoder...
|
||||
5.5 %
|
||||
Undetected error with rc=6
|
||||
13.1 %
|
||||
Undetected error with rc=7
|
||||
70.8 %
|
||||
Undetected error with rc=1
|
||||
75.8 %
|
||||
Undetected error with rc=9
|
||||
88.9 %
|
||||
Undetected error with rc=6
|
||||
100.0 %
|
||||
|
||||
Msgs transmitted:50000
|
||||
Msg decoded:
|
||||
|
||||
rc= 0 0 with [? ? ?] AP0
|
||||
rc= 1 0 with [CQ ? ?] AP27
|
||||
rc= 2 0 with [CQ ? ] AP42
|
||||
rc= 3 145 with [CALL ? ?] AP29
|
||||
rc= 4 0 with [CALL ? ] AP44
|
||||
rc= 5 12085 with [CALL CALL ?] AP57
|
||||
rc= 6 0 with [? CALL ?] AP29
|
||||
rc= 7 0 with [? CALL ] AP44
|
||||
rc= 8 24307 with [CALL CALL G] AP72
|
||||
rc= 9 0 with [CQ CALL ?] AP55
|
||||
rc=10 0 with [CQ CALL ] AP70
|
||||
rc=11 0 with [CQ CALL G] AP70
|
||||
|
||||
Total: 36537/50000 (5 undetected errors)
|
||||
|
||||
Estimated SNR (average in dB) = -26.26 dB
|
@ -1,201 +0,0 @@
|
||||
program qra64sim
|
||||
|
||||
! Generate simulated QRA64 data for testing the decoder.
|
||||
|
||||
use wavhdr
|
||||
use packjt
|
||||
parameter (NMAX=54*12000) ! = 648,000
|
||||
parameter (NFFT=10*65536,NH=NFFT/2)
|
||||
type(hdr) h !Header for .wav file
|
||||
integer*2 iwave(NMAX) !Generated waveform
|
||||
integer*4 itone(84) !Channel symbols (values 0-63)
|
||||
real*4 xnoise(NMAX) !Generated random noise
|
||||
real*4 dat(NMAX) !Generated real data
|
||||
complex cdat(NMAX) !Generated complex waveform
|
||||
complex cspread(0:NFFT-1) !Complex amplitude for Rayleigh fading
|
||||
complex z
|
||||
complex c00(0:720000) !Analytic signal for dat()
|
||||
real*8 f0,dt,twopi,phi,dphi,baud,fsample,freq
|
||||
character msg*22,fname*11,csubmode*1,arg*12,cd*1
|
||||
character msgsent*22
|
||||
logical lsync
|
||||
data lsync/.false./
|
||||
|
||||
nargs=iargc()
|
||||
if(nargs.ne.8) then
|
||||
print*,'Usage: qra64sim "msg" A-E Nsigs fDop DT Nfiles Sync SNR'
|
||||
print*,'Example qra64sim "K1ABC W9XYZ EN37" A 10 0.2 0.0 1 T -26'
|
||||
print*,'Sync = T to include sync test.'
|
||||
go to 999
|
||||
endif
|
||||
call getarg(1,msg)
|
||||
call getarg(2,csubmode)
|
||||
mode64=2**(ichar(csubmode)-ichar('A'))
|
||||
call getarg(3,arg)
|
||||
read(arg,*) nsigs
|
||||
call getarg(4,arg)
|
||||
read(arg,*) fspread
|
||||
call getarg(5,arg)
|
||||
read(arg,*) xdt
|
||||
call getarg(6,arg)
|
||||
read(arg,*) nfiles
|
||||
call getarg(7,arg)
|
||||
if(arg(1:1).eq.'T' .or. arg(1:1).eq.'1') lsync=.true.
|
||||
call getarg(8,arg)
|
||||
read(arg,*) snrdb
|
||||
|
||||
if(mode64.ge.8) nsigs=1
|
||||
rms=100.
|
||||
fsample=12000.d0 !Sample rate (Hz)
|
||||
dt=1.d0/fsample !Sample interval (s)
|
||||
twopi=8.d0*atan(1.d0)
|
||||
npts=54*12000 !Total samples in .wav file
|
||||
nsps=6912
|
||||
baud=12000.d0/nsps !Keying rate = 1.7361111111
|
||||
nsym=84 !Number of channel symbols
|
||||
h=default_header(12000,npts)
|
||||
dfsig=2000.0/nsigs !Freq spacing between sigs in file (Hz)
|
||||
ichk=0
|
||||
|
||||
write(*,1000)
|
||||
1000 format('File Sig Freq A-E S/N DT Dop Message'/60('-'))
|
||||
|
||||
nsync=0
|
||||
do ifile=1,nfiles !Loop over requested number of files
|
||||
write(fname,1002) ifile !Output filename
|
||||
1002 format('000000_',i4.4)
|
||||
open(10,file=fname//'.wav',access='stream',status='unknown')
|
||||
xnoise=0.
|
||||
cdat=0.
|
||||
if(snrdb.lt.90) then
|
||||
do i=1,npts
|
||||
xnoise(i)=gran() !Generate gaussian noise
|
||||
enddo
|
||||
endif
|
||||
|
||||
do isig=1,nsigs !Generate requested number of sigs
|
||||
if(mod(nsigs,2).eq.0) f0=1500.0 + dfsig*(isig-0.5-nsigs/2)
|
||||
if(mod(nsigs,2).eq.1) f0=1500.0 + dfsig*(isig-(nsigs+1)/2)
|
||||
if(nsigs.eq.1) f0=1000.0
|
||||
xsnr=snrdb
|
||||
if(snrdb.eq.0.0) xsnr=-20 - isig
|
||||
|
||||
call genqra64(msg,ichk,msgsent,itone,itype)
|
||||
|
||||
bandwidth_ratio=2500.0/6000.0
|
||||
sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*xsnr)
|
||||
if(xsnr.gt.90.0) sig=1.0
|
||||
write(*,1020) ifile,isig,f0,csubmode,xsnr,xdt,fspread,msg
|
||||
1020 format(i4,i4,f10.3,2x,a1,2x,f5.1,f6.2,f6.1,1x,a22)
|
||||
|
||||
phi=0.d0
|
||||
dphi=0.d0
|
||||
k=(xdt+1.0)*12000 !Start audio at t = xdt + 1.0 s
|
||||
isym0=-99
|
||||
do i=1,npts !Add this signal into cdat()
|
||||
isym=i/nsps + 1
|
||||
if(isym.gt.nsym) exit
|
||||
if(isym.ne.isym0) then
|
||||
freq=f0 + itone(isym)*baud*mode64
|
||||
dphi=twopi*freq*dt
|
||||
isym0=isym
|
||||
endif
|
||||
phi=phi + dphi
|
||||
if(phi.gt.twopi) phi=phi-twopi
|
||||
xphi=phi
|
||||
z=cmplx(cos(xphi),sin(xphi))
|
||||
k=k+1
|
||||
if(k.ge.1) cdat(k)=cdat(k) + sig*z
|
||||
enddo
|
||||
enddo
|
||||
|
||||
if(fspread.ne.0) then !Apply specified Doppler spread
|
||||
df=12000.0/nfft
|
||||
twopi=8*atan(1.0)
|
||||
cspread(0)=1.0
|
||||
cspread(NH)=0.
|
||||
b=6.0 !Use truncated Lorenzian shape for fspread
|
||||
do i=1,NH
|
||||
f=i*df
|
||||
x=b*f/fspread
|
||||
z=0.
|
||||
a=0.
|
||||
if(x.lt.3.0) then !Cutoff beyond x=3
|
||||
a=sqrt(1.111/(1.0+x*x)-0.1) !Lorentzian
|
||||
call random_number(r1)
|
||||
phi1=twopi*r1
|
||||
z=a*cmplx(cos(phi1),sin(phi1))
|
||||
endif
|
||||
cspread(i)=z
|
||||
z=0.
|
||||
if(x.lt.50.0) then
|
||||
call random_number(r2)
|
||||
phi2=twopi*r2
|
||||
z=a*cmplx(cos(phi2),sin(phi2))
|
||||
endif
|
||||
cspread(NFFT-i)=z
|
||||
enddo
|
||||
|
||||
! do i=0,NFFT-1
|
||||
! f=i*df
|
||||
! if(i.gt.NH) f=(i-nfft)*df
|
||||
! s=real(cspread(i))**2 + aimag(cspread(i))**2
|
||||
! write(13,3000) i,f,s,cspread(i)
|
||||
!3000 format(i5,f10.3,3f12.6)
|
||||
! enddo
|
||||
! s=real(cspread(0))**2 + aimag(cspread(0))**2
|
||||
! write(13,3000) 1024,0.0,s,cspread(0)
|
||||
|
||||
call four2a(cspread,NFFT,1,1,1) !Transform to time domain
|
||||
|
||||
sum=0.
|
||||
do i=0,NFFT-1
|
||||
p=real(cspread(i))**2 + aimag(cspread(i))**2
|
||||
sum=sum+p
|
||||
enddo
|
||||
avep=sum/NFFT
|
||||
fac=sqrt(1.0/avep)
|
||||
cspread=fac*cspread !Normalize to constant avg power
|
||||
cdat=cspread(1:npts)*cdat !Apply Rayleigh fading
|
||||
|
||||
! do i=0,NFFT-1
|
||||
! p=real(cspread(i))**2 + aimag(cspread(i))**2
|
||||
! write(14,3010) i,p,cspread(i)
|
||||
!3010 format(i8,3f12.6)
|
||||
! enddo
|
||||
|
||||
endif
|
||||
|
||||
dat=aimag(cdat) + xnoise !Add the generated noise
|
||||
fac=32767.0/nsigs
|
||||
if(snrdb.ge.90.0) iwave(1:npts)=nint(fac*dat(1:npts))
|
||||
if(snrdb.lt.90.0) iwave(1:npts)=nint(rms*dat(1:npts))
|
||||
write(10) h,iwave(1:npts) !Save the .wav file
|
||||
close(10)
|
||||
|
||||
if(lsync) then
|
||||
cd=' '
|
||||
if(ifile.eq.nfiles) cd='d'
|
||||
nf1=200
|
||||
nf2=3000
|
||||
nfqso=nint(f0)
|
||||
ntol=100
|
||||
minsync=0
|
||||
emedelay=0.0
|
||||
call ana64(dat,npts,c00)
|
||||
call sync64(c00,nf1,nf2,nfqso,ntol,minsync,mode64,emedelay,xdt2,f02, &
|
||||
jpk0,sync,sync2,width)
|
||||
terr=1.01/(8.0*baud)
|
||||
ferr=1.01*mode64*baud
|
||||
if(abs(xdt2-xdt).lt.terr .and. abs(f02-f0).lt.ferr) nsync=nsync+1
|
||||
open(40,file='sync64.out',status='unknown',position='append')
|
||||
write(40,1030) ifile,64,csubmode,snrdb,fspread,xdt2-xdt,f02-f0, &
|
||||
width,sync,sync2,nsync,cd
|
||||
1030 format(i4,i3,1x,a1,2f7.1,f7.2,4f8.1,i5,1x,a1)
|
||||
close(40)
|
||||
endif
|
||||
enddo
|
||||
if(lsync) write(*,1040) snrdb,nfiles,nsync
|
||||
1040 format('SNR:',f6.1,' nfiles:',i5,' nsynced:',i5)
|
||||
|
||||
999 end program qra64sim
|
@ -1,137 +0,0 @@
|
||||
subroutine qra_loops(c00,npts2,nsps,mode,mode64,nsubmode,nFadingModel, &
|
||||
ndepth,nc1,nc2,ng2,naptype,jpk0,xdt,f0,width,snr2,irc,dat4)
|
||||
|
||||
use packjt
|
||||
use timer_module, only: timer
|
||||
parameter (LN=2176*63) !LN=LL*NN; LL = 64*(mode64+2)
|
||||
character*37 decoded
|
||||
complex c00(0:npts2-1) !Analytic representation of dd(), 6000 Hz
|
||||
complex ,allocatable :: c0(:) !Ditto, with freq shift
|
||||
real a(3) !twkfreq params f,f1,f2
|
||||
real s3(LN) !Symbol spectra
|
||||
real s3avg(LN) !Averaged symbol spectra
|
||||
integer dat4(12),dat4x(12) !Decoded message (as 12 integers)
|
||||
integer nap(0:11) !AP return codes
|
||||
data nap/0,2,3,2,3,4,2,3,6,4,6,6/,nsave/0/
|
||||
save nsave,s3avg
|
||||
|
||||
allocate(c0(0:npts2-1))
|
||||
irc=-99
|
||||
s3lim=20.
|
||||
ibwmax=11
|
||||
if(mode64.le.4) ibwmax=9
|
||||
ibwmin=ibwmax
|
||||
idtmax=3
|
||||
call qra_params(ndepth,maxaptype,idfmax,idtmax,ibwmin,ibwmax,maxdist)
|
||||
LL=64*(mode64+2)
|
||||
NN=63
|
||||
napmin=99
|
||||
ncall=0
|
||||
|
||||
do iavg=0,1
|
||||
if(iavg.eq.1) then
|
||||
idfmax=1
|
||||
idtmax=1
|
||||
endif
|
||||
do idf=1,idfmax
|
||||
ndf=idf/2
|
||||
if(mod(idf,2).eq.0) ndf=-ndf
|
||||
a=0.
|
||||
a(1)=-(f0+0.4*ndf)
|
||||
call twkfreq(c00,c0,npts2,6000.0,a)
|
||||
do idt=1,idtmax
|
||||
ndt=idt/2
|
||||
if(iavg.eq.0) then
|
||||
if(mod(idt,2).eq.0) ndt=-ndt
|
||||
jpk=jpk0 + 240*ndt !240/6000 = 0.04 s = tsym/32
|
||||
if(jpk.lt.0) jpk=0
|
||||
call timer('spec64 ',0)
|
||||
call spec64(c0,nsps,mode,mode64,jpk,s3,LL,NN)
|
||||
call timer('spec64 ',1)
|
||||
call pctile(s3,LL*NN,40,base)
|
||||
s3=s3/base
|
||||
where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim
|
||||
else
|
||||
s3(1:LL*NN)=s3avg(1:LL*NN)
|
||||
endif
|
||||
do ibw=ibwmax,ibwmin,-2
|
||||
ndist=ndf**2 + ndt**2 + ((ibwmax-ibw)/2)**2
|
||||
if(ndist.gt.maxdist) cycle
|
||||
b90=1.728**ibw
|
||||
if(b90.gt.230.0) cycle
|
||||
if(b90.lt.0.15*width) exit
|
||||
ncall=ncall+1
|
||||
call timer('qra64_de',0)
|
||||
call qra64_dec(s3,nc1,nc2,ng2,naptype,0,nSubmode,b90, &
|
||||
nFadingModel,dat4,snr2,irc)
|
||||
call timer('qra64_de',1)
|
||||
if(irc.eq.0) go to 200
|
||||
if(irc.gt.0) call badmsg(irc,dat4,nc1,nc2,ng2)
|
||||
iirc=max(0,min(irc,11))
|
||||
if(irc.gt.0 .and. nap(iirc).lt.napmin) then
|
||||
dat4x=dat4
|
||||
b90x=b90
|
||||
snr2x=snr2
|
||||
napmin=nap(iirc)
|
||||
irckeep=irc
|
||||
xdtkeep=jpk/6000.0 - 1.0
|
||||
f0keep=-a(1)
|
||||
idfkeep=idf
|
||||
idtkeep=idt
|
||||
ibwkeep=ibw
|
||||
ndistx=ndist
|
||||
go to 100 !###
|
||||
endif
|
||||
enddo ! ibw (b90 loop)
|
||||
!### if(iand(ndepth,3).lt.3 .and. irc.ge.0) go to 100
|
||||
enddo ! idt (DT loop)
|
||||
enddo ! idf (f0 loop)
|
||||
! if(iavg.eq.0 .and. abs(jpk0-4320).le.1300) then
|
||||
if(iavg.eq.0) then
|
||||
a=0.
|
||||
a(1)=-f0
|
||||
call twkfreq(c00,c0,npts2,6000.0,a)
|
||||
jpk=3000 !### These definitions need work ###
|
||||
! if(nsps.ge.3600) jpk=4080 !###
|
||||
if(nsps.ge.3600) jpk=6000 !###
|
||||
call spec64(c0,nsps,mode,mode64,jpk,s3,LL,NN)
|
||||
call pctile(s3,LL*NN,40,base)
|
||||
s3=s3/base
|
||||
where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim
|
||||
s3avg(1:LL*NN)=s3avg(1:LL*NN)+s3(1:LL*NN)
|
||||
nsave=nsave+1
|
||||
endif
|
||||
if(iavg.eq.0 .and. nsave.lt.2) exit
|
||||
enddo ! iavg
|
||||
|
||||
100 if(napmin.ne.99) then
|
||||
dat4=dat4x
|
||||
b90=b90x
|
||||
snr2=snr2x
|
||||
irc=irckeep
|
||||
xdt=xdtkeep
|
||||
f0=f0keep
|
||||
idt=idtkeep
|
||||
idf=idfkeep
|
||||
ibw=ibwkeep
|
||||
ndist=ndistx
|
||||
endif
|
||||
|
||||
200 if(mode.eq.65 .and. nsps.eq.7200/2) xdt=xdt+0.4 !### Empirical -- WHY ??? ###
|
||||
|
||||
if(irc.ge.0) then
|
||||
navg=nsave
|
||||
if(iavg.eq.0) navg=0
|
||||
!### For tests only:
|
||||
open(53,file='fort.53',status='unknown',position='append')
|
||||
call unpackmsg(dat4,decoded) !Unpack the user message
|
||||
write(53,3053) idf,idt,ibw,b90,xdt,f0,snr2,ndist,irc,navg,decoded(1:22)
|
||||
3053 format(3i5,f7.1,f7.2,2f7.1,3i4,2x,a22)
|
||||
close(53)
|
||||
!###
|
||||
nsave=0
|
||||
s3avg=0.
|
||||
irc=irc + 100*navg
|
||||
endif
|
||||
return
|
||||
end subroutine qra_loops
|
Loading…
Reference in New Issue
Block a user