Add reference links and credit CuriousMarc restoration team

This commit is contained in:
Ryan Malloy 2026-02-21 10:41:25 -07:00
parent a06f5e8dc1
commit 200fa4e6dc
6 changed files with 25 additions and 4 deletions

View File

@ -7,6 +7,8 @@ import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
The PCM (Pulse Code Modulation) telemetry system converts analog sensor readings and digital status words from the spacecraft into a serial bit stream. This stream is organized into fixed-length frames, each beginning with a sync word that lets the ground station find the frame boundaries in the raw data. Understanding the frame structure is essential for interpreting anything the spacecraft sends. The PCM (Pulse Code Modulation) telemetry system converts analog sensor readings and digital status words from the spacecraft into a serial bit stream. This stream is organized into fixed-length frames, each beginning with a sync word that lets the ground station find the frame boundaries in the raw data. Understanding the frame structure is essential for interpreting anything the spacecraft sends.
Frame formats, sync word structure, and A/D converter specifications are from the [NAA Telecommunication Systems Study Guide (Course A-624)](https://archive.org/details/apollo-telecommunications). AGC channel assignments are from the [Virtual AGC project](https://www.ibiblio.org/apollo/).
## Frame layout ## Frame layout
Each high-rate frame contains exactly 128 eight-bit words, for a total of 1024 bits. The first four words (32 bits) are the sync word. The remaining 124 words carry telemetry data. Each high-rate frame contains exactly 128 eight-bit words, for a total of 1024 bits. The first four words (32 bits) are the sync word. The remaining 124 words carry telemetry data.

View File

@ -7,6 +7,8 @@ import { Aside, Tabs, TabItem } from '@astrojs/starlight/components';
The Apollo Unified S-Band (USB) system multiplexes voice, telemetry, and ranging onto a single 2287.5 MHz carrier using nested modulation layers. Understanding these layers -- and the reasons behind each design choice -- is the key to understanding what gr-apollo does and why its blocks are structured the way they are. The Apollo Unified S-Band (USB) system multiplexes voice, telemetry, and ranging onto a single 2287.5 MHz carrier using nested modulation layers. Understanding these layers -- and the reasons behind each design choice -- is the key to understanding what gr-apollo does and why its blocks are structured the way they are.
All parameters in this section are from the [NAA Telecommunication Systems Study Guide (Course A-624)](https://archive.org/details/apollo-telecommunications).
## The downlink signal, inside out ## The downlink signal, inside out
The spacecraft transmitter begins with a stable carrier at 2287.5 MHz. Multiple information streams are combined onto this carrier through a two-level modulation scheme: subcarriers are first individually modulated with their data, then the composite subcarrier signal phase-modulates the RF carrier. The spacecraft transmitter begins with a stable carrier at 2287.5 MHz. Multiple information streams are combined onto this carrier through a two-level modulation scheme: subcarriers are first individually modulated with their data, then the composite subcarrier signal phase-modulates the RF carrier.
@ -48,7 +50,7 @@ At small modulation indices, the relationship between the modulating signal and
This linearity means the PM demodulator output is a faithful reproduction of the composite subcarrier signal. There is no need for pre-distortion or nonlinear correction -- the receiver just extracts the phase and gets the subcarriers back, ready for filtering and demodulation. This linearity means the PM demodulator output is a faithful reproduction of the composite subcarrier signal. There is no need for pre-distortion or nonlinear correction -- the receiver just extracts the phase and gets the subcarriers back, ready for filtering and demodulation.
The tradeoff is signal power. Most of the transmitted power remains in the carrier rather than the sidebands. The spacecraft burns roughly 20 watts of RF power (via the traveling-wave tube amplifier), but only a fraction of a watt ends up in each subcarrier. The Deep Space Network's 26-meter dishes made up the difference with raw antenna gain. The tradeoff is signal power. Most of the transmitted power remains in the carrier rather than the sidebands. The spacecraft burns roughly 20 watts of RF power (via the traveling-wave tube amplifier), but only a fraction of a watt ends up in each subcarrier. The [Deep Space Network's](https://www.nasa.gov/communicating-with-missions/dsn/) 26-meter dishes made up the difference with raw antenna gain.
<Aside type="note"> <Aside type="note">
The 0.133 rad deviation is for the combined PCM mode (voice + telemetry). During FM-only mode (used for pre-launch checkout), the spacecraft switches to wideband FM with much higher deviation, and the subcarrier oscillator system is used instead of PCM. The 0.133 rad deviation is for the combined PCM mode (voice + telemetry). During FM-only mode (used for pre-launch checkout), the spacecraft switches to wideband FM with much higher deviation, and the subcarrier oscillator system is used instead of PCM.

View File

@ -283,3 +283,7 @@ The default TCP port is 19697 (`AGC_PORT_BASE`). If you are running multiple yaA
</Aside> </Aside>
The GNU Radio wrapper (`agc_bridge` block) exposes three message ports: `uplink_data` (input), `downlink_data` (output), and `status` (output). The status port emits the connection state string whenever it changes, which can be connected to a QT GUI label or logged for monitoring. The GNU Radio wrapper (`agc_bridge` block) exposes three message ports: `uplink_data` (input), `downlink_data` (output), and `status` (output). The status port emits the connection state string whenever it changes, which can be connected to a QT GUI label or logged for monitoring.
## Hardware restoration
While gr-apollo works with the Virtual AGC *emulator*, others have gotten the real hardware running. [CuriousMarc (Marc Verdiell)](https://www.curiousmarc.com/space), along with Mike Stewart, [Ken Shirriff](https://www.righto.com/search/label/Apollo), and a team of volunteers, have restored actual Apollo Guidance Computers and S-Band telecommunications equipment to operational status. Their work provides invaluable validation that the specifications gr-apollo implements match the behavior of real flight hardware.

View File

@ -85,6 +85,19 @@ from apollo import pm_demod, bpsk_demod, pcm_frame_sync, usb_downlink_receiver
You can use the signal generator and frame processing engines without GNU Radio installed. This is useful for offline analysis, unit testing, or environments where GR is hard to install. You can use the signal generator and frame processing engines without GNU Radio installed. This is useful for offline analysis, unit testing, or environments where GR is hard to install.
</Aside> </Aside>
## References
gr-apollo is based on these primary sources:
- [NAA Telecommunication Systems Study Guide (Course A-624, 1965)](https://archive.org/details/apollo-telecommunications) -- the original North American Aviation training manual for the Apollo USB system. Defines all frequencies, modulation parameters, frame formats, and SCO specifications used in gr-apollo.
- [Virtual AGC Project](https://www.ibiblio.org/apollo/) -- Ron Burkey's Apollo Guidance Computer emulator and document archive. The AGC bridge protocol and downlink list decoding are based on the [yaAGC source code](https://github.com/virtualagc/virtualagc).
- [NASA Technical Reports Server](https://ntrs.nasa.gov/) -- primary source for Apollo spacecraft telecommunications system descriptions and MSFN ground station specifications.
### Community
- [CuriousMarc (Marc Verdiell)](https://www.curiousmarc.com/space) — Marc and his team (Mike Stewart, Ken Shirriff, and others) have been restoring and operating original Apollo S-Band flight hardware. Their [YouTube channel](https://www.youtube.com/@CuriousMarc) documents the restoration process in detail.
- [Ken Shirriff's Blog](https://www.righto.com/search/label/Apollo) — detailed reverse-engineering posts on Apollo-era hardware, from AGC core rope memory to the USB signal processing chains.
## Next step ## Next step
<LinkCard <LinkCard

View File

@ -5,7 +5,7 @@ description: "Complete reference for all Apollo Unified S-Band system constants
import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'; import { Tabs, TabItem, Aside } from '@astrojs/starlight/components';
All constants are defined in `apollo.constants` and trace directly to the 1965 NAA Telecommunication Systems Study Guide (Course A-624) via the IMPLEMENTATION_SPEC.md section references noted in each table. All constants are defined in `apollo.constants` and trace directly to the [1965 NAA Telecommunication Systems Study Guide (Course A-624)](https://archive.org/details/apollo-telecommunications) via the IMPLEMENTATION_SPEC.md section references noted in each table.
```python ```python
from apollo.constants import DOWNLINK_FREQ_HZ, PCM_HIGH_BIT_RATE, SCO_FREQUENCIES from apollo.constants import DOWNLINK_FREQ_HZ, PCM_HIGH_BIT_RATE, SCO_FREQUENCIES
@ -253,7 +253,7 @@ AGC_TELECOM_CHANNELS = frozenset({
### Downlink List Type IDs ### Downlink List Type IDs
From `DecodeDigitalDownlink.c` in the Virtual AGC project: From `DecodeDigitalDownlink.c` in the [Virtual AGC project](https://github.com/virtualagc/virtualagc):
| Constant | Value | Description | | Constant | Value | Description |
|----------|-------|-------------| |----------|-------|-------------|

View File

@ -214,7 +214,7 @@ def bits_to_sync_word(bits: list[int]) -> int
The Apollo Guidance Computer emulator (yaAGC) communicates over TCP using a 4-byte packet format. Each packet carries one I/O channel update: a 9-bit channel number and a 15-bit data value. The Apollo Guidance Computer emulator (yaAGC) communicates over TCP using a 4-byte packet format. Each packet carries one I/O channel update: a 9-bit channel number and a 15-bit data value.
These functions are direct ports of `FormIoPacket()` and `ParseIoPacket()` from `yaAGC/SocketAPI.c`. These functions are direct ports of `FormIoPacket()` and `ParseIoPacket()` from [`yaAGC/SocketAPI.c`](https://github.com/virtualagc/virtualagc) in the Virtual AGC project.
### Packet Bit Layout ### Packet Bit Layout