siggen is a simple signal generator program, with an Ncurses based user interface, that can digitally
generate standard waveforms on the LINUX /dev/dsp device. 8 or 16 bit samples can be generated depending
on the hardware.
siggen allows two independent waveforms to be generated. In stereo the two signals appear on different
channels. In mono the two signals are digitally mixed onto the one mono channel.
The frequency is specified as an integer number of Hertz. Fractional Hertz frequencies are not supported.
Of course, only frequencies less than half the samplerate (number of samples/sec) are accurately
meaningful. Higher frequencies can be specified, but don't expect to hear them!
The waveforms that can be generated are:
sine A standard sine wave
cosine a sine wave with a 90 degree phase shift
square a standard square wave with a 50% mark space ratio
triangle
a ramp waveform with 'infinitely' fast flyback (:-) An ideal oscilloscope timebase signal.
sawtooth
shaped like equally spaced teeth on a saw (:-)
noise This is weak. All it consists of is one second of pseudo-randomly generated samples, played
repeatedly. I'd love to do proper white/pink noise, but I don't know enough, and I don't think the
structure of the program is conducive to accurate noise generation.
pulse A square waveform where the mark/space ratio (as a percentage) can be specified. The default value
is 10% (mark/space ratio of 1:9).
A lot of thought has gone into the algorithms for generating the waveforms. I believe the sin/cos wave
to be very pure (modulo your sound card :-), but I don't have access to a THD meter to measure it. For
best signal accuracy leave the gain setting at 100(%). The generator will then make the wave's peak value
fit the maximum digital values allowed. Use a mixer program to control the output volume, or an external
attenuator.
The gain factor option can be useful for simulating a signal that has been subject to clipping, by
specifying a gain of > 100%. In fact a trapezoid signal can be made by generating a clipped sawtooth
wave. The greater the gain, the closer the signal approaches a square wave (the rise and fall times
decrease).
siggen generates one seconds worth of 1 Hz samples at the specified samplerate, for each waveform, and
generates frequency F by circularly sampling every Fth sample. Each buffer fragment is generated for the
parameter(s) set at that moment. Buffer fragment sizes are set so that aprox. 10 fragments/sec are
generated. Changing a generation parameter, e.g. waveform, frequency, gain, will impact the next buffer
fragment generated, and hence changes appear to be almost immediate.
If your sounds periodically 'breaks' up with clicks or breaks, it is usually a sign that siggen is not
being scheduled sufficiently often. Either up the priority (see nice et al.), kill off other processes,
get a faster processor, or increase the number of audio buffer fragments that siggen uses. This last will
make siggen respond more sluggishly to changes in generation parameters. syslogd and crond are two
processes that I've found useful to kill off - YMMV.
Defaults
output to /dev/dsp, 22050 samples/sec, stereo if stereo card else mono, 16 bit samples if
possible, else 8 bit, 3 audio buffer fragments.