| Index: webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing.py
|
| diff --git a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing.py b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing.py
|
| index f611eca0dc2e4f4a53252260496fd213de298525..1b58833eb884be0e3cc47507272da0e3c3e8af1a 100644
|
| --- a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing.py
|
| +++ b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing.py
|
| @@ -6,6 +6,9 @@
|
| # in the file PATENTS. All contributing project authors may
|
| # be found in the AUTHORS file in the root of the source tree.
|
|
|
| +"""Signal processing utility module.
|
| +"""
|
| +
|
| import array
|
| import logging
|
| import os
|
| @@ -34,15 +37,21 @@ from . import exceptions
|
|
|
|
|
| class SignalProcessingUtils(object):
|
| + """Collection of signal processing utilities.
|
| + """
|
|
|
| def __init__(self):
|
| pass
|
|
|
| @classmethod
|
| - def load_wav(cls, filepath, channels=1):
|
| - """Load wav file.
|
| + def LoadWav(cls, filepath, channels=1):
|
| + """Loads wav file.
|
|
|
| - Return:
|
| + Args:
|
| + filepath: path to the wav audio track file to load.
|
| + channels: number of channels (downmixing to mono by default).
|
| +
|
| + Returns:
|
| AudioSegment instance.
|
| """
|
| if not os.path.exists(filepath):
|
| @@ -52,21 +61,24 @@ class SignalProcessingUtils(object):
|
| filepath, format='wav', channels=channels)
|
|
|
| @classmethod
|
| - def save_wav(cls, output_filepath, signal):
|
| - """Save wav file.
|
| + def SaveWav(cls, output_filepath, signal):
|
| + """Saves wav file.
|
|
|
| Args:
|
| - output_filepath: string, output file path.
|
| + output_filepath: path to the wav audio track file to save.
|
| signal: AudioSegment instance.
|
| """
|
| return signal.export(output_filepath, format='wav')
|
|
|
| @classmethod
|
| - def count_samples(cls, signal):
|
| + def CountSamples(cls, signal):
|
| """Number of samples per channel.
|
|
|
| Args:
|
| signal: AudioSegment instance.
|
| +
|
| + Returns:
|
| + An integer.
|
| """
|
| number_of_samples = len(signal.get_array_of_samples())
|
| assert signal.channels > 0
|
| @@ -74,10 +86,10 @@ class SignalProcessingUtils(object):
|
| return number_of_samples / signal.channels
|
|
|
| @classmethod
|
| - def generate_white_noise(cls, signal):
|
| - """Generate white noise.
|
| + def GenerateWhiteNoise(cls, signal):
|
| + """Generates white noise.
|
|
|
| - Generate white noise with the same duration and in the same format as a
|
| + White noise is generated with the same duration and in the same format as a
|
| given signal.
|
|
|
| Args:
|
| @@ -94,8 +106,15 @@ class SignalProcessingUtils(object):
|
| volume=0.0)
|
|
|
| @classmethod
|
| - def apply_impulse_response(cls, signal, impulse_response):
|
| - """Apply an impulse response to a signal.
|
| + def ApplyImpulseResponse(cls, signal, impulse_response):
|
| + """Applies an impulse response to a signal.
|
| +
|
| + Args:
|
| + signal: AudioSegment instance.
|
| + impulse_response: list or numpy vector of float values.
|
| +
|
| + Returns:
|
| + AudioSegment instance.
|
| """
|
| # Get samples.
|
| assert signal.channels == 1, (
|
| @@ -133,11 +152,27 @@ class SignalProcessingUtils(object):
|
| return convolved_signal
|
|
|
| @classmethod
|
| - def normalize(cls, signal):
|
| + def Normalize(cls, signal):
|
| + """Normalizes a signal.
|
| +
|
| + Args:
|
| + signal: AudioSegment instance.
|
| +
|
| + Returns:
|
| + An AudioSegment instance.
|
| + """
|
| return signal.apply_gain(-signal.max_dBFS)
|
|
|
| @classmethod
|
| - def copy(cls, signal):
|
| + def Copy(cls, signal):
|
| + """Makes a copy os a signal.
|
| +
|
| + Args:
|
| + signal: AudioSegment instance.
|
| +
|
| + Returns:
|
| + An AudioSegment instance.
|
| + """
|
| return pydub.AudioSegment(
|
| data=signal.get_array_of_samples(),
|
| metadata={
|
| @@ -148,11 +183,10 @@ class SignalProcessingUtils(object):
|
| })
|
|
|
| @classmethod
|
| - def mix_signals(cls, signal, noise, target_snr=0.0,
|
| - bln_pad_shortest=False):
|
| - """Mix two signals with a target SNR.
|
| + def MixSignals(cls, signal, noise, target_snr=0.0, bln_pad_shortest=False):
|
| + """Mixes two signals with a target SNR.
|
|
|
| - Mix two signals up to a desired SNR by scaling noise (noise).
|
| + Mix two signals with a desired SNR by scaling noise (noise).
|
| If the target SNR is +/- infinite, a copy of signal/noise is returned.
|
|
|
| Args:
|
| @@ -161,16 +195,19 @@ class SignalProcessingUtils(object):
|
| target_snr: float, numpy.Inf or -numpy.Inf (dB).
|
| bln_pad_shortest: if True, it pads the shortest signal with silence at the
|
| end.
|
| +
|
| + Returns:
|
| + An AudioSegment instance.
|
| """
|
| # Handle infinite target SNR.
|
| if target_snr == -np.Inf:
|
| # Return a copy of noise.
|
| logging.warning('SNR = -Inf, returning noise')
|
| - return cls.copy(noise)
|
| + return cls.Copy(noise)
|
| elif target_snr == np.Inf:
|
| # Return a copy of signal.
|
| logging.warning('SNR = +Inf, returning signal')
|
| - return cls.copy(signal)
|
| + return cls.Copy(signal)
|
|
|
| # Check signal and noise power.
|
| signal_power = float(signal.dBFS)
|
| @@ -208,4 +245,4 @@ class SignalProcessingUtils(object):
|
|
|
| # Mix signals using the target SNR.
|
| gain_db = signal_power - noise_power - target_snr
|
| - return cls.normalize(signal.overlay(noise.apply_gain(gain_db)))
|
| + return cls.Normalize(signal.overlay(noise.apply_gain(gain_db)))
|
|
|