Class: PWN::SDR::Decoder::LoRa::DemodIQ
- Inherits:
-
Object
- Object
- PWN::SDR::Decoder::LoRa::DemodIQ
- Defined in:
- lib/pwn/sdr/decoder/lora.rb
Overview
Streaming CSS dechirp demod for Base.run_iq.
Instance Method Summary collapse
- #feed_iq(samples, rate: nil, &emit) ⇒ Object
-
#initialize(rate:, bw: DEFAULT_BW) ⇒ DemodIQ
constructor
A new instance of DemodIQ.
- #process_window(samples) ⇒ Object
Constructor Details
#initialize(rate:, bw: DEFAULT_BW) ⇒ DemodIQ
29 30 31 32 33 34 35 |
# File 'lib/pwn/sdr/decoder/lora.rb', line 29 def initialize(rate:, bw: DEFAULT_BW) @rate = rate.to_f @bw = bw.to_i @buf = [] @dchirp = {} @seen = {} end |
Instance Method Details
#feed_iq(samples, rate: nil, &emit) ⇒ Object
37 38 39 40 41 42 43 |
# File 'lib/pwn/sdr/decoder/lora.rb', line 37 def feed_iq(samples, rate: nil, &emit) @rate = rate.to_f if rate @input ||= [] @input.concat(samples) window = [(@rate * 0.001).round, 1].max * 2 process_window(@input.shift(window), &emit) while @input.length >= window end |
#process_window(samples) ⇒ Object
45 46 47 48 49 50 51 52 53 |
# File 'lib/pwn/sdr/decoder/lora.rb', line 45 def process_window(samples, &) r = PWN::SDR::Decoder::DSP.resample_iq( iq: samples, src_rate: @rate, dst_rate: @bw ) @buf.concat(r) SF_RANGE.each { |sf| try_sf(sf, &) if block_given? } max = ((1 << 12) * 20) * 2 @buf.shift(@buf.length - max) if @buf.length > max end |