What is modelled. The signal format follows the published LRPT and CCSDS specifications: QPSK at 72 000 symbols per second with root-raised-cosine pulses (roll-off 0.6); a K = 7, rate 1/2 convolutional code (polynomials 171 and 133 octal, in Meteor's polarity convention); the attached sync marker 1ACFFC1D; the CCSDS randomizer; Reed–Solomon (255,223) interleaved four deep in the dual basis; 1024-byte frames carrying CCSDS packets. The satellite is Meteor-like, not a real spacecraft: a circular 820 km sun-synchronous orbit (98.7°) placed so the pass reaches the chosen peak elevation. Its transmit power (EIRP), the antenna patterns, the losses and the spacecraft ID are modelled values; sky noise uses ITU-R P.372 median figures. The picture is procedurally generated, not real imagery, and it is compressed with this simulator's own simplified 8×8 block codec, a stand-in for Meteor's JPEG-like compression that keeps its structure of 8×8 blocks, 14 blocks per packet and rows 8 lines tall. One row of blocks is sent every 8 s, which is slower than the real scanner. At 1× and 4× every frame is demodulated. At 16× the receiver demodulates only bursts: the frames that carry each image row plus one frame before them; the idle frames in between are skipped.
The pass
Meteor-M satellites circle the Earth over the poles about every 100 minutes, 820 km up. From any spot on the ground, one is in view for up to about 15 minutes at a time. It rises, climbs to a peak elevation that depends on how close its track passes, and sets. Because it moves at 7.4 km/s, first towards and then away from you, its 137 MHz signal arrives shifted in frequency by up to about 3 kHz (the Doppler effect). The shift sweeps through zero fastest when the satellite is overhead.
Elevation
Doppler shift
Sky view
Zenith at the centre, the horizon at the edge, north up.
Link budget
How strong the signal is when it reaches the receiver, compared with the noise. The satellite's transmit power is spread over a distance that grows from 820 km overhead to over 3000 km at the horizon, so a satellite on the horizon is about 12 dB weaker. The antenna's gain changes with elevation too. At 137 MHz the sky itself is noisy: radio noise from the galaxy and from nearby electrical equipment often outweighs the receiver's own noise. The result is Es/N0, the energy of one symbol over the noise density, which decides whether frames decode. Move the antenna gain or the SNR offset and watch where the image breaks up.
Es/N0 over the pass
Antenna gain against elevation
The received signal
The receiver tunes to the nominal frequency and samples the band at 288 000 complex samples per second, four per symbol. The QPSK signal occupies about 115 kHz: the symbol rate times one plus the roll-off. The Doppler shift moves it by a few kHz, a small fraction of its width but far too much for the demodulator to ignore. When the satellite is low, the signal sinks into the noise.
Spectrum
Waterfall newest at the top, about four rows a second
Carrier recovery: Costas loop
QPSK carries two bits per symbol in the phase of the carrier: one of four points at 45°, 135°, 225° and 315°. To read them the receiver must spin its reference in step with the incoming carrier, Doppler and all. It first estimates the frequency coarsely: raising the signal to the fourth power removes the modulation and leaves a spectral line at four times the frequency offset. A Costas loop then locks the phase: for each symbol it measures how far the point sits from the nearest ideal point and nudges its oscillator. Its bandwidth trades tracking speed against noise. The loop cannot tell the four 90° positions apart; frame sync (stage 6) resolves that.
Before carrier correction last 1024 symbols
After carrier and timing recovery
Phase error
Angle of each symbol from its nearest ideal point, last 2048 symbols.
Tracking the Doppler shift
Pull-in range run a sweep
Symbol timing: Gardner loop
The matched filter (the same root-raised-cosine shape as the transmitter's) maximizes the signal against the noise, but only at the right instant in each symbol. The receiver's clock and the satellite's never agree exactly: here the Doppler effect also stretches and squeezes the symbol rate by up to about 22 parts per million. A Gardner detector compares the sample halfway between two symbols with their difference; if the waveform is still moving there, the sampling instant is early or late. A loop steers an interpolator to the right point.
Eye diagram in-phase, matched filter output
200 recent symbols, two symbol periods each, aligned on the recovered sampling instants (the centre of the plot).
Symbol rate offset
Timing error detector output last 2048 symbols
Frame sync and the phase ambiguity
Every 1024-byte frame starts with the same 32-bit attached sync marker, 1ACFFC1D. It goes through the convolutional encoder with everything else, so on the air it becomes a fixed 64-bit pattern: FC A2 B6 3D B0 0D 97 94 (its first few bits depend on the end of the previous frame, so the receiver compares the last 52). The receiver slides the pattern along the symbol stream and compares it in all four orientations of the constellation. The orientation that matches tells it how to undo the Costas loop's 90° ambiguity; the position tells it where the frame starts. After that it expects the next marker exactly 8192 symbols later.
Correlation around the last marker
Encoded marker (this simulator's encoder, from a zero start state), I bit then Q bit per symbol:
Viterbi decoding
The convolutional encoder sends two bits for every data bit, each a mix of the last seven data bits. The Viterbi decoder finds the data sequence whose encoding is closest to what arrived, tracking all 64 encoder states at once. With soft decisions it weighs each received value by how confident it is; for the same bit error rate that is worth about 2 dB over hard 0/1 decisions. Even with one channel bit in 25 wrong, it usually delivers the frame without a single error.
Bit errors per frame
Bit error rate against Eb/N0
For rate 1/2 coding on QPSK, one symbol carries exactly one data bit, so Eb/N0 equals Es/N0. Points from this pass are grouped by the link budget's Es/N0 when each frame was sent; frames the receiver never found are not counted.
Derandomizer and Reed–Solomon
After the marker, the receiver removes the randomizer: a fixed pseudo-random sequence the satellite added so the signal never stays at one value for long. Then each frame splits into four interleaved Reed–Solomon codewords of 255 bytes, 32 of them parity. Each codeword can repair up to 16 wrong bytes anywhere in it; interleaving spreads a burst of Viterbi errors across all four. With more than 16, the decoder normally detects that it cannot correct the codeword, and the frame is lost.
Bytes corrected per frame
Frames decoded against Es/N0
Frames sent while the satellite was above the horizon and the receiver was listening, grouped by the link budget's Es/N0.
| Time (s) | Frame | Content | VCID | Counter | Rotation | Marker | Errors in | Errors out | RS bytes fixed | Result |
|---|
Newest first. Frame number, content and the two error counts come from the simulator's record of what was sent; a real receiver sees only the frame counter, the marker and the Reed–Solomon result. Rotation is the constellation orientation frame sync chose.
Packets and the image
Good frames carry CCSDS packets; a pointer in each frame says where the first new packet starts, so a lost frame costs only the packets it touched. Each image packet holds 14 compressed 8×8 blocks of one channel, so a lost frame leaves black gaps in a strip 8 lines tall, the characteristic look of LRPT dropouts. At low elevation whole rows are lost. Blocks that do arrive are identical to what was sent.
Sent and received
Left: the image as scanned (synthetic). Middle: each row's status, with the satellite's elevation when it was sent. Right: what the receiver rebuilt. The thermal channel is shown with cold as bright, so high cloud tops are white.