This post briefly summarizes the analysis of the Deep & Fast WALE waveforms seen so far, discussing in peculiar the acquisition preambles whose formation does not comply with the mention standard 188-141D (Appendix G, WALE or 4G-ALE). any indications propose that the monitored transmissions could be trials of a circumstantial WALE implementation by fast Mobile adopted in their newest RM12 HF modem, but at present it's only a my guess.
1. Preamble
The preamble is utilized for fast first synchronization and provides time and frequency alignment. Both the Deep WALE and Fast WALE preambles usage 4-ary orthogonal Walsh modulation by mapping each di-bit of the preamble series to "normal" or "exceptional" sets of 4-element Walsh repeated sequences.
Walsh Sequences for WALE Preambles (MIL 188-141D, Table G-VIII) |
Each 32-element is then scrambled by performing a modulo 8 addition
between the PSK8 symbol series below and the corresponding Walsh
element
{7,1,1,3,7,3,1,5,5,1,1,6,7,1,5,4,1,7,1,6,3,6,1,0,4,1,0,7,5,5,2,6}
2. Deep WALE
Deep WALE uses a 240 ms preamble consisting of 18 orthogonal Walsh modulated channel symbols. The first 14 fixed di-bits {0,1,2,1,0,0,2,3,1,3,3,1,2,0} are fixed, the final 4 di-bits are protocol-dependent and mapped utilizing the "exceptional" 32-element Walsh sequences set. Each 32-element is then scrambled in accordance with 1. for a resulting series of 576 PSK8 symbols.
Fig. 1 - Deep WALE preamble |
I coded a C++ Deep WALE modulator in order to get a (synthesized) 188-141D compliant bitstream and then compare it to the bitstreams got by demodulating the (real) over-the-air Deep WALE calls extracted from a monitoring file. Since I was only curious on the preamble formation, to simplify the code I utilized a random generator in place of the 192 coded and interleaved PDU bits; the "modulator" is limited to the PSK8 symbol mapping (1).
Fig. 2 |
Sumarizing what seen in the erstwhile posts, durations and symbols "into the game" are shown in Table I below:
Table I - comparison between real (on-air) and sythesized Deep WALE PDUs |
As expected from the time-based analysis, the comparison of the bitstreams confirms that the real signals disagree from the standard ones in the way their preamble is formed: specifically the real preambles have a longer duration (350 ms, 840 PSK8 symbols) and do not have series repeats (autocorrelation = 0). Conversely, the inevitable repetitions of the scrambling series during the formation of the synthesized preamble origin a 96-bit/32-symbols ACF (on the right of figure 3).
Fig. 3- on-air (left) and sythesized (right) DeepWALE bitstreams |
The symbols of the real & synt preambles are shown below in figure 4:
Fig. 4 |
Fig. 5 - Fast WALE preamble |
A second C++ "sketch" was coded to produce a (synthesized) 188-141D compliant bitstream to be compared with the ones coming from the demodulation of the real signals. As in the erstwhile code, a random generator is utilized in place of the coded and interleaved data bits.
From the analysis of the recordings I was able to detect at least 4 types(!) of Fast WALE framing which disagree in the dimension of the preambles (figure 6) while keeping the duration - and so the symbols - of the data condition unchanged (120 ms, 288 PSK8 symbols)
.
Fig. 6 - different Fast WALE framings |
Table II - comparison between real (on-air) and sythesized Fast WALE PDUs |
As in Deep modulation, the on-air preambles have no series repeats even erstwhile their duration matches the standard 240 ms; in the another cases, duration and so the number of symbols, are little than the ones specified in the standard. Figures 7,8 depict specified differences, announcement the 32 known symbols probes in both the bitstreams and the 96-bit/32-symbols ACF of the synthesized preamble.
Fig. 7 - on-air and sythesized Fast WALE bitstreams |
Fig. 8 |
Unless there are also protocol "options" that I'm not aware of, the differences between the analyzed preambles and those described by 188-141D are due to a circumstantial (proprietary?) implementation. In this regard, my friend ANgazu found an interesting paper by fast Mobile - virtually entitled "Considerations for Synchronization Enhancements for 4G/WALE" - where 2 proposed improvements to the WALE synchronization preambles are illustrated. Specifically, the second proposal presented by RapidM (slide 18, "WALE Enhanced Preamble") perfectly fits with durations and symbols of the on-air signals:
By the way, figure 9 shows the measured autocorrelations for on-air and synthesized preambles of both Deep & Fast WALE PDUs.
Fig. 9 - autocorrelations |
The RapidM slides, which besides announce the upcoming RM12 48kHz Wideband Modem, were presented at the HFIA gathering of March 2020: since the first WALE signals I could analyse date back January 2021, timings are consistent.
If my guesses are right, the analyzed transmissions could just be trials by RapidM, besides due to the fact that - at the time of writing - the RM12 modem is not yet in their catalog [1]. However, I haven't found any confirmation yet and furthermore there are any another aspects, specified as the deficiency of the 1800 Hz carrier in the preamble sectors or the CAZAC sequences formation, which request further investigation. most likely the deficiency of the carrier during the preamble modulation (figure 10) is due to the "tone excision" feature, since the suppression of the 1800 Hz speech improves the waveform resilience and performance in the presence of channel interference [2]: that's another (RapidM?) enhancement to the WALE preamble.
Fig. 10 - the deficiency of the carrier in a Deep WALE PDU preamble |
https://disk.yandex.com/d/CQum1JvCqMzEFQ
[1] https://www.rapidm.com/
[2] https://www.rapidm.com/standard/stanag-4539/
(1) C++ code for Deep WALE PDU formation (Arduino Mega-2560)
char buffer[60];
int preamble[18] = {0,1,2,1,0,0,2,3,1,3,3,1,2,0,0,0,0,0};
int pScramble[32] = {7,1,1,3,7,3,1,5,5,1,1,6,7,1,5,4,1,7,1,6,3,6,1,0,4,1,0,7,5,5,2,6};
int preambNorWalsh[4][32] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4},
{0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4},
{0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0}
};
int preambExcWalsh[4][32] = {
{0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4},
{0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0},
{0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0},
{0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4}
};
int pduWalsh[16][64] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4},
{0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4},
{0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0,0,4,4,0},
{0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4},
{0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0},
{0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0,0,0,4,4,4,4,0,0},
{0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4,0,4,4,0,4,0,0,4},
{0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4},
{0,4,0,4,0,4,0,4,4,0,4,0,4,0,4,0,0,4,0,4,0,4,0,4,4,0,4,0,4,0,4,0,0,4,0,4,0,4,0,4,4,0,4,0,4,0,4,0,0,4,0,4,0,4,0,4,4,0,4,0,4,0,4,0},
{0,0,4,4,0,0,4,4,4,4,0,0,4,4,0,0,0,0,4,4,0,0,4,4,4,4,0,0,4,4,0,0,0,0,4,4,0,0,4,4,4,4,0,0,4,4,0,0,0,0,4,4,0,0,4,4,4,4,0,0,4,4,0,0},
{0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4},
{0,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,0,0},
{0,4,0,4,4,0,4,0,4,0,4,0,0,4,0,4,0,4,0,4,4,0,4,0,4,0,4,0,0,4,0,4,0,4,0,4,4,0,4,0,4,0,4,0,0,4,0,4,0,4,0,4,4,0,4,0,4,0,4,0,0,4,0,4},
{0,0,4,4,4,4,0,0,4,4,0,0,0,0,4,4,0,0,4,4,4,4,0,0,4,4,0,0,0,0,4,4,0,0,4,4,4,4,0,0,4,4,0,0,0,0,4,4,0,0,4,4,4,4,0,0,4,4,0,0,0,0,4,4},
{0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0,0,4,4,0,4,0,0,4,4,0,0,4,0,4,4,0}
};
int shiftRegister[159] = {
0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1,
1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0,
1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1,
0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1,
1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1,
1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0,
1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,
1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1
};
void setup() {
Serial.begin(9600);
}
void printBin(byte tribit) {
for(int i=2; i>=0; i--){
Serial.print(bitRead(tribit,i),BIN);
}
Serial.print(" ");
}
int getQuadbit(void) {
return (random(16));
}
int getTribit(void) {
int bitout, bittap, bitin;
int i,j;
for(j=0; j<16; j++) {
bitout = shiftRegister[158];
bittap = shiftRegister[31];
for(i=158;i>=1;i--){
shiftRegister[i]=shiftRegister[i-1];
}
bitin = bitout^bittap;
shiftRegister[0]=bitin;
}
return (shiftRegister[2]<<2)+(shiftRegister[1]<<1)+shiftRegister[0];
}
int doScramble (int a,int b) {
if (a+b < 8) {
return (a+b);
}
else {
return (a+b-8);
}
}
void loop() {
int scramblingSym;
int tribit;
int psk8;
// preamble
for (int i =0;i <14;i++){
int y =preamble[i];
for (scramblingSym=0;scramblingSym <32;scramblingSym++) {
psk8 =doScramble(preambNorWalsh[y][scramblingSym],pScramble[scramblingSym]);
Serial.println(psk8); //check
}
}
for (int i =14;i <18;i++){
int y =preamble[i];
for (scramblingSym=0;scramblingSym <32;scramblingSym++) {
psk8 =doScramble(preambExcWalsh[y][scramblingSym],pScramble[scramblingSym]);
Serial.println(psk8); //check
}
}
// PDU
for (int quadBitSet =0;quadBitSet <48;quadBitSet++){
int pduSymbol =getQuadbit();
for (scramblingSym=0;scramblingSym <64;scramblingSym++) {
tribit =getTribit();
//printBin(getTribit()); //check
psk8 =doScramble(pduWalsh[pduSymbol][scramblingSym],tribit);
Serial.println(psk8); //check
//sprintf(buffer, "Walsh modulated PDU symbol:%i scrambling symbol:%i PSK8:%i",pduWalsh[pduSymbol][scramblingSym],tribit,psk8);
//Serial.println(buffer);
}
}
for( ; ; );
}
(2) Constant Amplitude Zero AutoCorrelation waveform (CAZAC) is simply a periodic complex-valued signal with modulus 1 and out-of-phase periodic (cyclic) autocorrelations equal to zero. CAZAC sequences find application in wireless communication systems for synchronization of mobile phones with base stations. Zadoff–Chu sequences are well-known CAZAC sequences with peculiar properties.
https://en.wikipedia.org/wiki/Constant_amplitude_zero_autocorrelation_waveform