From 66bec923f80f6693f9ce17f26e3a9593d24cb5db Mon Sep 17 00:00:00 2001 From: Erik Norvell Date: Thu, 14 Dec 2023 13:21:06 +0100 Subject: [PATCH] Added MLD tool --- scripts/parse_mld.py | 29 +++++++++++++++++++++ scripts/pyaudio3dtools/audioarray.py | 36 ++++++++++++++++++++++++++- scripts/tools/Linux/mld | Bin 0 -> 22744 bytes scripts/tools/Win32/mld.exe | 3 +++ tests/cmp_pcm.py | 10 ++++++-- tests/conftest.py | 14 +++++++++++ 6 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 scripts/parse_mld.py create mode 100644 scripts/tools/Linux/mld create mode 100644 scripts/tools/Win32/mld.exe diff --git a/scripts/parse_mld.py b/scripts/parse_mld.py new file mode 100644 index 0000000000..2a60e176e3 --- /dev/null +++ b/scripts/parse_mld.py @@ -0,0 +1,29 @@ +#!/usr/bin/python3 + +import argparse +import re + + +# Main routine +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Parse HTML report to extract MLD values') + parser.add_argument('html_report',type=str,help='HTML report input file, e.g. report.html') + parser.add_argument('csv_file',type=str,help='Output CSV file, e.g. output.csv') + args = parser.parse_args() + html_report = args.html_report + csv_file = args.csv_file + + mld = {} + + with open(html_report,'r') as infile: + for line in infile.readlines(): + if "col-name" in line: + test_name = re.search('\[(.*)\]', line).group(1) + mld[test_name] = 0.0 + if "MLD" in line: + mld_val = float(line.split()[1]) + mld[test_name] = mld_val + + with open(csv_file,'w') as outfile: + for test_name in mld: + outfile.write(test_name + ';' + str(mld[test_name])+'\n') \ No newline at end of file diff --git a/scripts/pyaudio3dtools/audioarray.py b/scripts/pyaudio3dtools/audioarray.py index 740c40c3c6..280b7e9aa4 100644 --- a/scripts/pyaudio3dtools/audioarray.py +++ b/scripts/pyaudio3dtools/audioarray.py @@ -37,6 +37,11 @@ from typing import Callable, Iterable, Optional, Tuple import numpy as np import multiprocessing as mp import scipy.signal as sig +import scipy.io.wavfile as wavfile +import subprocess +import platform +import tempfile +from pathlib import Path main_logger = logging.getLogger("__main__") logger = main_logger.getChild(__name__) @@ -221,7 +226,7 @@ def cut(x: np.ndarray, limits: Tuple[int, int]) -> np.ndarray: return y -def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool = True) -> dict: +def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool = True, get_mld: bool = False) -> dict: """Compare two audio arrays Parameters @@ -232,6 +237,10 @@ def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool = True) Input test array fs: int Input sampling rate in Hz + per_frame: bool + Compute difference per frame (default True) + get_mld: bool + Run MLD tool if there is a difference between the signals (default False) Returns ------- @@ -251,6 +260,7 @@ def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool = True) "first_diff_pos_sample": -1, "first_diff_pos_channel": -1, "first_diff_pos_frame": -1, + "MLD": 0 if get_mld else None, } if per_frame: result["max_abs_diff_pos_frame"] = 0 @@ -303,6 +313,30 @@ def compare(ref: np.ndarray, test: np.ndarray, fs: int, per_frame: bool = True) result["nframes_diff"] = nframes_diff result["nframes_diff_percentage"] = nframes_diff_percentage + if get_mld: + + mld_max = 0 + toolsdir = Path(__file__).parent.parent.joinpath("tools") + if platform.system() == "Windows": + mld = toolsdir.joinpath( "Win32").joinpath("mld.exe" ) + elif platform.system() in ["Linux", "Darwin"]: + mld = toolsdir.joinpath(platform.system()).joinpath( "mld" ) + else: + assert False, f"MLD tool not available for {platform.system()}" + + with tempfile.TemporaryDirectory() as tmpdir: + for i in range(nchannels): + tmpfile_ref = Path(tmpdir).joinpath(f"ref_ch{i+1}.wav") + tmpfile_test = Path(tmpdir).joinpath(f"test_ch{i+1}.wav") + r48 = resample(ref[:,i], fs, 48000); + t48 = resample(test[:,i], fs, 48000); + wavfile.write(str(tmpfile_ref), 48000, r48) + wavfile.write(str(tmpfile_test), 48000, t48) + out = subprocess.check_output([mld,tmpfile_ref,tmpfile_test]) + mld_max = max(mld_max, float(out.split()[3])) + + result["MLD"] = mld_max + return result diff --git a/scripts/tools/Linux/mld b/scripts/tools/Linux/mld new file mode 100644 index 0000000000000000000000000000000000000000..520d59be0ed27b998dc9eaf4ea4d56372e71293a GIT binary patch literal 22744 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 (int, str): +def cmp_pcm(file1, file2, out_config, fs, get_mld = False) -> (int, str): """ Compare 2 PCM files for bitexactness """ @@ -34,6 +34,8 @@ def cmp_pcm(file1, file2, out_config, fs) -> (int, str): s1, _ = pyaudio3dtools.audiofile.readfile(file1, nchannels, fs, outdtype=np.int16) s2, _ = pyaudio3dtools.audiofile.readfile(file2, nchannels, fs, outdtype=np.int16) + nchannels = s1.shape[1] # In case of wav input, override the nchannels with the one from the wav header + if s1.shape != s2.shape: print( f"file size in samples: file 1 = {s1.shape[0]},", @@ -41,7 +43,7 @@ def cmp_pcm(file1, file2, out_config, fs) -> (int, str): ) return 1, "FAIL: File lengths differ" - cmp_result = pyaudio3dtools.audioarray.compare(s1, s2, fs, per_frame=False) + cmp_result = pyaudio3dtools.audioarray.compare(s1, s2, fs, per_frame=False, get_mld=get_mld) if cmp_result["bitexact"]: return 0, "SUCCESS: Files are bitexact" @@ -50,6 +52,9 @@ def cmp_pcm(file1, file2, out_config, fs) -> (int, str): first_msg = f"First diff found at sample num {cmp_result['first_diff_pos_sample']} in channel {cmp_result['first_diff_pos_channel']}, frame {cmp_result['first_diff_pos_frame']} (assuming {nchannels} channels, {fs} sampling rate)" print(diff_msg) print(first_msg) + if get_mld: + mld_msg = f"MLD: {cmp_result['MLD']}" + print(mld_msg) return 1, "FAIL: Files have different content" @@ -65,6 +70,7 @@ if __name__ == "__main__": choices=pyivastest.constants.OC_TO_NCHANNELS.keys(), ) parser.add_argument("-s", "--sampling_rate", type=int, default=48000, dest="fs") + parser.add_argument("--get_mld", action="store_true") args = parser.parse_args() result, msg = cmp_pcm(**vars(args)) diff --git a/tests/conftest.py b/tests/conftest.py index 46cd0d3a61..4b38ef776a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -152,6 +152,12 @@ def pytest_addoption(parser): help="Timeout in seconds for each individual testcase. Default is no timeout.", ) + parser.addoption( + "--mld", + action="store_true", + help="Run the MLD tool instead of just comparing for bitexactness", + ) + @pytest.fixture(scope="session", autouse=True) def update_ref(request): @@ -164,6 +170,14 @@ def update_ref(request): return int(request.config.getoption("--update_ref")) +@pytest.fixture(scope="session", autouse=True) +def get_mld(request): + """ + Return indication to run the MLD tool during ref/dut comparison. + """ + return request.config.option.mld + + @pytest.fixture(scope="session") def keep_files(request) -> bool: """ -- GitLab