V.26 ter and V.26 bis: technical details¶
This is the technical companion to V.26 ter and V.26 bis.
V.26 ter's code is dsp/dp_v26.cpp (V26Pump, DP_V26TER, 126);
V.26 bis has its own section at the end. Clause numbers up
to there are V.26 ter's (1988, the Blue Book).
The signal¶
| Carrier | 1800 Hz both ways (2.1) |
| Symbol rate | 1200 baud (2.5.1) |
| Shaping | 100% raised cosine, split between transmitter and receiver (2.4): a root raised cosine of roll-off 1 at each end |
| 2400 bit/s | a dibit a symbol, the phase change 0, 90, 180, 270 degrees for 00, 01, 11, 10, the first bit on the left (Table 1) |
| 1200 bit/s | a bit a symbol, 0 or 180 degrees (Table 2) |
| Scrambler | self-synchronizing, 1 + x^-18 + x^-23 (GPC) at the caller, 1 + x^-5 + x^-23 (GPA) at the answerer (5, 6.1.1): scramble() in bits.h, V.32's |
| Points | (+-1, +-1); the phase changes are counted in quarter turns between the points decided |
The synchronizing signal (2.7) is 32 symbols of phase reversals, then
scrambled ones: 64 bits at either rate, from the register Appendix I
gives, so that its phase changes are Table 3's (0, 180, 180, 180, 180,
0, ...). Appendix I lists the register one step before the first bit
of its pattern: the code loads it and scrambles one bit before
segment 2. 0x4FFF83 (GPC) and 0x307070 (GPA) are those registers,
newest bit in bit 0 as bits.h keeps them.
The start-up¶
| Sequence | Answerer (A_* states) |
Caller (C_* states) |
|---|---|---|
| A (6.3.1.1) | 200 ms of silence, ANS (2100 Hz) for 3.3 s, 75 ms of silence | (call progress has heard the answer tone) |
| B (6.3.1.2), 1200 bit/s, half duplex | The synchronizing signal and 256 bits of its rate pattern, then silence. Again from the start after 2 s without the caller's pattern | On 4 octets of the answerer's pattern alike: 250 ms of silence, then the synchronizing signal and the pattern of the rate it chose |
| On the caller's pattern: 250 ms of silence, 2100 Hz for 500 ms (G.164's echo suppressor disabling tone), 75 ms of silence. A rate it does not have ends the call | Silent | |
| C (6.3.1.3), at the rate chosen | Its echo cancelling sequence (scrambled ones) for 1 s, its canceller learning; 25 ms of silence; the synchronizing signal and scrambled zeros | Silent until 64 zeros in a row |
| Silent once the caller's signal has been there for 50 ms | Its echo cancelling sequence for 1 s (its canceller learning from 150 ms in, once the answerer is quiet); 25 ms of silence; the synchronizing signal and scrambled zeros | |
| On 64 zeros: the synchronizing signal and zeros, both sending | ||
| 256 zeros sent and 64 more received (or the caller's ones): ones | On 64 zeros: 109 ON, 128 ones, then data (CONNECT) |
|
The caller's ones (64) and 64 of its own: 109 ON, data (CONNECT) |
The rate pattern (6.1.3) is an octet sent 32 times, least significant
bit first, scrambled. The receiver takes a pattern when the last 32
descrambled bits repeat every 8 and the octet is a rotation of one of
Table 7's (which 6.1.3 allows). +MS's rates set ours:
| Octet | Rates | Sent by D-Modem |
|---|---|---|
| 01 | 1200 | an answerer with +MS's highest rate below 2400; a caller that chose 1200 |
| 03 | 2400 | an answerer with +MS's lowest rate above 1200; a caller that chose 2400 |
| 07 | 1200 and 2400 | an answerer otherwise |
| 05, 09 | 4800, 2400 and 4800 (a 4800 bit/s modem's, provisional) | never; 09 is taken as 2400 |
Where the Recommendation leaves room, D-Modem's choices are:
- Lengths. The echo cancelling sequence is 1 s (note 3 asks for 650 ms at least where the network has its own echo cancellers). The answerer sends 256 zeros at least in its second burst, so that the caller finds 64 of them after its synchronizing signal.
- Ones before data. The answerer sends 64 ones before its data, and the caller's receiver passes data to the link only after 16 ones in a row: the zeros of the start-up would reach an asynchronous DTE as a break.
- Gaps. The receiver keeps its gain, equalizer and phase through a gap in the far end's signal (its symbols' power below a fifth of the points') once it has heard 100 symbols, for up to 200 symbols: the 25 ms of silence in sequence C is too short for the carrier detector to notice, and the gain learned on silence would overdrive the signal that follows it.
The receiver¶
QamRx (qam.h): down conversion, matched filter, AGC, Gardner timing
recovery, a 16 tap T/2 equalizer and the carrier loop, decision directed
on the four points from the first symbol (V.26 ter has no training
sequence; 2.3 asks for an equalizer that converges on data). The echo
canceller is EchoCanceller (128 taps, NLMS), trained only during the
modem's own echo cancelling sequence and then fixed, or turned off when
it took away less than 6 dB (no echo to cancel).
The call's statistics (ATI11, +TMO, V.59) get the SNR from the
decision error, the symbol rate and carrier, and the frequency and
timing offsets. V.59 lists it among the modulations it has no object
for (V.26ter in 0x0101).
Not done¶
- The optional half-duplex mode (clause 7).
- Refinement of the echo canceller during data (6.3.1.3 c and e: it is trained once, before the data).
- Test loops 2 and 3 (clause 8, V.54).
- Leased lines (6.1.2): V.26 ter runs on the switched network only.
- Interop with another maker's V.26 ter modem.
Tests¶
| Test | What it covers |
|---|---|
Line/PumpLoopback.DataBothWays/v26ter* (dsp/test/pump_test.cpp) |
Two pumps back to back: a clean line, 15 dB of SNR, 8000 Hz, a gain of 2 with -300 ppm, each modem's own echo at -6 dB. Each connects at 2400 bit/s and carries its data at a bit error rate of 1e-3 at most (none in these runs) |
Modulations/DmodemPair.DataBothWays/v26ter, v26ter_1200 (dsp/test/dmodem_test.cpp) |
Two libdmodem modems with AT+MS=V26T: dialling, the answer tone, the start-up, text both ways; with AT+MS=V26T,0,1200,1200 at 1200 bit/s |
Scripts/CoreEquiv.SameTranscript/at, v59 |
+MS=? lists 126; V.59's 0x0101 lists V.26ter |
V.26 bis¶
The code is dsp/dp_v26bis.cpp (V26bisPump, DP_V26BIS, 226).
Clause numbers here are V.26 bis's (1984, the Blue Book).
The signal¶
| Forward channel | 1800 Hz carrier (2.1), 1200 baud (2.4.3) |
| 2400 bit/s | a dibit a symbol, V.26's alternative B: the phase change 45, 135, 225, 315 degrees for 00, 01, 11, 10, the first bit on the left (Table 1) |
| 1200 bit/s | a bit a symbol, 90 degrees for 0 and 270 for 1 (2.5.1) |
| Scrambler | none |
| Shaping | not set by V.26 bis; D-Modem uses a root raised cosine of roll-off 1 at each end, as V.26 ter's, whose spectrum (600 to 3000 Hz) leaves the backward channel clear |
| Points | 8 at 45 degree steps, radius sqrt(2): the phase changes are odd steps at 2400, even ones at 1200 |
| Backward channel | FSK at 75 baud, 390 Hz mark, 450 Hz space (4.1), the mark when idle |
| Synchronizing signal | the continuous dibit 11 (2.4.2), 225 degrees a symbol. V.26 bis gives none for 1200 bit/s; D-Modem sends continuous ones there, 270 degrees a symbol |
The call¶
Table 2/V.26 bis allows a one-way forward channel with or without the backward channel, or one that goes either way (half duplex). D-Modem runs the one-way system with the backward channel, both channels on for the whole call, as its V.23 runs:
| Step | Answerer (forward channel) | Caller (backward channel) |
|---|---|---|
| 1 | 200 ms of silence, ANS (2100 Hz) for 3.3 s, 75 ms of silence | (call progress has heard the answer tone) |
| 2 | The synchronizing signal at +MS's highest rate (1200 when that is below 2400) |
On 32 symbols of either synchronizing signal in a row (each phase change within 22.5 degrees of 225 or of 270): that rate |
| 3 | The backward channel's mark; CONNECT after 150 ms of it (75/2400 or 75/1200) |
|
| 4 | After 1 s of the synchronizing signal (106's delay at call establishment is 750 to 1400 ms, Table 3) and 150 ms of the caller's mark: CONNECT (2400/75 or 1200/75) and the data |
The mark for 1.5 s more, then the link's data (the answerer may still be in its synchronizing signal) |
V.42 and MNP are off on V.26 bis calls, as on V.23's: a 75 bit/s backward channel is too slow for their acknowledgements to keep 2400 bit/s going.
The receivers¶
The forward channel's is QamRx (qam.h), with no training sequence:
its carrier loop runs on the synchronizing signal (decisions on the 8
points), and its equalizer adapts on the data, decision directed. The
synchronizing signal is a single tone (a constant phase change), from
which an equalizer cannot learn the line; adapting on it spoils the
equalizer for the data. The phase change is taken from the symbol and
the one before it (the angle of z times the conjugate of the last z),
in quadrants at 2400 and halves at 1200.
The backward channel's is FskDemod, V.23's.
Not done¶
- The half-duplex (either-way) system, with its turnarounds and circuit 105, 106 and 109 timings (Table 3).
- The forward channel from the caller.
- Interop with another maker's V.26 bis modem.
Tests¶
| Test | What it covers |
|---|---|
Line/PumpLoopback.DataBothWays/v26bis* (dsp/test/pump_test.cpp) |
Two pumps back to back: a clean line, 15 dB of SNR, 8000 Hz, a gain of 2 with -300 ppm, each modem's own echo at -6 dB. Both connect, 2400/75, the bit error rate 1e-3 at most (none in these runs) |
Modulations/DmodemPair.DataBothWays/v26bis, v26bis_1200 (dsp/test/dmodem_test.cpp) |
Two libdmodem modems with AT+MS=V26B: text both ways (31 s for it at 75 bit/s); with AT+MS=V26B,0,1200,1200, the caller finding 1200 bit/s |
Scripts/CoreEquiv.SameTranscript/at, v59 |
+MS=? lists 226; V.59's 0x0101 lists V.26bis |