The generator is a DDS (Direct Digital Synthesis) engine: it computes the signal one sample at a time, in full numeric precision, in the normalised range [−1, +1]. Synthesis is kept mathematically ideal - dither and quantization happen only at the very last step before the DAC - so the same waveform also serves as the bit-exact reference for deconvolution measurements and file export.
All periodic waveforms are driven by a 64-bit phase accumulator φₐ: an unsigned integer representing the phase as a fraction of one period, 0 ... 2⁶⁴−1 ≙ 0 ... 2π. For an output frequency f at sample rate fs, each sample advances the phase by a fixed increment[1]:
This integer arithmetic gives three properties that a floating-point phase cannot match:
The sine of the accumulator phase is computed by splitting φₐ into a coarse table index and a fine remainder:
The two parts are recombined with the angle-addition identity:
where sin Δθ and cos Δθ are short Taylor series of the small remainder, truncated at the 5th order:
With Δθ bounded by one table step (≈ 1.53·10⁻³ rad), the truncation error of (5) is of order Δθ⁷/7! ≈ 10⁻²⁴ - far below the precision of the arithmetic itself. The kernel is, for every measurement purpose, an exact sine at a fraction of the computational cost; the harmonic purity of the generated tone is therefore limited by the DAC, never by the synthesis.
You set the output level in Vrms. Internally one linear factor maps the unit-amplitude waveform to the normalised DAC domain:
where Vfs is the calibrated DAC full-scale RMS voltage (set once in the Calibrate DAC dialog; a recalibration re-scales a running generator immediately) and ρ is the RMS value of the unit-amplitude waveform - analytic for every form, so the requested Vrms holds regardless of wave shape:
| Form | ρ (RMS at unit amplitude) |
|---|---|
| Sine, sweeps | 1/√2 |
| Triangle (any duty) | 1/√3 |
| Rectangle (any duty) | 1 |
| White noise (Gaussian, σ = 1) | 1 |
| Pink noise | 1/√17 |
| Pink noise linear | 1/√51 |
| Dual tone, weights w₁ / w₂ | √((w₁² + w₂²)/2) |
Both map the phase fraction φₐ/2³² ∈ [0, 1) piecewise-linearly, so the output is exact by construction:
(Both use the phase fraction φₐ/2⁶⁴ ∈ [0, 1).)
The duty threshold lives in continuous phase, but a rectangle's output is a hard +1 -> −1 step, and a step can only fall on a sample. So the duty a rectangle actually emits is a whole number of samples out of the period, and the finest duty step is one sample:
where f is the output frequency and fs the sample rate. A 10 kHz pulse at 384 kHz has 38.4 samples per period, so the smallest duty step is ≈ 1/38.4 ≈ 2.6 %, and a typed duty snaps to the nearest achievable multiple. The generator pane shows the emitted (snapped) duty in brackets. The lower the frequency relative to the sample rate, the finer the duty resolution.
The triangle is different: it has no step, only a change of slope at the corner, and the samples on either side ride the exact ramps - so the corner's position (and hence the duty) is represented sub-sample, with no quantisation. A triangle's duty is exact at any frequency.
Two independent phase accumulators advance in lock-step; the output is
with per-tone weights w₁, w₂ (the amplitude-split percentages / 100). The tones are uncorrelated, so the combined RMS is √((w₁² + w₂²)/2) - and the amplitude factor (6) is recomputed whenever the split changes, keeping the combined level equal to the dialled Vrms. Both frequencies are individually trimmable while running - the FFT pane's two frequency-lock loops use exactly that during intermodulation measurements.
A sweep's instantaneous frequency is a function of time, so the phase is integrated explicitly instead of using the fixed increment (1):
This form subtracts the measured harmonic distortion of the playback chain from the generated signal, so the device under test receives a cleaner stimulus than the DAC alone can produce. The correction data - each harmonic's relative amplitude and phase - comes from a coherently-averaged FFT measurement of the loop.
The synthesis chain stays in full precision until the playback engine converts to the device's integer PCM format. Immediately before rounding - the only place where it is meaningful - optional TPDF dither[5] (triangular probability density, ±1 LSB at the target bit depth) is added. Dither decorrelates the quantization error from the signal: instead of harmonically-related distortion products, quantization contributes only a flat, benign noise floor. Exports and the deconvolution reference are taken before this stage, so they remain the ideal waveform.
Dither depth is a number of bits, but a spectrum shows a level, not a bit count - so the generator lets you set and read the depth either as bits or directly in dBV, one value seen two ways. The conversion is the physics of the TPDF noise itself: N-bit dither has an RMS of 2−(N−1)/√6 relative to the peak full scale, so its absolute level is
with VFS,pk the DAC's peak full-scale voltage. The reference is the peak full scale because the dither lives in the peak-normalised sample - using the RMS full scale would read about 3 dB low. Full scale is a per-range, calibrated value, so the dBV shifts with the output range and card calibration exactly as the real noise floor does.
Nothing else enters the conversion: the stated dBV is the dither's true physical level, so it depends on no FFT setting. The analyser's integrated noise metrics divide by the analysis window's noise bandwidth (NENBW - see the FFT chapter), so they read that same true level with any window: type −100 dBV and the measured noise reads −100 dBV whether the FFT runs a rectangular, Hann or flat-top window. (The raw spectrum bins themselves still sit 10·log₁₀(NENBW) above the true noise density - that is the window physics the metrics correct for - so check a dither setting against the noise readout, not against a single bin's height.)
When you save the generator output to a file (Save to... on the generator pane), the samples are written straight from the synthesis math - the same exact waveform the kernels above produce, with no analogue stage anywhere in the path. There is no DAC, no analogue reconstruction filter, no amplifier and no cabling, so the file carries none of the distortion, noise or frequency-response error that a real playback chain would add: it is a mathematically ideal signal, limited only by the chosen sample format. (Dither, if enabled, is the one deliberate addition - and even that is a flat, benign noise floor, not distortion.)
That makes a saved file a known-perfect reference: feed it to another instrument or DUT and any imperfection you then measure belongs to that device, not to the source. It is also how the frequency-response sweep keeps its deconvolution honest - the reference it divides by is the exact emitted sweep, not a re-measured copy.
Every parameter is adjustable while the generator runs: frequency and amplitude (phase-continuous, see above), duty cycles, sweep bounds and fades, dual-tone split, dither depth, DAC recalibration. Playback start follows the sequence described in the audio-backend chapter: warm-up (with sweep rewind), hardware-buffer pre-fill, then the "ready" signal that measurement workers wait for.