Check Recorded Frequency

Check Recorded Frequency compares the recorded audio file against a golden frequencies. Most useful in tests, the script will perform frequency analysis of the audio sink and compare against frequencies the source had played.

Prerequisites

Make sure these packages are included for testing.

pip install numpy six

NOTE: ChromeOS has already had these packages.

This scripts depends on audio_data.py, audio_analysis.py and audio_quality_measurement.py

Build

Build in chroot

(inside the cros chroot) emerge-${BOARD} audiotest

The scripts will be in /build/${BOARD}/usr/bin/*.py.

Deploy onto DUT

cros deploy ${DUT_IP} audiotest

The scripts will be in /usr/bin/*.py.

Usage

check_recorded_frequency.py [-h]
  -g GOLDEN_FREQUENCIES [GOLDEN_FREQUENCIES ...]
  -t TEST_FILE
  [-f {S32_LE,S16_LE}] [-c CHANNEL] [-r RATE]
  -m CHANNEL_MAP [CHANNEL_MAP ...]
  ...OTHER_FLAGS...

NOTE: If the requirements are satistifed, this script can run on workstation, DUT or Chameleon.

Important Options

  • -h, --help
    • show this help message and exit
  • -g GOLDEN_FREQUENCIES [GOLDEN_FREQUENCIES ...], --golden_frequencies GOLDEN_FREQUENCIES [GOLDEN_FREQUENCIES ...]
    • A list of float that describe the frequency of each channel. Currently only one frequency is supported in for each channel.
  • -t TEST_FILE, --test_file TEST_FILE
    • Path to test audio file, the recorded audio.
  • -f {S32_LE,S16_LE}, --sample_format {S32_LE,S16_LE}
    • Format of test file. (default: S16_LE)
  • -c CHANNEL, --channel CHANNEL
    • Number of channels in the test file. (default: 2)
  • -r RATE, --rate RATE
    • Rate of of the test file. Usually 48000 or 44100. (default: 48000)
  • -m CHANNEL_MAP [CHANNEL_MAP ...], --channel_map CHANNEL_MAP [CHANNEL_MAP ...]
    • A list of float, how the test channel maps to the golden channels. ie. [1, 0, None, None] means the first channel of test file maps to second channel of golden frequency, and vice versa for second channel of test file.

* for other arguments check the help message.

Results

Returns the frequencies and magnitude of the frequencies detected. Return non-zero error code when frequencies in test file mismatch against golden frequencies.

Example

Assuming the source of audio is playing [2000, 2000] golden frequencies (2000 in first channel, and 2000 is second channel). The recorded audio at /tmp/recorded.raw, with 8 channel, 48000 rate, and S32_LE audio format.

If the channel maps between source and sink:

source #0 -> sink #0         X -> sink #4
source #1 -> sink #1         X -> sink #5
        X -> sink #2         X -> sink #6
        X -> sink #3         X -> sink #7

* where X means no source/sink

The command to call this script will be:

> check_recorded_frequency.py -g 2000 2000 -t /tmp/recorded.raw -r 48000 \
  -f S32_LE -c 8 -m 0 1
[(1999.9620982413583, 4.799658508679272e-06), (1999.9620982413583, 4.800869941991319e-06)]

The script conclude that first channel has one frequency: 1999.96Hz at 4.7997 magnitude; second channel has one frequency: 1999.96Hz at 4.8009 magnitude.

Since there is no error, the golden frequency and the recorded audio matched.

Notes on running on workstation

The script also depends on audio_data.py, audio_analysis.py and audio_quality_measurement.py.

Make sure these scripts can be imported by check_recorded_frequency.py.

In particular, if you run outside of platform/audiotest/script directory, set PYTHONPATH with export PYTHONPATH="$PYTHONPATH:~/chromiumos/src/platform/audiotest/script"

Converting WAV audio file to RAW audio file

sox -t wav audio.wav -t raw -r 48000 -c 8 -e signed -b 32 audio.raw

Source of scripts

The source of scripts are:

  • check_recorded_frequency.py is modified from third_party/autotest/files/client/cros/chameleon/audio_test_utils.py
    • only the function check_recorded_frequency and longest_common_subsequence is kept.
  • audio_data.py is unchanged from third_party/autotest/files/client/cros/audio/audio_data.py
  • audio_analysis.py is unchanged from third_party/autotest/files/client/cros/audio/audio_analysis.py
  • audio_quality_measurement.py is unchanged from third_party/autotest/files/client/cros/audio/audio_quality_measurement.py

Copied audio_quality_measurement.py, audio_data.py, and audio_analysis.py from third_party/autotest/files/client/cros/audio/

cd ~/chromiumos/src/third_party/autotest/files/client/cros/audio/
cp audio_quality_measurement.py audio_data.py audio_analysis.py  ~/chromiumos/src/platform/audiotest/script/

Problems and Solution

emerge-${BOARD} audiotest with error: Local branch for '/mnt/host/source/src/third_party/chromiumos-overlay' is out of sync.

Sync the ebuild files.

cd ~/chromiumos/src/third_party/chromiumos-overlay/
git checkout main

emerge-${BOARD} audiotest with error: /usr/bin/install: omitting directory '/mnt/host/source/src/platform/audiotest/script/__pycache__'

You might have accidentally run some file on workstation.

cd ~/chromiumos/src/platform/audiotest/script/
rm -rf __pycache__/