The IQ-Test is a method for measuring the rate of replay of a stereo (or multichannel) digital system. In essence it is a form of ‘wow and flutter’ measurement. The approach is based on general FM and comms theory.

We can represent a sinusoid using an expression of the form

This means we can define or measure the frequency via

For a waveform whose frequency also varies with time we can use this approach to measure the effective frequency during any short portion of time. Thus it gives us a way both to determine the overall value averaged over a long time (thus finding out if the system is playing consistently ‘slow’ or ‘fast’), and to detect how the frequency may alter as time passes. To do this we need to be able to determine the phase at each instant of interest.

A practical snag with single channel (i.e. mono) signals is that we need to examine the waveform over a duration long enough to be able to identify which portion of the sinusoid we have, and thus which phase it will have for any instant. However IQ modulation and demodulation (as widely used in modern communications) provides an easier approach. This is based on having

Since modern domestic audio generally provides at least two channels (for stereo) we can therefore use these to convey an IQ pair as the test waveform. To perform IQ-Test measurements I generated a set of LPCM Wave audio data files. These had various sample rates and bit-depth sizes. But in each case the left channel was used as the ‘I’ channel and the right as the ‘Q’ channel. i.e. The left channel was a sinewave and the right a cosine wave, sharing the same frequency and waveform peak amplitude.

In mathematical terms the above is a phasor representation and we are now regarding the sinusoid as a complex value

In principle we can repeatedly determine this for each successive pair of sampled instants. So for example if we are sampling the analogue waveforms at 192k samples/sec we can observe any variations in rate from sample to sample at that rate. In practice, though, it may be more useful to do measurements integrated over a number of samples since this will produce more accurate results with higher resolution – at the expense of not being able to examine brief variations that last for a time shorter than the chosen integration time. In practice we also need to examine each phase change between successive samples to watch for the situation where the arctan function passes though the fold. This causes a cyclic ‘jump’ in the value returned by the arctan function which we can detect and correct provided our sample rate is high enough to ensure that the normal change in phase between successive samples is much less than . However these are practical details which we just need to deal with as appropriate for a given measurement and data analysis.

Another practical choice is the selection of the frequency we choose for the IQ waveform. In theory we can choose any frequency we prefer for the waveform we wish to use. There is a good theoretical reason for wishing to choose the highest frequency we can. This is because the change, , scales with the choice of . i.e. if the replay rate is in error by, say, 0·01% then this will alter the output frequency by 0·01%. However 0·01% of 100Hz is 0·01Hz, whilst 0·01% of 10kHz is 1 Hz. Hence the higher the chosen IQ-Test waveform frequency, the bigger (and hence more easily observable) the change in replay frequency. This is one of the reasons why the J-Test tends to be carried out using high frequency waveforms to maximise the sensitivity of the measurement.

However choosing a high frequency has some drawbacks. One is that a test tone above, say, 10kHz had very little in common with normal music or speech. Another is that if there is a sudden gap or jump in the data replay sequence it might last longer than one cycle of the test waveform, and won’t be adequately observed. (This if for the same cyclic reason as we need to ‘stitch’ the arctan output to cope with the finite phase range it can report.) When using a nominally pure sinusoid as the test waveform it may also be useful to be able to arrange for the waveform to ‘cycle’ around a set sequence of sample values. This ensures that each cycle of the waveform is either identical to all the others (when undithered) or only differs from the others due to the addition of random dithering. This helps reduce unwanted background phase noise, etc.

To illustrate the use of the IQ-Test I can use the example of the measurements I carried out on the Halide Design USB-SPDIF Bridge. (If you wish the see the results of those measurements, click here.)

Note that choosing Left = I and Right = Q rather than the other way around is an arbitrary decision. From a theoretical point of view the method would work if done using Right = I and Left = Q. All that is required in practice is that the choice made is consistent between the test waveforms and the measurement analysis. If an error is made and the Left and Right channels are reversed during measurement then the only consequence is that all the computed phases, frequencies and times change sign. i.e. The outcome is negative values which have the correct magnitudes. So when examining any results this can be used as an indicator that such a reversal has accidentally occurred!

The computer I used as a source was a Shuttle running Ubuntu Linux. I used the standard ALSA system to control sound interfacing. In addition to the Shuttle’s own internal soundcard I made two USB connections. One direct to the USB interface of a DACMagic. The other to the Halide Bridge which then fed its SPDIF output to the DACMagic. To define the interface to the USB devices I put the following into my

`.asoundrc`

```
pcm.!default {
```

type plug

slave {

pcm "hw:2"

channels 2

format S24_3LE

}

}

pcm.plug1 {

type plug

slave {

pcm "hw:1"

channels 2

}

}

pcm.plug0 {

type plug

slave {

pcm "hw:0,1"

channels 2

}

}

From the order in which the devices are recognised at startup,

`"hw:0,1"`

`"hw:1"`

`"hw:2"`

`pcm.!default`

`S24_3LE`

Under normal circumstances I tend to use two programs for playing music files or streaming net radio, etc. These are AlsaPlayer and Audacious. Unfortunately, both of these have limitations which ruled them out as suitable for my tests on the Halide Bridge. AlsaPlayer refused to play any files with sample rates above 48k. Audacious – despite having a setting for 24bit output – sent 24bit sound as truncated 16bit values. Hence neither were suitable for tests involving 24bit files and rates above 48k. So instead I used the simple ‘aplay’ command which is part of the normal ALSA package. This played LPCM files of any rate I tried, and gave bit-perfect output for both 16bit and 24bit as appropriate. Given the setup I have described I can play an LPCM Wave file named, say,

`fred.wav`

`aplay fred.wav`

`aplay -D plug1 fred.wav`

For the measurements I decided to use test files which had a simple integer number of sample (pairs) per cycle. This meant that when using undithered sample values I could ensure the waveform sample sequence was perfectly repetitive with exactly the same defined shape for each cycle. Although this means an undithered waveform isn’t necessarily a totally pure sinusoid (pair) it means that any error is cyclic and repeats precisely cycle-by-cycle. Hence if phase measurements are made over a time interval of an integer number of cycles any phase errors within a single cycle become null. I also decided to use a number of samples per cycle that produced an output IQ waveform frequency that was an integer multiple of 50Hz. This was combined with a decision to use integration times that were one cycle at 50Hz – i.e. 20 ms. The aim here was to try and filter any effects due to residual UK mains hum and reduce their effect on the results. Subsequent experiments showed that for the system I was using this wasn’t actually a problem. But it may be in some cases. The table below lists various possible choices that meet the requirements I decided to apply.

of samples/cycle gives a frequency that is a multiple of 50Hz.

vals/cycle | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |

44·1k | 22·05 | 14·7 | - | - | 7·35 | 6·3 | - | 4·9 | - |

48k | 24 | 16 | 12 | 9·6 | 8 | - | 6 | - | 4·8 |

12 | 14 | 15 | 16 | 18 | 20 | 21 | |||

44·1k | - | 3·15 | - | - | 2·45 | - | 2·1 | ||

48k | 4 | - | 3·2 | 3 | - | 2·4 | - |

In practice I decided to choose 14 samples per cycle (3,150 Hz) for the 44·1k sample rate and 15 samples per cycle (3,200 Hz) for the 48k sample rate. I also decided to use the same frequencies for the multiples of these rates. So, for example, that meant using 30 samples per cycle for 96k sample rate to obtain the same nominal IQ wave frequency as 48k.

The recordings of the analogue output of the DAC were made at a sample rate of 192k (24 bit samples) in every case. This was to minimise the amount of phase change between successive sample pairs and get as much data as possible in case this eased analysis. In practice a lower sample rate may be fine, but I have not explored that at present.

Having experimented with other choices, the final measurements used a 20 ms integration time and the 14/15 cycle rates. In practice, almost any choice of settings and rates could be used. For example, for some purposes a much higher test frequency could be chosen for the IQ waveforms – thus giving higher sensitivity to short-term timing errors. Alternatively much lower frequencies – say around a few hundred Hz – could be chosen if it was felt better to use waveforms with a frequency more representative of sustained music and the interest was in long term variations.

Jim Lesurf

4th Mar 2011