Module: PWN::SDR::Decoder::RTTY

Defined in:
lib/pwn/sdr/decoder/rtty.rb

Overview

Pure-Ruby RTTY (Radioteletype, ITA2/Baudot) decoder.

Amateur RTTY is 45.45 baud 2-FSK with a 170 Hz shift; on USB the convention is mark ≈ 2125 Hz, space ≈ 2295 Hz in the demodulated audio. This module runs a per-symbol Goertzel on both tones, frames 1-start / 5-data / 1.5-stop asynchronously, and decodes ITA2 via DSP::BAUDOT_LTRS/FIGS. No minimodem, no sox.

Defined Under Namespace

Classes: Demod

Class Method Summary collapse

Class Method Details

.authorsObject

Author(s)

0day Inc. support@0dayinc.com



135
136
137
# File 'lib/pwn/sdr/decoder/rtty.rb', line 135

public_class_method def self.authors
  "AUTHOR(S):\n  0day Inc. <support@0dayinc.com>\n"
end

.decode(opts = {}) ⇒ Object

Supported Method Parameters

PWN::SDR::Decoder::RTTY.decode( freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq' )



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/pwn/sdr/decoder/rtty.rb', line 107

public_class_method def self.decode(opts = {})
  freq_obj = opts[:freq_obj]
  # Prefer true-air I/Q (FM-demod → existing audio demod) when the
  # operator asks for a source/file or sets freq_obj[:iq_source].
  # Otherwise keep the GQRX 48 kHz UDP audio path (run_native).
  want_iq = opts[:source] || opts[:file] || freq_obj[:iq_source] || freq_obj[:iq_file]
  if want_iq
    PWN::SDR::Decoder::Base.run_iq(
      freq_obj: freq_obj,
      protocol: 'RTTY',
      demod: Demod.new,
      sample_rate: (opts[:sample_rate] || freq_obj[:iq_rate] || 48_000).to_i,
      source: opts[:source],
      file: opts[:file],
      fm_demod: true,
      note: 'RTTY true-air: FM-demod I/Q then native bit recovery; falls back to detector without SDR hardware.'
    )
  else
    PWN::SDR::Decoder::Base.run_native(
      freq_obj: freq_obj,
      protocol: 'RTTY',
      demod: Demod.new
    )
  end
end

.helpObject

Display Usage for this Module



141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/pwn/sdr/decoder/rtty.rb', line 141

public_class_method def self.help
  puts "USAGE (true-air I/Q + GQRX-audio native paths, no external binaries):
    #{self}.decode(
      freq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'
    )

    NOTE: Set GQRX to USB, tune so mark≈2125 Hz / space≈2295 Hz in
          the audio passband. 45.45 baud, 170 Hz shift, 1N5+1.5.

    #{self}.authors
  "
end