Commit 5f67ceef authored by multrus's avatar multrus
Browse files

first implementation

parent d936bbd3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -64,8 +64,8 @@ input:
# preprocessing:
    ### Target format used in rendering from input format; default = null (no rendering)
    # fmt: "7_1_4"
    ### Flag for application of 50Hz high-pass filter; default = false
    # hp50: true
    ### Define mask (HP50 or 20KBP) for input signal filtering; default = None
    # mask: None
    ### Target sampling rate in Hz for resampling; default = null (no resampling)
    # fs: 16000
    ### Target loudness in LKFS; default = null (no loudness change applied)
+4 −4
Original line number Diff line number Diff line
@@ -79,10 +79,10 @@ def add_processing_args(group, input=True):
        default=None,
    )
    group.add_argument(
        f"-{ps}hp",
        f"--{p}_hp50",
        help="Apply 50 Hz high-pass filtering (default = %(default)s)",
        action="store_true",
        f"-{ps}mk",
        f"--{p}_mask",
        help="Apply filtering with mask (default = %(default)s)",
        default=None,
    )
    group.add_argument(
        f"-{ps}w",
+1 −0
Original line number Diff line number Diff line
@@ -692,6 +692,7 @@ DELAY_COMPENSATION_FOR_FILTERING = {
        "down": 145,
    },
    "MSIN": 92,
    "20KBP": 200,
    "LP1p5": 322,
    "LP35": 232,
    "LP7": 117,
+17 −9
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ from ivas_processing_scripts.audiotools.wrappers.bs1770 import loudness_norm
from ivas_processing_scripts.audiotools.wrappers.esdru import esdru
from ivas_processing_scripts.audiotools.wrappers.filter import (
    hp50filter_itu,
    kbp20filter_itu,
    lpfilter_itu,
    resample_itu,
)
@@ -133,7 +134,7 @@ def convert(
    in_delay: Optional[float] = None,
    in_fs: Optional[int] = None,
    in_cutoff: Optional[int] = None,
    in_hp50: Optional[bool] = None,
    in_mask: Optional[str] = None,
    in_window: Optional[list] = None,
    in_loudness: Optional[float] = None,
    in_loudness_fmt: Optional[str] = None,
@@ -142,7 +143,7 @@ def convert(
    out_delay: Optional[float] = None,
    out_fs: Optional[int] = None,
    out_cutoff: Optional[int] = None,
    out_hp50: Optional[bool] = None,
    out_mask: Optional[str] = None,
    out_window: Optional[list] = None,
    out_loudness: Optional[float] = None,
    out_loudness_fmt: Optional[str] = None,
@@ -162,7 +163,7 @@ def convert(
        delay=in_delay,
        fs=in_fs,
        fc=in_cutoff,
        hp50=in_hp50,
        mask=in_mask,
        window=in_window,
        loudness=in_loudness,
        loudness_fmt=in_loudness_fmt,
@@ -180,7 +181,7 @@ def convert(
        delay=out_delay,
        fs=out_fs,
        fc=out_cutoff,
        hp50=out_hp50,
        mask=out_mask,
        window=out_window,
        loudness=out_loudness,
        loudness_fmt=out_loudness_fmt,
@@ -198,7 +199,7 @@ def process_audio(
    delay: Optional[float] = None,
    fs: Optional[int] = None,
    fc: Optional[int] = None,
    hp50: Optional[bool] = False,
    mask: Optional[str] = None,
    window: Optional[float] = None,
    loudness: Optional[float] = None,
    loudness_fmt: Optional[str] = None,
@@ -232,11 +233,18 @@ def process_audio(
            logger.debug(f"Windowing audio with {window} ms Hann window")
        x.audio = audioarray.window(x.audio, x.fs, window)

    """high-pass (50 Hz) filtering"""
    if hp50:
    """mask filtering"""
    if mask is not None:
        if logger:
            logger.debug("Applying 50 Hz high-pass filter using ITU STL filter")
            logger.debug("Applying mask filter using ITU STL filter")
        if mask == "HP50":
            x.audio = hp50filter_itu(x)
#        elif mask == "20KBP":
#            x.audio = kbp20filter_itu(x)
#        else:
#            raise ValueError(
#                "Invalid mask filter defined"
#            )

    """resampling"""
    if x.fs != fs:
+52 −0
Original line number Diff line number Diff line
@@ -291,6 +291,58 @@ def hp50filter_itu(
    return y


def kbp20filter_itu(
    x: Audio,
) -> np.ndarray:
    """
    20Hz to 20kHz bandpass filter for multi-channel audio array

    Parameters
    ----------
    x: Audio
        Input audio

    Returns
    -------
    y: np.ndarray
        Output high-pass filtered array
    """

    # set filter type and check if sampling rate is supported
    old_fs = None
    tmp = copy(x)
    if x.fs == 48000:
        flt_type = "20KBP"
    else:
        # resample if samplingrate is not supported
        warn(
            f"Filter type 20KBP only supported for 48kHz samlingrate, not for {x.fs}Hz -> resampling"
        )
        flt_type = "20KBP"
        old_fs = x.fs
        tmp.audio = resample_itu(tmp, 48000)
        tmp.fs = 48000

    # don't apply high-pass filtering to LFE channel
    if isinstance(x, ChannelBasedAudio):
        skip_channel = x.lfe_index
    else:
        skip_channel = None

    # apply filter
    y = filter_itu(tmp, flt_type=flt_type, skip_channel=skip_channel)

    # delay compensation
    y = delay_compensation(y, flt_type=flt_type, fs=tmp.fs)

    # reverse resampling
    if old_fs:
        tmp.audio = y
        y = resample_itu(tmp, old_fs)

    return y


def resample_itu(
    x: Audio,
    fs_new: int,
Loading