Loading examples/TEMPLATE.yml +2 −2 Original line number Diff line number Diff line Loading @@ -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) Loading ivas_processing_scripts/audiotools/__init__.py +4 −4 Original line number Diff line number Diff line Loading @@ -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", Loading ivas_processing_scripts/audiotools/constants.py +1 −0 Original line number Diff line number Diff line Loading @@ -692,6 +692,7 @@ DELAY_COMPENSATION_FOR_FILTERING = { "down": 145, }, "MSIN": 92, "20KBP": 200, "LP1p5": 322, "LP35": 232, "LP7": 117, Loading ivas_processing_scripts/audiotools/convert/__init__.py +17 −9 Original line number Diff line number Diff line Loading @@ -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, ) Loading Loading @@ -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, Loading @@ -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, Loading @@ -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, Loading @@ -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, Loading @@ -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, Loading Loading @@ -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: Loading ivas_processing_scripts/audiotools/wrappers/filter.py +52 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
examples/TEMPLATE.yml +2 −2 Original line number Diff line number Diff line Loading @@ -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) Loading
ivas_processing_scripts/audiotools/__init__.py +4 −4 Original line number Diff line number Diff line Loading @@ -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", Loading
ivas_processing_scripts/audiotools/constants.py +1 −0 Original line number Diff line number Diff line Loading @@ -692,6 +692,7 @@ DELAY_COMPENSATION_FOR_FILTERING = { "down": 145, }, "MSIN": 92, "20KBP": 200, "LP1p5": 322, "LP35": 232, "LP7": 117, Loading
ivas_processing_scripts/audiotools/convert/__init__.py +17 −9 Original line number Diff line number Diff line Loading @@ -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, ) Loading Loading @@ -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, Loading @@ -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, Loading @@ -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, Loading @@ -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, Loading @@ -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, Loading Loading @@ -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: Loading
ivas_processing_scripts/audiotools/wrappers/filter.py +52 −0 Original line number Diff line number Diff line Loading @@ -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