Adam H Image Capable Digital Mode (AHICDM)


Tags: radio sdr
Reading time: about 2 minutes

AHICDM is a simple digital mode that transmits bits by varying the amount of silence between pulses. It is a narrowband mode that transmits slowly.

I only came across this modulation while looking at the Recently changed pages list of sigidwiki. It looked easy to implement, and didn’t have much written about it, so I decided to play around with the provided audio example.

I have never seen this modulation used in the wild, and the only mention I have seen of it is in the Signal Identification Wiki. This page is written by analyzing the audio recording provided on the wiki page.

Parameters

Name Value
Tone frequency 440 Hz
Tone duration 100 ms / 0.1 sec
Preamble duration 700 ms / 0.7 sec

Baud rate

The baud rate of this modulation depends on the content of the message. A message of all 1 bits will take longer to transmit compared to a message of all 0 bits.

Modulator

Below is a simple modulator written in Python.

#!/usr/bin/env python3
import os
import struct
import numpy as np

class AHICDM_Modulator:
    def __init__(self, freq=440, rate=64_000):
        self.rate = rate
        self.sample = 0
        self.freq = freq
        self.amp = 0
        self.phase = 0

    @property
    def time(self):
        return self.sample / self.rate

    def output_sample(self, sample):
        self.sample += 1
        sample = np.random.normal(sample, 0.01)
        sample += 1
        sample *= 128
        sample = int(sample)
        sample = max(0, min(sample, 255))
        os.write(1, bytes([sample]))

    def amplitude_duration(self, amplitude, duration):
        target = self.time + duration
        while self.time < target:
            self.amp = (self.amp * 0.991) + (amplitude * 0.009)
            self.phase += 2 * np.pi * self.freq / self.rate
            s = np.sin(self.phase) * self.amp
            self.output_sample(s)

    def send_bit(self, bit):
        if bit == 1:
            self.amplitude_duration(0, 0.3)
        else:
            self.amplitude_duration(0, 0.15)

        self.amplitude_duration(1, 0.1)

def bits(buf):
    for byte in buf:
        for i in range(8)[::-1]:
            i = (byte >> i) & 1
            yield int(i)
        
mod = AHICDM_Modulator()
mod.amplitude_duration(0, 0.88)
mod.amplitude_duration(1, 0.7)

for bit in bits(b"gkbrk.com"):
    mod.send_bit(bit)

mod.amplitude_duration(0, 0.7)
mod.amplitude_duration(1, 0.1)

Links

The following pages link here

Citation

If you find this work useful, please cite it as:
@article{yaltirakliwikiahicdm,
  title   = "Adam H Image Capable Digital Mode (AHICDM)",
  author  = "Yaltirakli, Gokberk",
  journal = "gkbrk.com",
  year    = "2024",
  url     = "https://www.gkbrk.com/wiki/ahicdm/"
}
Not using BibTeX? Click here for more citation styles.
IEEE Citation
Gokberk Yaltirakli, "Adam H Image Capable Digital Mode (AHICDM)", December, 2024. [Online]. Available: https://www.gkbrk.com/wiki/ahicdm/. [Accessed Dec. 17, 2024].
APA Style
Yaltirakli, G. (2024, December 17). Adam H Image Capable Digital Mode (AHICDM). https://www.gkbrk.com/wiki/ahicdm/
Bluebook Style
Gokberk Yaltirakli, Adam H Image Capable Digital Mode (AHICDM), GKBRK.COM (Dec. 17, 2024), https://www.gkbrk.com/wiki/ahicdm/

Comments

© 2024 Gokberk Yaltirakli