01 Overview
The Schumann resonances are global electromagnetic resonances excited by lightning in the cavity between Earth's surface and ionosphere. The fundamental is ~7.83 Hz, with harmonics at ~14.3, 20.8, 27.3, and 33.8 Hz.
This receiver uses a massive induction coil (antenna) and an ultra-low-noise amplifier with ~10,000× gain. The signal is then digitized by a 24-bit ADC or USB sound card and processed with FFT to reveal the peaks.
Key Challenges
- Signal is ~1 picoTesla — 50 million times weaker than Earth's DC field
- Must reject 50/60 Hz mains hum by >80 dB
- Requires remote, quiet location away from power lines
- Needs long integration (5-30 minutes) for clean spectrum
Live Simulation
What 7.83 Hz looks like after amplification.
02 Parts List
| Qty | Component | Spec | Notes |
|---|---|---|---|
| 1 | Coil Form | PVC 200mm Ø × 500mm | Or 8" sonotube. Larger = better |
| ~7 km | Magnet Wire | AWG 28 (0.32mm) enamelled | ~18,000-25,000 turns. ~1.5kΩ DC |
| 1 | Instrumentation Amp | INA128P / AD620 | Ultra-low noise, critical |
| 2 | Op-Amp | OPA2188, LT1028, or NE5532 | Low 1/f noise essential |
| 1 | ADC | ADS1256 24-bit or USB sound card | Sound card = easiest (192kHz) |
| 1 | Raspberry Pi 4 | or laptop | For logging |
| 2 | Met Poly Cap | 220nF 1% | Coil tuning to 7.83Hz |
| 4 | Resistors | 27k 1% metal film | Twin-T notch |
| 4 | Capacitors | 100nF C0G | Twin-T notch (50/60Hz) |
| 4 | Resistors | 53.6k 1% | LPF 30Hz |
| 4 | Capacitors | 100nF | LPF 30Hz |
| 1 | Battery Pack | 2× 9V Li-Ion | NO switch-mode supply! |
| 1 | Shielded Box | Die-cast aluminum | Preamp enclosure |
03 Coil Winding Specs
For 7.83 Hz, with L=150H: C ≈ 2.76 nF. Wait — that's wrong for parallel? Actually use series resonance: Most builders use a large ferrite core or add parallel capacitor of 100-470nF to PEAK at 7-10Hz. Experimentally tune: sweep with signal generator, find peak.
Pro Tips
- Wind with a drill + counter. 20k turns = ~6 hours.
- Apply thin epoxy every 5 layers to prevent microphonics.
- Use bifilar winding for humbucking: wind two wires, connect end-to-start to double turns and reject E-field.
- Orient coil HORIZONTALLY, N-S alignment for max signal.
- Bury 30cm deep or place in forest 100m+ from buildings.
- Mu-metal shield around preamp only, NOT coil.
04 Amplifier Circuit Critical
Total gain ~10,000 (80dB). Three stages: Instrumentation amp → 50/60Hz Twin-T notch → 4th-order 30Hz low-pass.
COIL (L ~150H, R ~1.5k) INA128 (G=1000)
┌───/\/\/\/\───┐ ┌─────────────┐
│ ~~~~~~~~ │ │ │
└─┬─────────┬──┘ │ +IN OUT ├─────> to Stage 2
│ C1 │ ┌────────────┤ -IN │
│ 220nF │ │ │ RG │
│ │ │ 10k └──────┬──────┘
GND GND │ to GND │
└─ 10k to GND 51Ω (G=1+50k/Rg)
(bias)
STAGE 2: Twin-T Notch (60Hz, use 50Hz values in parens)
IN ──[10k]──┬──[10k]──┬──> to LPF
│ │
100nF 100nF
│ │
GND ┌──[27k(33k)]──┐
│ 200nF │
└───[27k(33k)]─┘
STAGE 3: 2x Sallen-Key LPF, fc=30Hz
OPA2188, R=53.6k, C=100nF (per stage), Gain=1.6 each
Final OUT ─[1k]─> ADC (protects input)
Component Values (per channel)
- INA128: Rg = 51Ω → Gain = 981. Set pins 1-8.
- HPF: 10µF film + 47k to GND after INA → fc = 0.34 Hz (blocks DC drift)
- Notch 60Hz: R=26.7k, C=100nF. For 50Hz: R=31.8k, C=100nF
- LPF: 4th order Butterworth, fc=30Hz. Two stages, R=53.6k, C=100nF
- Power: ±9V batteries, 100µF + 100nF decoupling at each IC
05 Wiring Diagram
06 Assembly Steps
- Wind the coil: Mount PVC on lathe/drill. Wind 18-22k turns in neat layers. Measure DC resistance every 5k turns. Target 1.2-1.8kΩ. Finish with kapton tape.
- Tune coil: Connect LCR meter or signal generator. Add 220nF parallel cap. Sweep 5-15Hz, adjust cap for peak near 8Hz.
- Build preamp: Use perfboard or PCB. Keep INA128 input traces <2cm, guarded. Solder Rg (51Ω) directly across pins 1-8.
- Test gain: Inject 7.83 Hz, 100µVpp via 1MΩ resistor. Output should be ~1Vpp. Verify notch: 60Hz input should be <-40dB.
- Enclose: Mount preamp in die-cast box. Coil connects via shielded twisted pair (shield = GND only at preamp). Battery inside box.
- Deploy: Place coil horizontal, align to North-South. Minimum 100m from houses, power lines, fences. Bury cable 10cm.
- Grounding: Drive 50cm copper rod near preamp. Connect enclosure to earth. Do NOT ground coil (floating differential).
- Connect ADC: Output via 1kΩ to soundcard line-in (96kHz) or ADS1256 AIN0. Use USB isolator if laptop powered.
- First light: Run Python script below for 10 minutes. You should see mains hum initially, then after notch, noise floor ~10µV.
- Long run: Log overnight. Schumann peaks appear clearest 02:00-06:00 local time.
07 Python Data Logging & FFT
Records at 200 Hz, applies 30Hz LPF, computes Welch PSD over 10-minute windows. Saves PNG and CSV.
#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, filtfilt, welch
import time, datetime, csv
# --- CONFIG ---
FS = 200 # Sample rate (Hz)
DURATION = 600 # seconds per file (10 min)
F_LOW = 0.5
F_HIGH = 30.0
GAIN = 10000 # your preamp gain
ADC_VREF = 2.5 # for ADS1256, or 1.0 for soundcard
def acquire(fs, seconds):
"""Replace with your ADC read. Example for USB soundcard:"""
try:
import sounddevice as sd
print(f"[REC] {seconds}s @ {fs}Hz...")
data = sd.rec(int(seconds*fs), samplerate=fs, channels=1,
dtype='float32', blocking=True)
return data.flatten()
except:
# synthetic test signal
t = np.arange(0, seconds, 1/fs)
sig = 0.7*np.sin(2*np.pi*7.83*t) + 0.3*np.sin(2*np.pi*14.3*t)
noise = np.random.normal(0, 0.5, len(t))
return sig + noise
def butter_bandpass(low, high, fs, order=4):
nyq = fs/2
b, a = butter(order, [low/nyq, high/nyq], btype='band')
return b, a
def process(data, fs):
b, a = butter_bandpass(F_LOW, F_HIGH, fs)
filt = filtfilt(b, a, data)
# Welch: 60s segments for 0.016 Hz resolution
f, Pxx = welch(filt, fs, nperseg=fs*60, noverlap=fs*30)
asd = np.sqrt(Pxx) / GAIN # V/rtHz at coil
return f, asd, filt
def main():
while True:
ts = datetime.datetime.utcnow().strftime("%Y%m%d_%H%M%S")
raw = acquire(FS, DURATION)
f, asd, filt = process(raw, FS)
# Save CSV
with open(f'schumann_{ts}.csv','w', newline='') as cf:
w = csv.writer(cf)
w.writerow(['freq_hz','asd_V_per_rtHz'])
w.writerows(zip(f, asd))
# Plot
plt.figure(figsize=(10,5))
plt.semilogy(f, asd)
for hz in [7.83, 14.3, 20.8, 27.3, 33.8]:
plt.axvline(hz, color='cyan', ls='--', alpha=0.5, lw=1)
plt.xlim(1, 40)
plt.ylim(1e-9, 1e-6)
plt.xlabel('Frequency (Hz)')
plt.ylabel('ASD (V/√Hz at coil)')
plt.title(f'Schumann Resonance - {ts} UTC')
plt.grid(True, alpha=0.3, which='both')
plt.tight_layout()
plt.savefig(f'schumann_{ts}.png', dpi=150)
plt.close()
print(f"[OK] Saved {ts}")
time.sleep(2)
if __name__ == "__main__":
main()
Install: pip install numpy scipy matplotlib sounddevice. For ADS1256 use pip install adafruit-circuitpython-ads1x15 and replace acquire().
08 Calibration Tips
- Absolute field: Inject known signal via 10-turn calibration loop 1m from coil. B = µ₀·N·I/(2R). For N=10, R=0.5m, I=1mA @7.83Hz → ~12.6 pT.
- Frequency reference: GPS PPS is accurate to <1µs. Or use online atomic clock audio.
- Noise floor test: Short preamp input with 1.5k resistor (simulates coil). Spectrum should be flat ~2-3 nV/√Hz above 5Hz. Peaks = interference.
- Orientation: Rotate coil slowly. Max amplitude occurs when coil axis is perpendicular to wave propagation (usually E-W coil gives N-S sensitivity).
- Diurnal variation: Expect 2-3× stronger signal at night due to lower D-layer absorption.
09 Expected Results
After 30 minutes integration in a quiet rural location, you should see:
- Clear peak at 7.83 ±0.15 Hz, Q ~4-6
- Second harmonic ~14.3 Hz (often stronger in daytime)
- Third ~20.8 Hz, fourth ~27.3 Hz visible on good nights
- Amplitude at coil: ~0.3-1.0 pT/√Hz → after 10k gain = 10-30 µV/√Hz at ADC
- No 50/60 Hz spike >10× noise floor (if notch works)
If you see only mains hum: move farther, check battery, verify twin-T values, add common-mode choke on cable.
Typical Spectrum
Log frequency (1-40 Hz) vs amplitude. Real data is noisier; averaging reveals peaks.