Learn · October 2026

How calibration works

What bias, dark and flat frames take back off a raw frame, measured on my Seestar S30 Pro, and how masters can be built from your light frames alone. Whether you need to shoot any, and how, is in the calibration guide.

How sure each claim is: the markers
measured
a number from my own frames
illustrative
made-up numbers that show the idea
prototyped
works in my test bench, not in the app yet
planned
not built yet
Every section is open; close what you've read.
1 · One pixelEvery pixel sits on a floor of about 1,112 before any light arrives.
one pixel · one 10 s sub · S30 Pro · not to scale 0 ADU Read noise±17 ADU (0.89 e⁻) on every read Starlightonly where a star lands Sky glowdepends on your sky and filter Dark current3–6 e⁻ in 10 s at 29–33 °C≈60–120 ADU; doubles every ≈4.3 °C Bias pedestal≈1,112 ADU on every frame
Figure 1. What one pixel adds up in one 10-second sub (a single exposure), from bias and dark frames I shot on my S30 Pro over Alpaca (the network interface desktop astronomy programs use; see the guide) (telephoto camera, firmware 8.46, gain 200) measured. ADU are the camera's raw counting units; e⁻ are electrons. The sky level varies from night to night, so it carries no number. One catch: the camera's black-level clamp takes the average dark current back off, so a dark frame looks just as black at 300 s as at 1 s. You see the dark current only as extra noise and warm pixels. At the other end there's no gentle roll-off: on the S30, S30 Pro and S50, every color stays within about 5 % of a straight line up to 90 % of its clip level, then clips measured.
2 · The four framesSubtract what the camera added; divide out what the optics dimmed.
calibrated=light−bias−darkflat\text{calibrated} = \dfrac{\text{light} - \text{bias} - \text{dark}}{\text{flat}}

Subtract what the camera added; divide out what the optics dimmed. The bias and dark masters are subtracted, and the flat, normalized so its average is 1, divides what is left.

bias dark current light light each pixel gets Light framewhat you shot centeredge − Bias masterthe offset − Dark masterthe heat signal ÷ Flatnormalized to 1 1.000.80 = Calibratedlight only centeredge
Figure 2. Two pixels, one at the center and one at the edge, through textbook calibration illustrative. Subtracting the bias and dark masters leaves only light, but the edge pixel got 20 % less of it. Dividing by the flat evens them out. The flat has its own bias taken off before it's normalized, or the division would scale the offset too.
3 · Synthetic calibrationBuild the masters from your lights, with no dark frames shot.
Your light frames, nothing elsemy test: 653 subs, 10 s, gain 200, 15–35 °C A fit for every pixel (the model below)what grows with temperature is dark;the rest is bias A synthetic bias + dark masterfor this sub's temperature T and exposure t Subtracted from that subno dark frames shot stars and sky move between subs;the sensor's own pattern stays put tonight's T and t
rawp=1112+bp+d20,p⋅2(T−20)/5.8⋅t10 s+fp S\begin{aligned} \text{raw}_p &= 1112 + b_p \\ &\quad + d_{20,p}\cdot 2^{(T-20)/5.8}\cdot\frac{t}{10\,\mathrm{s}} \\ &\quad + f_p\,S \end{aligned}
11121112
the bias pedestal, in ADU
bpb_p
pixel pp's own bias pattern
d20,pd_{20,p}
pixel pp's dark signal per 10 s at 20 °C
T, tT,\ t
the sub's sensor temperature (°C) and exposure
fp, Sf_p,\ S
pixel pp's flat and the sky; the prototype fixes fp=1f_p = 1
Figure 3. Building masters from the lights themselves, as my workbench prototype does it prototyped. It's not in the SkyCruncher app yet planned. The prototype sets the flat to 1, assuming the subs arrive already flattened. My measurements say that isn't safe: corners read from 0.93 to 1.05 of the center across units measured, so a flat built from the lights is part of the plan. On M 33 it halved the background unevenness (1.48 to 0.74 ADU). On M 27 at 33 °C it made star positions slightly worse, for reasons not yet known. The 5.8 °C doubling in the model and the 4.3 °C from my darks don't agree yet.
4 · SourcesWhere every number on this page comes from.

Every number measured over Alpaca comes from one Seestar S30 Pro (firmware 8.46, app 3.3.2, Alpaca server 1.2.0-3). This page says what I measured on my unit, not what ZWO's firmware does in general.

  • Bias pedestal, read noise, dark current and its doubling, hot pixels, the light-tight Dark filter, the clamp: bias and dark frames I shot over Alpaca at my desk on September 29, 2026 (read noise 17.2 ADU, 0.89 e⁻; dark current 0.33 to 0.62 e⁻/s at 29.3 to 33.2 °C; 23,988 hot pixels in a 10 s dark at 29.7 °C) measured.
  • Clip level and no roll-off: star peaks against Gaia catalog brightnesses on an S30, an S30 Pro and an S50 measured.
  • Corners against the center (0.93 to 1.05): my unit profiles of several Seestars measured.
  • Synthetic masters: my workbench prototype on M 33 (background unevenness 1.48 to 0.74 ADU) and M 27 prototyped; SkyCruncher's engine has a place for it, not the code planned.
  • "Calibration frames are always nice to have, not need to have": a SkyCruncher engine design decision, September 11, 2026.