Substation configuration: recording
The 22 settings under recording, each with the type, default and limits its schema declares.
Recording settings, applying to every band that records.
These settings control how the scanner buffers, processes, and saves the audio it demodulates.
buffer_size_seconds in recording
- Type
number- Default
30- Limits
- above 0
Most audio, in seconds, the scanner holds in memory for each radio channel before writing it to disk. If disk writes fall behind, the scanner drops the oldest audio. A larger buffer tolerates slower disks and uses more memory.
disk_flush_interval_seconds in recording
- Type
number- Default
5- Limits
- above 0
How often the scanner writes buffered audio to disk, in seconds. Shorter intervals hold less audio in memory and cost more disk activity.
audio_sample_rate in recording
- Type
integer- Default
16000- Limits
- above 6800
Sample rate of the recorded audio, in Hz. 16 kHz covers the voice band; higher rates keep more high-frequency content and use more disk space.
audio_format in recording
- Type
string- Default
wav- Limits
- one of
wav,flac
File format for recordings. WAV is uncompressed and embeds Broadcast WAV (BEXT) metadata with the time each recording starts, so an audio editor that reads it, such as Ardour or REAPER, can place each recording on a timeline at the time it was made. Audacity plays the files but does not read that time. FLAC is lossless and smaller than WAV, by an amount that depends on the band and the signal, but cannot carry BEXT timeline metadata: the date, time, and frequency are stored as text tags.
audio_output_dir in recording
- Type
string- Default
./audio
Directory where the scanner saves recordings, in a folder for each date and
then each band: <audio_output_dir>/YYYY-MM-DD/<band>/.
fade_in_ms in recording
- Type
numberornull- Default
15- Limits
- at least 0
Length of the fade-in at the start of each recording, in milliseconds, which prevents a click from a sudden onset. Set to 0 or null for no fade.
fade_out_ms in recording
- Type
numberornull- Default
50- Limits
- at least 0
Length of the fade-out at the end of each recording, in milliseconds, which prevents a click from a sudden cutoff. Set to 0 or null for no fade.
soft_limit_drive in recording
- Type
number- Default
1.25- Limits
- above 0
Drive of the soft limiter that keeps recordings from clipping. Higher values compress loud signals more strongly; lower values leave more of the dynamic range untouched. Whatever the drive, audio up to full scale comes out at no more than 0.98 of it (-0.18 dBFS), which leaves room for the small overshoot between audio samples that voice-band audio produces.
noise_reduction_enabled in recording
- Type
boolean- Default
true
Whether the scanner applies spectral-subtraction noise reduction to recorded audio. Set to false to record the demodulated audio without it.
recording_hold_time_ms in recording
- Type
number- Default
500- Limits
- at least 0
Time in milliseconds the scanner keeps recording after a radio channel's
signal drops below its off threshold. The hold is recorded, but does not
count towards min_recording_seconds. On an AM band, a hold much longer than
the transmission can make discard_empty_enabled discard the recording,
because most of what it measures is then hiss.
discard_empty_enabled in recording
- Type
boolean- Default
true
Whether the scanner rejects noise using spectral flatness analysis. When a
radio channel turns on, it rejects a noise trigger before the activation is
reported or a recording starts. This happens on every band with a
demodulator, including one that only detects, so its channel_state events
stay clean too. When a recording closes, it discards the file if it turns out
to be mostly noise. At present this
works only on AM bands: NFM, USB and LSB audio is filtered to the voice
band before it is measured, which makes hiss measure as peaked, so on those
bands hiss is kept.
min_recording_seconds in recording
- Type
number- Default
0.5- Limits
- at least 0
Shortest transmission the scanner keeps a recording of, in seconds, not
counting the hold recorded after it (recording_hold_time_ms). It deletes
the recordings of shorter transmissions when they close, which catches
brief transients, such as radar pulses and ignition noise, that pass the
spectral checks. Set to 0 to keep every recording.
audio_silence_timeout_ms in recording
- Type
number- Default
3000- Limits
- at least 0
Audio silence timeout in milliseconds. Stops recording when demodulated audio
has been silent for this long, even if the RF carrier is still present
(common on AM airband where the carrier persists after voice stops). Set to 0
to rely on RF-only detection. A carrier that stays keyed but silent can turn
on and time out again repeatedly, passing the noise checks each time; if one
radio channel does this persistently, add it to the band's
exclude_channel_indices.
trim_carrier_transients in recording
- Type
boolean- Default
false
Whether the scanner removes the sharp clicks a transmitter makes at key-on and key-off. It trims only transients bordered by silence, so voice is never affected. Recommended for AM airband listening.
dynamics_curve_enabled in recording
- Type
boolean- Default
false
Whether the scanner applies the experimental dynamics curve, set by
dynamics_curve, to recorded audio.
dynamics_curve in recording
- Type
- section
Settings for the experimental dynamics curve. The scanner uses them only when
dynamics_curve_enabled is true.
Settings for the experimental dynamics curve.
The dynamics curve is a dual-region expander applied to each audio sample: a smoothstep S-curve reduces the level of quiet audio below the threshold, which suppresses noise, and a sin² hump gently boosts audio above the threshold, which gives voice more presence. It runs after noise reduction and before the soft limiter. Audio at full scale passes through unchanged, and the output never goes beyond full scale.
It works on each audio sample, with no attack or release, so very aggressive
settings can add mild harmonic distortion to audio near the threshold. If
you hear an edge on the loudest syllables, lower cut_db and boost_db.
threshold_dbfs in recording.dynamics_curve
- Type
number- Default
-25- Limits
- below 0
Level in dBFS that divides the cut region from the boost region. Typical values: -20 to -35 dBFS.
cut_db in recording.dynamics_curve
- Type
number- Default
6- Limits
- at least 0
Gain reduction in dB at the midpoint of the cut S-curve. The largest
reduction, at floor_dbfs, is twice this value. Set to 0 to turn the cut
region off.
boost_db in recording.dynamics_curve
- Type
number- Default
1.5- Limits
- at least 0
Largest gain boost in dB, at the peak of the boost hump. Set to 0 to turn the boost region off. If the boost would take the loudest audio above 0 dBFS, the scanner logs a warning at startup, and the curve is limited at full scale instead of keeping its shape.
floor_dbfs in recording.dynamics_curve
- Type
number- Default
-60- Limits
- below 0
Level in dBFS below which the output is silenced. Must be below
threshold_dbfs. If recordings sound completely silent, this is probably
set too high: try -60 or lower.
cut_curve in recording.dynamics_curve
- Type
number- Default
0.5- Limits
- at least 0, at most 1
Where the cut S-curve is steepest. 0.5 is symmetric; lower values move the
steepest part towards threshold_dbfs, and higher values towards
floor_dbfs. Below about 0.33 the curve no longer meets
threshold_dbfs smoothly: the cut begins with a sharp kink there, which
becomes a step of several dB near 0.
boost_curve in recording.dynamics_curve
- Type
number- Default
0.5- Limits
- at least 0, at most 1
Skew of the boost hump, on the same scale as cut_curve. 0.5 is symmetric.
Near 1 the hump falls steeply just below full scale, and with a
boost_db of a few dB a louder input there comes out quieter.