Test Audio Quality

The tools/test/audio directory contains support for testing objective audio quality parameters. The tests include gain, frequency response (FR), dynamic range (DR), and total harmonic distortion plus noise (THD+N). Definitions can be found in the Audio Engineering Society’s AES17 standard.

Install Octave or Matlab to execute the tests. Matlab is a commercial product by MathWorks. GNU Octave is a free software tool that is mostly compatible with Matlab. Install Octave and useful toolboxes for audio development by entering the following:

sudo apt install octave octave-signal octave-control octave-io

Start Octave from the correct directory for tests by entering the following:

cd tools/test/audio
octave --gui &

From the Octave shell, the test script for the IIR EQ component can be launched for all support sample formats:

help process_test

The test outputs a CSV format table with test results such as the following:

eqiir test result: Gain (dB)
in \ out,       16,       24,       32
      16,    -7.33,        x,        x
      24,        x,    -7.33,        x
      32,        x,        x,    -7.33

eqiir test result: Dynamic range (dB CCIR-RMS)
in \ out,       16,       24,       32
      16,    82.43,        x,        x
      24,        x,   130.40,        x
      32,        x,        x,   149.12

eqiir test result: Worst-case THD+N vs. frequency
in \ out,       16,       24,       32
      16,   -54.93,        x,        x
      24,        x,   -98.01,        x
      32,        x,        x,   -99.55

eqiir test result: Fails chirp/gain/DR/THD+N/FR
in \ out,             16,             24,             32
      16,      0/0/0/0/0,              x,              x
      24,              x,      0/0/0/0/0,              x
      32,              x,              x,      0/0/0/0/0

Number of passed tests = 15
Number of failed tests = 0
Number of non-applicable tests = 0
Number of skipped tests = 0

The script is currently set up for batch processing in the text console. To enable graphics plot windows, edit the script to the following:

diff --git a/tools/test/audio/process_test.m b/tools/test/audio/process_test.m
index 1a802b462..6ec6cda2b 100644
--- a/tools/test/audio/process_test.m
+++ b/tools/test/audio/process_test.m
@@ -48,8 +48,8 @@ t.full_test = 1;                       % 0 is quick check only, 1 is full set
 %  visibility set to to 0 only console text is seen. The plots are
 %  exported into plots directory in png format and can be viewed from
 %  there.
-t.plot_close_windows = 1;  % Workaround for visible windows if Octave hangs
-t.plot_visible = 'off';    % Use off for batch tests and on for interactive
+t.plot_close_windows = 0;  % Workaround for visible windows if Octave hangs
+t.plot_visible = 'on';     % Use off for batch tests and on for interactive
 t.files_delete = 1;        % Set to 0 to inspect the audio data files

 %% Prepare

When the example test for 24 bit to 24 bit output is executed with process_test(‘eqiir’, 24, 24), the following plots are generated. They are useful to visually gain more insight into the component’s characteristics.


Figure 145 Test results for EQ IIR component: Chirp spectrogram, THD+N frequency sweep, measured FR.

For new components development when the test set is suitable, such as the previous example “newcomp”, this script requires a small addition. A need exists to create a newcomp_run.sh script based on existing examples found in the same directory. Additional customization can also be done such as re-defining the test pass/fail criteria for EQ components.

diff --git a/tools/test/audio/process_test.m b/tools/test/audio/process_test.m
index fd9055cae..1a802b462 100644
--- a/tools/test/audio/process_test.m
+++ b/tools/test/audio/process_test.m
@@ -373,7 +373,7 @@ end
 function test = test_run_process(test, t)

 switch lower(test.comp)
-       case {'eqiir', 'eqfir', 'dcblock', 'volume', 'tdfb'}
+       case {'eqiir', 'eqfir', 'dcblock', 'volume', 'tdfb', 'newcomp'}
               test.ex = sprintf('./%s_run.sh', lower(test.comp));
                error('Unknown component');