Wiki Spectrum analyzer
Zero span and trigger
Zero span shows the level at one frequency over time. The spectrum answers the question of where the power is; zero span answers when: you see pulses, bursts and the pauses between them. A trigger freezes the picture on an event, and the app itself measures the duration, period and duty cycle of the pulses in the window.
What it is and where it is
The Zero-span group is on the Receiver tab, below the frequency and receiver groups. It is the same receive path as the spectrum, only with an envelope detector in place of the FFT and time along the horizontal axis. The frequency comes from the same VFO as the receive band on the spectrum: click a signal on the spectrum or scroll the frequency readout, and zero span looks there.
Zero span receives the same IQ samples as the spectrum and runs together with the spectrum and the audio. Measured on a live HackRF One at 10 MS/s: spectrum, audio and zero span together are processed in 7.0 ms per block lasting 13.1 ms, with no gaps in the audio.
Starting it
- Make sure the app is in tuned mode, not in a sweep: the selected span is no wider than the device's instantaneous bandwidth.
- Put the VFO on the signal you want.
- On the Receiver tab, in the Zero-span group, press Start. The button changes to Stop.
Until zero span is started it computes nothing and costs nothing. The Restart button next to it belongs to the trigger and is available when zero span is running and the trigger is not in free run.
The plot
The plot has 600 points and is updated about twelve times a second. The vertical scale is the same as the spectrum's: the top and the range come from the level scale, five grid lines are labelled, and the unit is dBFS. At the bottom is the time axis from zero to the full duration of the window in milliseconds. When the trigger is not in free run, its threshold is drawn as a horizontal line. The plot background is dark in either theme, like the spectrum's.
The plot never freezes silently. The reason is written right on it:
- Not running — zero span is off.
- Acquiring… with a point counter — the window is not yet filled with real measurements.
- Trigger waiting for a threshold crossing — the trigger is armed and there has been no event yet.
- Sweep in progress — the receiver is not parked on one frequency — in a sweep there can be no envelope at a single frequency.
Settings
- Time step
- How many microseconds one plot point represents. A readout only: the number is taken from the signal path, not from the request, and after decimation rounding it differs slightly from the time span divided by 600.
- Time span
- How much time the screen holds: 2, 5, 10, 20, 50, 100, 200 or 500 ms, or 1 s; default 50 ms. A longer one shows the period of slow pulses, a shorter one measures the duration of each more precisely.
- RBW
- The channel filter bandwidth: 1, 3, 10, 30, 100 or 300 kHz, or 1 MHz; default 30 kHz. It sets the shortest pulse shown honestly — about 1/RBW, that is 33 µs for 30 kHz; the tooltip next to it gives this number for the selected bandwidth. A shorter pulse is smeared by the filter and reads low. A wider RBW sees shorter pulses but brings in more noise.
- Detector
- peak (default) or rms — how the samples are reduced into one plot point. Peak will not miss a pulse shorter than a point, but raises the noise floor. RMS gives the correct average level in a point, but reads a short pulse low — the more so, the shorter it is relative to the time step.
Changing the RBW or the time span changes the time step, so the window starts from a clean sheet: old points next to a new step would give false durations.
Trigger
The Trigger selector has three modes:
- free run
- The default. The queue of points runs continuously, like a chart recorder strip.
- normal
- The app waits for the level to cross the threshold upwards and shows a window with that event. The picture holds until the next crossing, and is then replaced by a new one.
- single
- The same, but after the first firing the trigger disarms: the picture holds until you press Restart.
The Threshold slider is shown when the trigger is not in free run: from −120 to 0 dBFS, default −60 dBFS. The trigger fires only on an upward crossing — a rising edge. The window is captured so that the event sits at a quarter of its width: what came before it is visible too.
If the plot keeps showing Trigger waiting for a threshold crossing, the threshold is above the signal or below the noise: in the second case the level is already over the threshold and never crosses it from below. Switch the trigger to free run for a moment, see where the signal and the noise floor are, and put the threshold between them.
Pulse measurements
Under the heading Bursts in the window the app counts the pulses that fit entirely into the visible window:
- Duration
- The pulse width at −3 dB below its own peak, in milliseconds; the mean over the pulses in the window. The threshold is referred to the peak, not to the noise floor, so the measurement does not depend on noise. Next to it is the uncertainty ± — never less than one time step.
- Period
- The time between the starts of neighbouring pulses and the corresponding repetition frequency in hertz. The start is taken at the detection threshold — it is more robust to small spikes than −3 dB. At least two pulses are needed in the window.
- Duty cycle
- The fraction of the period occupied by the pulse: duration divided by period, in per cent.
- Found
- How many pulses in the window were counted.
- Detection threshold
- The level that separates "pulse" from "no pulse". The app chooses it by itself from the levels in the window; it does not use the trigger threshold.
A pulse cut by the window edge is not measured: it would show a duration that is not its own. Such pulses are counted by the amber line Bursts cut by the window edge, with the advice to increase the time span. When there is no measurement, the reason is given below the fields: not enough data, no pulses (the level excursion in the window is under 3 dB), all pulses are cut by the edge, or none crossed the threshold in full.
Limits
- With a tinySA zero span is not available 0.9.25: a power analyzer returns levels, not samples. The Receiver tab shows an explanation in place of the group.
- Zero span does not work in a sweep: the receiver is not parked on one frequency.
- The trigger is by level only and on the rising edge only; there is no falling-edge trigger and no external trigger.
- A pulse shorter than 1/RBW is shown with a reduced level; the widest RBW is 1 MHz.
- The plot has 600 points: with a long time span the time step is coarse, and the duration of short pulses carries a matching uncertainty.
- Levels are in dBFS, as in the spectrum.