Subsystem Search

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
number or null
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
number or null
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.