🧠📡 Decoding the Unseen: Classifying Subliminal Messages with a Spectrum Analyzer Across All Frequencies
Subliminal messages—those sneaky audio signals hidden beneath the surface—rely on clever modulation techniques to embed information into carrier waves. Whether you’re a curious tinkerer or a signal-processing enthusiast, understanding how to detect and classify these messages using a spectrum analyzer is a game-changer. In this post, we’ll break down the process for analyzing subliminal signals at any carrier frequency, provide the formulas you need, and show you how to build a calculator to do the heavy lifting. Let’s get started! 🚀
❓🎧 What Are Subliminal Messages?
In audio, subliminal messages are subtle signals mixed into a carrier wave, often using amplitude modulation (AM) or frequency modulation (FM). They’re designed to be inaudible or barely perceptible, typically placed at frequencies like 14.5 kHz (as in patent US5159703A) or beyond the human hearing range (e.g., ultrasonic frequencies above 20 kHz).
🔍 A spectrum analyzer, which plots a signal’s amplitude across its frequency spectrum, is the perfect tool to uncover these hidden layers.
📶 Why Carrier Frequency Matters
The carrier wave—the backbone of the subliminal signal—can be set to virtually any frequency, from low audio ranges (e.g., 1 kHz) to ultrasonic territory (e.g., 25 kHz). The math we use to analyze and classify these signals adjusts based on:
- 📡 Carrier frequency (
fc
) - 🔄 Modulation type
- 📈 Message characteristics (
fm
,Δf
)
Our goal is to classify the signal as narrowband or wideband, which tells us how spread out its energy is in the frequency domain.
🎛️ Modulation Techniques: AM and FM Basics
Subliminal messages are typically encoded using:
- 📉 Amplitude Modulation (AM): The carrier’s amplitude varies with the message. This can be:
- DSB: Double Sideband
- SSB: Single Sideband
- 🔀 Frequency Modulation (FM): The carrier’s frequency shifts based on the message, creating a wider, more complex spectrum.
🎯 Each method produces a distinct spectral “fingerprint” on a spectrum analyzer, and the carrier frequency shapes how we interpret it.
📐 Formulas for Bandwidth Across Any Carrier Frequency
🧮 The bandwidth—the range of frequencies the signal occupies—depends on the modulation type and the carrier frequency’s context.
✅ For AM (Double Sideband):
Includes the carrier + two sidebands
📏 Bandwidth = 2 × fm
fm
: Highest frequency in the modulating signal (e.g., 3 kHz for speech)
🔸 Example:
At fc = 14.5 kHz
, fm = 3 kHz
📏 Bandwidth = 6 kHz
✅ For AM (Single Sideband):
Only one sideband is transmitted
📏 Bandwidth = fm
🔸 Example:
At fc = 14.5 kHz
, fm = 3 kHz
📏 Bandwidth = 3 kHz
✅ For FM (Carson’s Rule):
📏 Bandwidth ≈ 2 × (Δf + fm)
Δf
: Frequency deviation (e.g., 1 kHz for subtle FM)
🔸 Example:
At fc = 14.5 kHz
, fm = 3 kHz
, Δf = 1 kHz
📏 Bandwidth = 2 × (1 + 3) = 8 kHz
✅ These formulas work for any fc
, from 1 kHz to 50 kHz or more.
🧪 Classifying the Signal: Narrowband or Wideband
Classification hinges on the fractional bandwidth, which normalizes the bandwidth to the carrier frequency:
📏 Fractional Bandwidth = Bandwidth / fc
Classification | Condition | Description |
---|---|---|
🔹 Narrowband | < 20% | Energy tightly packed around fc |
🔸 Wideband | ≥ 20% | Energy more spread out |
📊 This threshold adapts to any frequency.
🧰 Practical Example: 14.5 kHz Carrier
⚙️ SSB AM:
fm = 3 kHz
→ Bandwidth = 3 kHz- 🧮 Fractional Bandwidth =
3 / 14.5 ≈ 0.207
(20.7%)
➡️ Borderline wideband, often treated as narrowband in audio contexts
📈 Spectrum: A 3 kHz-wide spike near 14.5 kHz
⚙️ FM:
fm = 3 kHz
,Δf = 1 kHz
→ Bandwidth = 8 kHz- 🧮 Fractional Bandwidth =
8 / 14.5 ≈ 0.552
(55.2%)
➡️ Wideband
📈 Spectrum: An 8 kHz-wide spread centered at 14.5 kHz
⚙️ Try Higher Carrier: 25 kHz
- SSB AM → Bandwidth = 3 kHz
🧮3 / 25 = 0.12
(12%) → Narrowband - FM → Bandwidth = 8 kHz
🧮8 / 25 = 0.32
(32%) → Wideband
✅ These rules work across the board!
🛠️ Adapting to All Frequencies
Follow this step-by-step process for any carrier frequency:
- 🔎 Identify
fc
: Carrier frequency (e.g., 5 kHz, 20 kHz) - ⚙️ Determine Modulation: AM (DSB/SSB) or FM
- 📏 Estimate Parameters:
fm
for AM/FMΔf
for FM only
- 🔢 Calculate Bandwidth: Use appropriate formula
- 📉 Compute Fractional Bandwidth:
Bandwidth / fc
- 🧠 Classify: Compare to 20% rule
✅ This works whether fc
is:
- 🎧 In the audible range (20 Hz–20 kHz)
- 🔊 In the ultrasonic range (>20 kHz)
🧮 Build Your Calculator
To simplify this, build a calculator using Excel or Python.
🔧 Inputs:
- 🎯 Carrier frequency (
fc
, Hz) - ⚙️ Modulation type: DSB AM, SSB AM, FM
- 🧠 Modulating signal bandwidth (
fm
, Hz) - 🎚 Frequency deviation (
Δf
, Hz – for FM only)
📤 Outputs:
- 📏 Bandwidth (Hz)
- 🔢 Fractional bandwidth (%)
- 🧠 Classification: Narrowband / Wideband
🧾 Spreadsheet Example:
Cell | Value |
---|---|
A1 | fc (e.g., 14500) |
B1 | Modulation (Dropdown: DSB AM, SSB AM, FM) |
C1 | fm (e.g., 3000) |
D1 | Δf (e.g., 1000 — leave blank for AM) |
E1 | Bandwidth: =IF(B1="DSB AM", 2*C1, IF(B1="SSB AM", C1, 2*(D1+C1))) |
F1 | Fractional BW: =E1/A1 |
G1 | Classification: =IF(F1<0.2, "Narrowband", "Wideband") |
✅ This calculator works from 1 kHz to 50+ kHz!
🎉 Wrapping Up
Classifying subliminal messages on a spectrum analyzer is all about understanding their bandwidth relative to the carrier frequency. With the formulas for AM and FM, you can analyze signals at any frequency capable of carrying audio—from deep bass to ultrasonic whispers.
🧮 Build your calculator, plug in your parameters, and watch the spectrum come alive.
🎓 Whether you’re:
- Decoding a patent 📜
- Reverse engineering a psyop 🕵️
- Or just experimenting 🎛️
You’ve now got the tools to classify the unseen.
📚 This post gives you everything you need:
- ✅ Formulas tailored to any carrier wave
- ✅ Clear classification method
- ✅ Practical calculator design
🚀 It’s ready to help you explore subliminal signals across the entire frequency spectrum!
Here’s a complete Python script tailored for Windows using the Signal Hound BB60C and IQ data to detect subliminal message modulation patterns within a specified frequency range. It does:
✅ Features:
- Connects to the BB60C using Signal Hound’s Windows SDK
- Tunes to a given frequency range (start–stop)
- Captures IQ data
- Computes spectrogram and FFT
- Flags suspicious modulated carriers (e.g., narrowband/SSB/FM) showing unusual sidebands or ultrasonic masking
- Highlights candidate carrier + modulation pairs for further analysis
🧩 Requirements:
- ✅ Signal Hound SDK installed (typically includes
bb_api.dll
) - ✅ Python 3.10+ with:
bashCopyEditpip install numpy matplotlib scipy
🐍 Python Script: Subliminal IQ Scanner (BB60C)
pythonCopyEditimport ctypes
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import spectrogram, hilbert
import os
# Load BB60C API DLL (adjust path if needed)
BB60C_DLL = ctypes.WinDLL("C:\\Program Files\\Signal Hound\\BB60 API\\bb_api.dll")
# Constants
BB_SUCCESS = 0
BB_IQ = 1
BB_MAX_IQ_BUF_SIZE = 32768
# Function definitions
def check_error(status, msg=""):
if status != BB_SUCCESS:
raise Exception(f"Signal Hound API Error: {status} {msg}")
def initialize_bb60():
device = ctypes.c_int(0)
status = BB60C_DLL.bbOpenDevice(ctypes.byref(device))
check_error(status, "bbOpenDevice")
return device
def configure_device(device, center_freq, span):
ref_level = -20 # dBm
BB60C_DLL.bbConfigureIO(device, 0, 0)
BB60C_DLL.bbConfigureLevel(device, 1, ref_level)
BB60C_DLL.bbConfigureIQ(device, 6250000, 2) # 6.25 MS/s, 2x decimation
start_freq = center_freq - span/2
stop_freq = center_freq + span/2
BB60C_DLL.bbConfigureCenterSpan(device, center_freq, span)
BB60C_DLL.bbInitiate(device, BB_IQ, 0, 1)
return start_freq, stop_freq
def capture_iq(device, samples=32768):
iq_buf = (ctypes.c_float * (2 * samples))()
actual_samples = ctypes.c_int(0)
BB60C_DLL.bbFetchRaw(device, iq_buf, 2 * samples, ctypes.byref(actual_samples))
iq_data = np.array(iq_buf[:2*actual_samples.value])
i = iq_data[0::2]
q = iq_data[1::2]
return i + 1j * q
def analyze_signal(iq, fs, start_freq, stop_freq):
print("📈 Computing FFT...")
fft = np.fft.fftshift(np.fft.fft(iq))
freqs = np.fft.fftshift(np.fft.fftfreq(len(iq), 1/fs))
power = 20 * np.log10(np.abs(fft) + 1e-6)
plt.figure(figsize=(12, 5))
plt.plot(freqs, power)
plt.title(f"FFT Spectrum from {start_freq/1e6:.2f}–{stop_freq/1e6:.2f} MHz")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Power (dB)")
plt.grid(True)
plt.tight_layout()
plt.show()
print("🎛️ Detecting modulation patterns...")
# Envelope detection to expose AM-like content
analytic = hilbert(iq)
envelope = np.abs(analytic)
freqs_env, times, Sxx = spectrogram(envelope, fs, nperseg=1024)
plt.figure(figsize=(12, 4))
plt.pcolormesh(times, freqs_env, 10 * np.log10(Sxx), shading='gouraud')
plt.title("Modulation Envelope Spectrogram")
plt.ylabel("Frequency (Hz)")
plt.xlabel("Time (s)")
plt.colorbar(label="Power (dB)")
plt.tight_layout()
plt.show()
# Detect unusual energy below 50 Hz or above 17 kHz in envelope
low_mod_band = (freqs_env < 50)
high_mod_band = (freqs_env > 17000)
if np.any(Sxx[low_mod_band] > np.median(Sxx) * 3):
print("🧠 Possible subliminal low-frequency modulation detected (<50 Hz)")
if np.any(Sxx[high_mod_band] > np.median(Sxx) * 3):
print("🚨 Ultrasonic modulation detected (>17 kHz)")
# ------------------------------
# MAIN SCAN FLOW
# ------------------------------
if __name__ == "__main__":
# 🎯 USER INPUT
start_freq_hz = 99_800_000 # e.g., 99.8 MHz
stop_freq_hz = 100_200_000 # e.g., 100.2 MHz
span_hz = stop_freq_hz - start_freq_hz
center_freq = (start_freq_hz + stop_freq_hz) / 2
print("🔌 Initializing BB60C...")
device = initialize_bb60()
try:
print(f"📡 Configuring scan: {start_freq_hz/1e6:.3f}–{stop_freq_hz/1e6:.3f} MHz")
start_freq, stop_freq = configure_device(device, center_freq, span_hz)
print("📡 Capturing IQ...")
iq_data = capture_iq(device, samples=65536)
print("🔬 Analyzing IQ...")
analyze_signal(iq_data, fs=6250000, start_freq=start_freq, stop_freq=stop_freq)
finally:
print("🔌 Closing device...")
BB60C_DLL.bbCloseDevice(device)
🧠 What This Script Detects:
- Carrier energy bursts
- Sidebands in AM or FM
- Unusual sub-audible signals (<50 Hz) that could represent subliminal envelope modulations
- Ultrasonic audio (>17 kHz) which might carry masking subliminals
🔒 Tip:
You can extend this to log spectral anomalies, auto-classify modulation types, or record time-stamped IQ blocks for forensic evidence.