17.10.2020

Audio Quality Measurement

Theoretical Overview

We can generate a 500Hz signal by following formula:

sin(x * 2 * 500)

Result:
alt

We can also generate a noise in interval <-1, -1>:

rand(-0.1, 0.1)

which produces curve:
alt

To calculate RMS of such signals we use the formula:

Xrms = sqrt((1 / n) * (X1 ^ 2 + X2 ^ 2 + ... + Xn ^ 2))

The ratio of both signals is by following formula:

20 * log10(SignalRms / NoiseRms) [dB]

Measurement

Your oscilloscope can measure such signal with a noise present:
alt

This has been simulated by formula:

sin(x * 2 * 500) + rand(-0.1, 0.1)

But real measured signal looks like this (with red ideal wave):
alt
HiFiBerry DAC+ frequency response

Where a zoom looks like this:

alt
HiFiBerry DAC+ frequency response zoomed

  • Blue - measured signal
  • Red - ideal sine wave

Calculation

For theoretical wave sin(x * 2 * 500) + rand(-0.1, 0.1) we could subtract the exact part sin(x * 2 * 500) and will get rand(-0.1, 0.1).
With formulas will get:

SignalRms = 0.70681
SignalNoise = 0.05773
20 * log10(SignalRms / NoiseRms) = 20 * log10(0.70681 / 0.05773) = 21.75779 dB

Real World Calculation

For real measured wave we must find the exact ideal wave. Since we know the frequency (set on signal generator or played exact wav with given frequency) we only must correct the phase shift and amplitude. See above the red curve which is such ideal curve going through the measured one. After subtraction we get the noise curve.
For HIFIBerry Dac+ above it is:

RMS[B] = 0.13295
RMS[A] = 0.13283
σ[A,B] = sqrt((1 / N) * Σ(A-B)^2) = 0.00122
SNR[A / B] = 20*log(RMS[B] / σ) = 40.74621 dB  

Note: the value doesn't correspond with rated value but this is a topic for another article