An arrow that turns by each sample, marked once per sample. Watch the samples slow down again once passes .
One turn per sample, on a wheel
Marks show where the arrow e^{jΩn} points at samples n = 0 to 7. The stems are their horizontal positions, cos(Ωn).
Ω = 0: the arrow does not turn. Every mark sits at 1, and every sample is 1.
Describe this picture
Two panels. The first is a wheel, a unit circle with eight numbered dots that mark where the arrow points at samples to 7, an arrow to dot 1, and an arc from dot 0 to dot 1 labelled . When several marks sit on one spot, they share one label beside it, such as “0, 2, 4, 6”, or “0 to 7” when all eight meet. The second panel holds the stems , the horizontal positions of the dots. The readouts are and the same frequency in .
The clip lasts 15 s and holds at five values of , 0, , , and , with a caption at each and none between. At the second readout shows while the first shows . When the clip ends, mark 1 becomes a handle: dragging it round the wheel, or the arrow keys, sets from 0 to , and the caption shows only at the five held values.
An arrow, looked at once per sample
Sinusoids (3.2) gave you the digital frequency in rad/sample, and showed that and give the same samples. Sampling & aliasing (10.1) used that to find where a tone lands in hertz. This page makes an axis, and the axis turns out to be a circle.
Start from the arrow of Complex exponentials & phasors (3.4). Look at it once per sample, at :
Each sample number, the arrow has turned further. Its horizontal position is the sample, , which is the reading you used in Fourier series coefficients (7.2). So is not mysterious: it is the turn per sample, in radians.
One turn per sample, on a wheel
The picture at the top of the page draws this arrow on a wheel, once per sample. At the arrow does not turn: every mark sits at 1, and every sample is 1. At rad/sample it turns an eighth of a turn per sample. Eight samples make one full turn, and the stems trace one cycle every 8 samples.
At it turns half a turn per sample. The marks alternate between 1 and −1, and so do the samples: nothing sampled can change faster. Watch the stems here. They flip between the top and the bottom of their range at every sample, which is the fastest a sequence can move.
Then keeps growing, and the stems slow down again. At , three quarters of a turn forward lands where a quarter turn back would. The samples are those of , and cos makes them the same as . At a whole turn per sample looks like no turn. Marks and samples are back where put them: the frequency axis is a circle.
A clock’s hand photographed once an hour makes the same point. Eleven hours forward looks like one hour back.
When the clip ends, mark 1 becomes a handle. Drag it round the wheel, or use the arrow keys, to set from 0 to . The angle keeps counting past , so you can follow the arrow all the way round. Try and then . Notice that the stems are identical, even though the marks are at mirrored places on the wheel.
Why the axis is a circle
Put the observation into symbols. Adding to adds a whole turn per sample, and a whole turn changes nothing:
because for every whole . So and are one frequency. Move forward by and you are where you began, which is what a circle does. I call the stretch from to the principal interval. It holds every distinct frequency once, half-open at the bottom: , the same convention as the angle of a complex number.
Why is the fastest? A forward turn of between and lands where a backward turn of , shorter than , would land. The largest turn that is not better described as a shorter one the other way is half a turn, , where . At the other end, is no turn, so for every . Low frequencies sit near 0 and high ones near .
For the real signal there is one more step. Cosine is even, so and give the same samples, which is why the 1.5π clip frame matches 0.5π.
Every function of that is built from samples repeats every , so a page draws one turn, , and that shows all of it. Here is the same fact in the terms of The sampling theorem (10.2). A shift by hertz is a shift by in , since . The copies of a sampled spectrum, which sit every in hertz, therefore sit every in rad/sample.
Four rulers for one frequency
A frequency has four names in common use, and only one of them needs the sample rate. You have two already: in rad/sample, and in hertz. The other two are rescalings of .
The first is cycles per sample, . The fastest sequence turns half a cycle per sample, so runs from 0 to 0.5. The second is the normalised frequency of SciPy and MATLAB, , which runs from 0 to 1 and puts 1 at the Nyquist frequency of 10.1. It is the same quantity as written in units of rad/sample. Hertz needs : .
The normalised scale is the one that trips people up. In SciPy, butter(4, 0.25) asks for a cutoff of rad/sample, not 0.25 cycles per sample.
The next picture stacks the four scales, with one marker across them all. Watch which ruler changes when the sample rate does.
One frequency, four scales
Only the hertz ruler depends on the sample rate f_s.
0.25π rad/sample is 0.125 cycles per sample, 0.25 on SciPy's scale, and 1000 Hz when f_s = 8 kHz.
Describe this picture
Four stacked rulers, each with its own title: in rad/sample, in cycles/sample, the SciPy/MATLAB scale in units of rad/sample, and in Hz at kHz. A vertical marker with a downward triangle on top crosses all four. Four readouts name the same frequency as , , normalised and .
The clip is 14 s long, with a caption at each hold and none between. The marker holds at , and with kHz. Then it returns to while eases from 8 kHz to 48 kHz: the hertz labels and the hertz ruler’s title change in place, and the last caption reads “The same 0.25π rad/sample at f_s = 48 kHz is 6000 Hz. The first three scales did not move; only hertz needs f_s.” When the clip ends, the marker becomes a handle: dragging it, or the arrow keys, chooses a frequency from 0 to at kHz, and the caption stays blank except at .
The clip begins with the marker at and kHz: 0.125 cycles per sample, 0.25 on SciPy’s scale, and 1000 Hz. The marker then moves to , a quarter cycle per sample, 0.5 on SciPy’s scale and 2000 Hz at 8 kHz. Then it moves to , the fastest: half a cycle per sample, 1 on SciPy’s scale, and Hz, the Nyquist frequency of 10.1.
Then the marker returns to and eases from 8 kHz to 48 kHz. Watch the rulers. The hertz labels and the hertz ruler’s title change in place, and nothing else moves: the same rad/sample is now 6000 Hz.
When the clip ends, drag the marker, or use the arrow keys, to choose a frequency from 0 to at kHz.
In SciPy, freqz(b, a) returns from 0 to , while freqz(b, a, fs=8000) returns hertz from 0 to 4000. Some analysers draw 0 to instead, which is one full turn with the top half holding the negative frequencies. Check which one a plot uses before you read a number off it.
Worked example
- Concert A. 440 Hz at kHz: rad/sample . Then and the normalised value is 0.110. Since , the samples repeat every 200 samples, as 3.2 found.
- 1 kHz. At 8 kHz: rad/sample, , normalised 0.25. At 48 kHz: rad/sample , , normalised 0.04167. And at 48 kHz is 6000 Hz.
- Past . 7 kHz at 8 kHz is , the same samples as and, since cosine is even, as : 1 kHz, the fold of 10.1.
- Samples. , and
- SciPy.
butter(4, 0.25)andbutter(4, 1000, fs=8000)return identical coefficients. - Copies. The signal of 10.2, reaching 4 kHz, sampled at kHz reaches , with copies centred at .
Where you’ll meet this
Every spectrum in the next chapters is drawn against on . The DTFT (12.2) builds the spectrum of a sequence on this axis. The DFT (13.2) samples it at . Filter specifications (18.1) give cutoffs in the normalised scale, so the trap above comes back there.
The maths behind it · rotation matrices
Turning a point by is multiplying it by a 2×2 rotation matrix. Doing it times is the matrix to the power , a turn by . A turn by is the same matrix, which is the wheel’s whole story.
The maths behind it · circular statistics
Data on a circle, such as wind directions or times of day, need circular statistics: the average of 359° and 1° is 0°, not 180°. Digital frequency is circular data.
Reference card
| Quantity | Formula | Notes |
|---|---|---|
| Digital frequency | rad/sample (3.2) | |
| One arrow per sample | ; is its horizontal position | turns each sample |
| Same samples | and , whole | the axis is a circle |
| Principal interval | half-open at the bottom | |
| Slowest, fastest | : constant; : | high frequencies sit near |
| Cycles per sample | fastest 0.5 | |
| SciPy/MATLAB normalised | 1 is Nyquist; with fs= SciPy uses hertz | |
| Hertz | the only scale that needs | |
| Spectra of samples | repeat every in | every in hertz (10.2) |