Wiki sections

Wiki Devices

tinySA and tinySA Ultra

The tinySA and tinySA Ultra 0.9.25 are the only devices with which the app shows calibrated levels in dBm. This is not an IQ receiver but a power analyzer: the instrument sweeps by itself and sends finished levels over its USB serial port, and the app shows them in the spectrum, waterfall and traces, sets the limits of its sweep, its RBW, number of points, attenuator, LNA and spur filter, and saves the sweep as CSV. There is no audio, no IQ recording and no zero span in this mode — and that is a property of the instrument, not an unfinished mode of the app.

What this mode is

A HackRF and an RTL-SDR 0.9.25 deliver IQ samples, and the app computes the spectrum from them. A tinySA delivers no samples: it retunes by itself, sets its own resolution bandwidth and returns one level for every point of the sweep. Therefore:

  • the level scale is in dBm, and it is calibrated by the instrument, not by the app; on the trust bar the green dBm — instrument badge stands in place of dBFS — UNCAL;
  • every sweep of the instrument gives one waterfall row and one update of the traces — the screen updates at the pace of the sweep, not tens of times per second;
  • everything that needs samples is unavailable: demodulation to audio, IQ recording, zero span, FFT processing.

Tested on a tinySA Ultra with firmware tinySA4_v1.4-109. The original tinySA has not been tested on hardware. Much of what follows — where the sweep points sit, which RBW the instrument measures them with, what it says about the attenuator and what it does after its screen is touched — the app takes from the tinySA firmware code (build v1.4-109), not from measurements on the instrument; the text says where.

Connecting and choosing the port

A tinySA appears in Windows as a serial (COM) port; Device Manager lists it as “STMicroelectronics Virtual COM Port”. No WinUSB driver and no Zadig are needed here.

  1. Connect the instrument with a USB cable and switch it on.
  2. Close tinySA-App and any other program that holds this port.
  3. Start the app. In the Select a receiver window the instrument is listed as a row such as “tinySA — COM7”. If the row is missing, press Refresh.
  4. Pick the row and press Connect.

The list is built without opening any port: it holds every port present with the USB identifier 0483:5740, including one that is held by another program. Whether it really is a tinySA is established only on connecting — the app asks the instrument for its version. If something other than a tinySA answers, the app says so and advises choosing another port.

When connecting, the app first waits for the instrument's prompt in reply to Enter and for silence on the line, and it takes as its own only a reply that begins with the echo of its command 0.9.42. It takes the model from the first line of the instrument's reply to info — the board name; if the instrument does not name it, the connection is refused rather than the model guessed 0.9.42. In versions 0.9.20–0.9.41 connecting again to a busy instrument could open a tinySA Ultra as an original tinySA with all levels 46 dB too high (found on a simulated instrument); that no longer happens. Each of the four connection refusals says what exactly the instrument sent 0.9.43 — the list is in the section When something goes wrong.

For a tinySA Ultra the range is 0–6000 MHz and an LNA is present. For the original tinySA it is 0–959 MHz, as in its firmware 0.9.43 (the app used to take 960 MHz from the documentation), without an LNA.

If the number keypad or another screen that does not close by itself (VERSION, TOUCH TEST) is open on the instrument, connecting fails: the instrument answers version and info but not rbw, and the app advises closing that screen 0.9.43. Close it on the instrument and connect again.

The sweep span

After connecting, the instrument sweeps 2200–2300 MHz with 450 points. What is the instantaneous bandwidth for an IQ receiver is, here, the limits of the instrument's own sweep. They are changed in the same way as the span on any other source:

  • with the two range fields in the header of the side panel — enter the lower and the upper limit; 0 may be entered in the lower field 0.9.41;
  • with the handles of the selected span on the overview ruler above the spectrum;
  • with the mouse wheel over the spectrum — it narrows and widens the sweep around the frequency under the cursor 0.9.41; before, the wheel only widened a tinySA sweep;
  • with the context menu item Zoom to selection — the sweep becomes the selected span 0.9.41; before, the item only moved the sweep without narrowing it.

Every new span is a new sweep of the instrument with new limits, not a “sweep by the app”: there is no stitching of segments here. The span goes to the instrument as one command with both edges, by the same path from the fields, the ruler, the wheel and the menu. The narrowest span is 10 kHz: a narrower span is widened to 10 kHz, and the ruler moves to what was sent to the instrument. The widest is the whole range of the model. The limits are whole hertz, as the instrument takes them: a span picked with the mouse is rounded, and the same span is not sent to the instrument a second time. If the instrument did not answer a span command, the app keeps the span it had, and repeating the same action sends it to the instrument again.

On the Device tab the same numbers are shown in the Sweep width and Sweep centre rows; a new span and RBW appear there right after the change, not after the first sweep.

Changing the span restarts the accumulation of the traces: the frequency axis is no longer the same. A frozen trace stays on screen after the sweep is shifted or its width changed, as a shape to compare against — its frequencies are no longer the same, and the screen does not say so; once unfrozen, it starts afresh. Changing the number of points clears all traces and removes the reference trace 0.9.41, and the app says so; before 0.9.41 a snapshot of 450 points was still drawn at 101 points — the left quarter of the old sweep across the whole axis.

Where the sweep points sit 0.9.41

According to the firmware code the instrument divides the span into as many steps as there are points and measures point i at “start + i·step”. The first point sits at the start of the span, and there is no point at the very end: the last one is one step lower. The step is a whole number of hertz.

  • The points on screen and in the saved CSV are labelled with exactly these frequencies; each spectrum cell is centred on its point. That is why the picture starts half a step below the start of the sweep and ends before its end. Range in the panel header is the requested sweep.
  • In versions before 0.9.41 every point on screen sat half a step too high (450 points over 100 MHz — 111 kHz), and in the CSV the points were stretched to the right edge: the last one a whole step too high (222 kHz on the same sweep). Files saved then carry those frequencies.
  • On the Device tab two rows say where the points of the last sweep sit: Last point and Point step. On a narrow sweep with many points a noticeable share of the span is not reached: 10 kHz in 2048 points is a 4 Hz step, and the cells cover 8.19 kHz of the requested 10. When more than 1 % of the span is left uncovered, the Last point row is yellow: take fewer points or a wider span.

The grid is taken from the firmware code, not measured on the instrument. It can be checked like this: a 2140–2241 MHz sweep in 101 points and a carrier at exactly 2240 MHz — the highest point in the saved file should be the last one, not the one before it.

The “tinySA instrument” group

On the Spectrum analyzer tab the tinySA instrument group, with the controls of the instrument itself, stands in place of the Resolution bandwidth group.

Model
The instrument's name and the port it answers on.
Firmware
The version line the instrument returned.
RBW
The instrument's resolution bandwidth: auto, 850, 600, 300, 100, 30, 10, 3 or 1 kHz. Until an RBW is chosen in the list, the app does not set one on the instrument. With auto the RBW the app's sweep is measured with is shown next to it, for example “auto · 600 kHz”. A narrower RBW sees weaker signals and separates closer ones, but the sweep becomes tens of times longer. A requested value is clamped to the limits reported by the instrument itself. The instrument's narrowest rung, 200 Hz, is also read and shown 0.9.41.
Instrument screen 0.9.41
A row under RBW when the RBW of the app's sweep and the one the instrument names differ. Explained below, in the section Which RBW the sweep has.
Sweep
How long the last sweep of the instrument took, USB transfer included, and how many points it had. This is the screen update rate.
Points
How many frequencies the instrument measures per sweep: 101, 201, 450, 1001 or 2048; 450 by default. More means a finer grid and a longer sweep. Fewer is faster, but a narrow signal between points can be missed.
Attenuator
Input attenuation inside the instrument: auto, 0, 5, 10, 15, 20, 25 or 30 dB. With auto the instrument picks it by level. A fixed value is needed when a stable scale is required or a strong signal overloads the input. What the list shows is explained in the section What the app knows about the instrument's controls.
LNA
The low-noise amplifier at the instrument's input; tinySA Ultra only — for the original tinySA the checkbox is absent. Lower noise, but a strong signal overloads the input more easily. A dash in the checkbox means the state is unknown, not yet set from the app 0.9.41; a click on it switches the LNA on.
Spurs
The instrument's own spur suppression in its signal path: auto, on or off. “?” means not yet chosen in the app 0.9.41.

What is chosen in the app is not saved between its launches: the next session starts again from 2200–2300 MHz and 450 points, and the attenuator, LNA and spurs are unknown until they are chosen.

Which RBW the sweep has 0.9.41

With auto RBW the instrument derives it from the step of the sweep grid, and there are two grids. The instrument sweeps its own screen with no more than 450 points and answers the RBW query about that one. The app's sweep has its own grid, and above 450 points that is a different RBW. So the app computes the RBW of its sweep by the same rule as the firmware: two grid steps, rounded up to the next RBW rung. The instrument's reply serves as a check of this rule on the grid of its screen.

  • Over 2200–2300 MHz the instrument says 600 kHz, while by the firmware code 450 points are measured with 600 kHz, 1001 with 300 kHz and 2048 with 100 kHz. Where the two RBWs differ, the list shows the RBW of the sweep, and the Instrument screen row shows what the instrument says.
  • This RBW is carried by the list, the trust bar, the traces and the saved file. Before 0.9.41 all of them showed the instrument's reply.
  • What the app cannot confirm is said in a yellow line in the group, and the RBW on the trust bar turns yellow: auto mode not yet confirmed (the RBW may have been set from the instrument's menu), the FAST sweep speed not yet ruled out, the instrument's reply does not agree with the rule, or it is an original tinySA whose rule the app does not have — then the RBW of its screen sweep is shown. Choose auto in the list, and the mode will be set for certain.

The rule is taken from the firmware code: it gives all five of the instrument's replies on its screen grid, but the line width has not been measured on the instrument.

What the app knows about the instrument's controls 0.9.41

Of the three controls — the attenuator, the LNA and the spur filter — the instrument reports only the attenuation in force, as a number, without a word about the mode; it does not report the LNA or the spur filter at all. So the app says about them only what it knows:

  • a control that has not been chosen in the app is shown as unknown: “?” in the lists, a dash in the LNA checkbox and the yellow line Unknown until chosen here: …;
  • next to the attenuator stands the attenuation the instrument named last, marked “was”: “? · was 5 dB”, and with auto chosen “auto · was 30 dB”. A chosen control is shown at once, and the command goes to the instrument as soon as the sweep already running ends;
  • when the attenuation is not chosen as a number and the instrument holds more than zero, a tip below the list says: for the lowest noise floor choose “0 dB”;
  • after every opening and Reconnect what is chosen in the app — the attenuator, the LNA, the spurs and the RBW from the list — is set on the instrument again, in the order it was chosen; the LNA is set to its chosen state before the attenuation 0.9.42. What was not chosen, the app does not set. If the instrument took something other than what was chosen, a window says so;
  • a closed instrument — after a connection error, a broken-off sweep or a failed reconnect — is unknown too. Pause ⏹ does not close the instrument: while paused the controls are shown as they were.

How the instrument handles the attenuator, according to the firmware code (not checked on the instrument):

  • auto chosen after a manual value means 30 dB (zero with the LNA on). The instrument adjusts it only at the end of a completed sweep of its own, and the app's back-to-back sweeps do not allow that. So the noise floor may sit 30 dB higher than it could — which is why a number stands next to auto.
  • The app sets a manual attenuation with two commands: first a neighbouring number, then the one requested. The instrument sets a manual attenuation only when it differs from the one in force, and without this “5 dB” on an instrument in auto that happened to hold 5 dB would leave it in auto. The exception is the same number chosen a second time after the LNA was switched on from the app: then nothing goes to the instrument, and the app only asks for the attenuation again.
  • With the LNA on the instrument takes a manual attenuator as zero; the app shows its number and reports the substitution in a window.

What is changed from the instrument's own menu while the app works with it, the app does not see: the control stays “known” with the old value until the next command or reconnect.

Sweep time and RBW

The price of a narrow RBW is time, and the app does not hide it: the duration of the last sweep is always shown in the Sweep row. The author's measurements on a tinySA Ultra:

Sweep spanRBWPointsOne sweep
100 MHzauto (600 kHz)450≈0.5 s
20 MHz600 kHz1010.2 s
20 MHz100 kHz—0.6 s
20 MHz30 kHz1012 s
20 MHz3 kHz10149 s

With automatic RBW at 450 points over 100 MHz a sweep costs about 1 ms per point; with more points it has not been measured. While the instrument is sweeping it accepts no new commands, so every change of span or of a control waits for the current sweep to finish. With an RBW of a few kilohertz over a wide span that means minutes.

How long to wait for a sweep, the app computes the way the firmware itself counts it 0.9.41: points × sub-steps × the delay of the RBW rung. The estimate is not lower than any of the author's six measurements and not more than 1.7 times higher; a narrow sweep with auto RBW and a sweep over the whole range have not been measured on the instrument.

Touching the instrument while it works 0.9.42

According to the firmware code, touching the tinySA's screen or a button during the app's sweep makes the instrument end that sweep early: it returns fewer points than requested. The app discards such a short sweep and sweeps again a quarter of a second later; the source is not closed and there is no error window.

  • If the instrument cuts sweeps again and again (someone turns its knob or walks its menus), the spectrum stays on the last complete sweep, and the tinySA instrument group says in yellow why and how many sweeps in a row were cut. The trust bar then lights the SWEEPS CUT badge 0.9.43 — visible from any tab and with the side panel closed. As soon as a complete sweep arrives, everything carries on.
  • After a touch the attenuator, the LNA and the spurs are unknown again: in the instrument's menu they are changed by touches alone. They become “?” until chosen in the app again, and the app asks the instrument for its RBW and the attenuation in force after the next complete sweep. The group says that the instrument's screen or buttons were touched and how many of the app's sweeps it cut because of that.
  • As soon as the instrument cuts a sweep, the app asks for its RBW and waits for the next sweep by the narrower of the two — its own and the one named by the instrument 0.9.43. Before the wait, the group says which RBW the app counts the sweep time with and up to how many seconds it waits. In 0.9.42 an RBW narrowed by touch to 30 kHz or below (2200–2300 MHz, 450 points) made the sweep longer than the timeout, and the source closed.
  • If after a touch the instrument does not answer at all — the number keypad or another screen that does not close by itself (VERSION, TOUCH TEST) is open, or a finger is still on the screen — the app says exactly that within 15 s 0.9.43. Close that screen on the instrument and press Reconnect.
  • While the number keypad is open on the instrument (a touch on the frequency field at the bottom of its screen is enough to open it), it does not start the app's sweeps at all, and the source closes after the sweep timeout; the error names this cause.

What this does not cover: a touch that changed the RBW but did not cut any sweep (it fell between two) is not seen by the app — the next sweep is waited for as before. Everything about the touch and what the instrument sends after it is known from the firmware code; it has not been checked on the instrument.

The instrument's own screen

The tinySA firmware derives its automatic RBW from the grid of its own sweep, so the app sets the instrument to the same span it uses itself. As a result, while working the tinySA's screen normally shows the same span as the app.

When the instrument's screen shows another band 0.9.43

After every span command the app asks the instrument what it took, and treats the span the instrument names as its own. If the instrument's screen shows a band other than the one the app sweeps, the tinySA instrument group says in yellow which one it is. The most common cause is that the app's span reaches beyond the range of the mode the instrument is in: the firmware clamps the limits of its own screen (a tinySA Ultra with Ultra mode off — up to 800 MHz; an original tinySA — up to 350 MHz on the low input and 240–959 MHz on the high one), but not the app's sweep, and it measures points outside the range through a signal path chosen by the mode, not by the frequency. Do not take such points for signal levels (firmware code; not checked on the instrument). Other causes: the band was changed on the instrument by hand, its multi-band mode is on, or the app could not retune while the instrument did take the new band. If the instrument did not name its band, the line says that the app does not know. The same goes into the header of a saved CSV — the instrument_screen_hz field.

What happens on closing

On closing, the app waits for the instrument no longer than three seconds (the firmware cannot abort a sweep), gives back automatic RBW if it set one, and gives back the screen the instrument had before connecting: the band limits and the number of points. The centre/span mode and the instrument's own sweep time are reset by the span command, according to the firmware code, and the app does not restore them. If the sweep has not finished within three seconds (a narrow RBW), the tinySA's screen keeps the app's span and RBW — set them back on the instrument itself.

  • The screen is given back even when connecting or closing went wrong 0.9.42: a failed connection tries to give the screen back at once, and if the instrument does not answer, the next connection to the same port remembers what it owes and gives back the real screen on closing. The app remembers this while it runs. Because of that, a failed connection takes longer: usually by 2 s, at most by 4 s (measured on a simulated instrument).
  • Quitting the app in the middle of a sweep no longer orders one more sweep from the instrument 0.9.42, and a control or span chosen at the very moment of quitting is no longer sent to the instrument 0.9.43.
  • If the port breaks in the middle of a sweep (the cable is pulled), closing goes ahead at once without waiting for the instrument 0.9.48; the instrument's screen is then not given back — set RBW auto and your span on the instrument after reconnecting.
  • A screen set on the instrument by hand while the app is running is seen and named by the app, but on closing it gives back the one it found when connecting.

Saving the sweep as CSV 0.9.41

File → Save sweep (CSV)… (Ctrl+E) saves the instrument's last sweep. Before 0.9.41 this item refused a tinySA with No sweep is running. Before the first sweep the app says No sweep yet. The save dialog starts in the C:\sdrsa-rec folder if it exists and suggests a name such as sweep-20261020-153000.csv.

The file has three parts:

  1. the first line — the model, port and firmware of the instrument that took this sweep;
  2. the second line — the measurement conditions of the same sweep: rbw_hz and rbw_from, points, sweep_s, atten_db, lna, spur, atten_last_read_db (the last attenuation named by the instrument itself), instrument_screen_hz, the requested limits asked_start_hz and asked_stop_hz and the point step step_hz;
  3. then the line freq_hz,dBm and one line per point: the frequency of the point as the instrument measures it, and the level in dBm.
rbw_from
Where the RBW is known from: rule — computed by the firmware rule; device — a manual RBW, the instrument's word; assume_auto and assume_normal — computed with an unconfirmed assumption; mismatch and screen — the instrument's word, which the app cannot trust as the RBW of the sweep; unknown — not known.
atten_db, lna, spur
The conditions of the sweep in the file, not the controls at the moment of saving. What the app did not know is written as unknown.
instrument_screen_hz
as_asked — the instrument's screen shows the same band as in the file; limits in hertz — another one; unknown — the instrument did not name it 0.9.43.

The window after saving is the same for all devices and speaks of levels in dBFS per bin and of spur columns. For a tinySA that is not so: the levels in the file are in dBm, as the instrument returned them, and there are no spur or passport columns.

What changes in the window

WhereWhat is different
The Spectrum analyzer tabThere is no Resolution bandwidth group: RBW in hertz, N, the FFT window, the detector, VBW, the DC filter, detection marks and the spur passport belong to IQ receivers. tinySA instrument takes its place.
The Traces groupThe trace modes work, but the detector cannot be chosen: the list reads instrument. The level at each point has already been determined by the tinySA itself.
The trust barRBW is the one the app's sweep was measured with; yellow when the app cannot confirm it. The N and Window fields are absent, and the Detector field reads instrument. The badge is dBm — instrument; when the instrument cuts sweeps itself, also SWEEPS CUT.
The spectrumThe level axis and the Amplitude group are in dBm. There is no DC mark: a swept instrument has no local oscillator in the middle of the span. The VFO band does not turn red when the sweep is narrower than it.
The Receiver tabThe audio and zero-span groups are absent; in their place is an explanation that a power analyzer returns levels, not samples.
The Transmitter tabAn explanation: the transmitter in the app is for a HackRF; the tinySA Ultra's generator is not connected yet.
The Device tabThe Source group shows Sweep width, Sweep centre, Last point, Point step, the instrument line and the Reconnect button; there are no gain controls. There is no Record group, and no record button in the panel header either.

The level scale is remembered separately for each device type, so a scale in dBm is not mixed up with the dBFS scale of a HackRF or an RTL-SDR. Auto scale, the waterfall palettes, max hold, min hold, averaging, the reference trace and pause work as usual — see Traces and Scale, auto scale and waterfall.

When something goes wrong

What the app saysWhat to do
“tinySA not found”, “port … does not exist”Connect the instrument with a USB cable; the port should appear in Device Manager as “STMicroelectronics Virtual COM Port”.
“port … is busy”Close tinySA-App or the terminal that holds the port.
“the device on … is not a tinySA: …”Choose another port.
“tinySA on … did not answer Enter within … s: it sent nothing” or “… it sent N bytes without a prompt, beginning …”The instrument is busy — finishing a sweep (with a narrow RBW that takes minutes) — or the number keypad or a VERSION or TOUCH TEST screen is open on it: close it. Or the device on this port is not a tinySA. Wait and connect again.
“tinySA on … has been sending replies nobody asked for, … s in a row: …”It is still answering the commands of the previous connection: wait a few seconds and connect again. If that does not help, the instrument is sending data by itself (the remote screen may have been left on after tinySA-App): replug the USB cable or switch the instrument off and on.
“tinySA answered something other than “…”: no reply of its own in … s, …”The instrument is still answering older commands, or does not echo the command verbatim. Wait a few seconds and connect again.
“tinySA on … did not name its model: …”Without the model name the app does not know the instrument's level scale and does not guess it. Connect again.
“tinySA did not answer “rbw” within … s” while connectingThe instrument answered “version” and “info” but not “rbw”: this happens with the number keypad or a VERSION / TOUCH TEST screen open on it. Close it on the instrument and connect again.
“tinySA on … does not accept commands: it is still running the previous sweep”Wait for the sweep to finish; with a narrow RBW this takes minutes. If there is no sweep on the instrument, close the keypad or the screen that does not close by itself on it.
“tinySA did not start the sweep within … s (RBW …, … points)” or “tinySA: the sweep frame is cut short (…)”Most often the RBW is too narrow for this span: set RBW to auto, narrow the span or reduce the number of points. If USB dropped, reconnect the instrument.
“tinySA did not start a sweep within … s after ending the previous one itself”The instrument's screen was touched. If a very narrow RBW was chosen there, set a wider RBW or a narrower span; if the keypad or another screen was opened, close it. Then Reconnect.
“tinySA has not answered commands for … s after ending a sweep itself”Close the number keypad or the screen that does not close by itself on the instrument, take your finger off the screen and press Reconnect.
“tinySA set the attenuator to … dB instead of … dB”With the LNA on the instrument has no manual attenuator. Switch the LNA off if you need a manual attenuation.
“tinySA holds the attenuator at … dB, not … dB: it was changed outside the program”The attenuator was changed from the instrument's menu. Reconnect — the app sets what is chosen again, in the same order.
“tinySA did not say which attenuation it set”The app cannot check the attenuator against the instrument and shows it as unknown.

After a sweep failure the stream stops. To bring it back up, press Reconnect on the Device tab. If the instrument did not come back and the reconnect failed, there is a single window with the cause 0.9.48; before, a second one followed it — “tinySA is not running”.

Limits

  • There are no IQ samples, hence no audio or demodulation, no IQ recording, no zero span, no FPV video, no detection marks and no receiver spur passport. There are no record buttons in this mode.
  • The trace detector, the FFT window, N and VBW cannot be set: the spectrum row has already been reduced by the instrument.
  • The update rate is one row per sweep; with a narrow RBW that means seconds and minutes.
  • A sweep that is already running cannot be aborted — a limit of the instrument's firmware.
  • The original tinySA has not been tested on hardware; its frequency limits are taken from the firmware code, and the app has no RBW rule for it — the RBW of its screen sweep is shown.
  • The app does not use the tinySA Ultra's signal generator.
  • What is chosen in the app is not saved between its launches; what is changed from the instrument's menu while the app runs, the app does not see.
  • On the narrowest sweep with many points the wheel does not hold the frequency under the cursor (the points do not cover the whole sweep), and “one notch up — one notch down” does not put the sweep back exactly: the width is the same, but the start shifts by hertz or hundreds of hertz. Set round limits with the range fields.
  • According to the firmware code: if zero span is switched on by hand on the instrument itself while the app runs, all points are measured at one frequency, and the app labels them as a sweep; on a sweep with a step above ≈42.7 MHz (0–6000 MHz in 101 points) the instrument takes the maximum of a cell only from its middle.
  • The accuracy of the level is the accuracy of the tinySA's own calibration; the app adds nothing to it and does not verify it.

The common list of the app's limits is on the Limits and roadmap page.

The wiki describes version 0.9.49. Your app's version is shown in the Help menu, under About. Found a mistake? Write to us.