From 82362e093dd1fc22132237f8f25a7098c47e5f35 Mon Sep 17 00:00:00 2001 From: Sergio Aguirre Date: Sat, 31 Oct 2026 19:01:22 +0100 Subject: [PATCH] [FEATURE] add time_window for SignalObj Apply a time window built from pairs of bounds: start <= end fades out (ones, falling half window, zeros), start > end fades in, several pairs multiply, and symmetric mirrors the window about the centre of the signal. Bounds in seconds or zero based samples; the slope has abs(end - start) + 1 samples and is one half of a symmetric window twice as long, so a hann slope ends at exactly zero. Follows ita_time_window of the ITA-Toolbox (RWTH Aachen), without the move of the bounds to even sample numbers. Tests pin each rule on a signal of ones and compare five cases sample by sample with the ITA-Toolbox output stored in tests/golden/time_window_ita.mat, which tests/golden/make_time_window_ita.m regenerates with MATLAB. --- pytta/__init__.py | 3 +- pytta/functions.py | 82 ++++++++++++++++ tests/golden/make_time_window_ita.m | 49 ++++++++++ tests/golden/time_window_ita.mat | Bin 0 -> 78603 bytes tests/test_time_window.py | 144 ++++++++++++++++++++++++++++ 5 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 tests/golden/make_time_window_ita.m create mode 100644 tests/golden/time_window_ita.mat create mode 100644 tests/test_time_window.py diff --git a/pytta/__init__.py b/pytta/__init__.py index d8740aa..aa332ae 100644 --- a/pytta/__init__.py +++ b/pytta/__init__.py @@ -113,7 +113,7 @@ list_devices, print_devices, get_device_from_user,\ fft_convolve, find_delay, corr_coef, resample,\ peak_time, save, load, plot_time, plot_time_dB, plot_freq,\ - plot_bars, plot_spectrogram, plot_waterfall, SPL + plot_bars, plot_spectrogram, plot_waterfall, SPL, time_window # Must go on v0.1.0 (DEPRECATED) from .functions import fft_degree @@ -146,6 +146,7 @@ 'resample', 'corr_coef', 'peak_time', + 'time_window', 'save', 'load', 'weighting', diff --git a/pytta/functions.py b/pytta/functions.py index 9b39239..579dd64 100644 --- a/pytta/functions.py +++ b/pytta/functions.py @@ -17,6 +17,7 @@ >>> pytta.corr_coef(signalObj1, signalObj2) >>> pytta.resample(signalObj, newSamplingRate) >>> pytta.peak_time(signalObj1, signalObj2, ..., signalObjN) + >>> pytta.time_window(signalObj, interval) >>> pytta.plot_time(signalObj1, signalObj2, ..., signalObjN) >>> pytta.plot_time_dB(signalObj1, signalObj2, ..., signalObjN) >>> pytta.plot_freq(signalObj1, signalObj2, ..., signalObjN) @@ -274,6 +275,87 @@ def peak_time(signal): else: return peaks_time[0] +def time_window(signalObj, interval, unit='time', window='hann', + symmetric=False): + """ + Apply a time window to a SignalObj and return a new SignalObj. + + The window is built from pairs of bounds. Each pair [start, end] with + start <= end is a falling slope: ones before start, the falling half of + the window between start and end (both included), zeros after end. A pair + with start > end is the mirror image, a rising slope: zeros before end, + rising half between end and start, ones after start. Several pairs + multiply. The usual impulse response window is therefore + [startFade, 0, endFadeStart, endFadeEnd]: a rise at the beginning and a + fall at the end. + + Parameters (default), (type): + ----------------------------- + * signalObj (), (SignalObj): + signal to be windowed. It is not modified; + * interval (), (list): + an even number of bounds, in seconds or samples; + * unit ('time'), (str): + 'time' for seconds (converted with round(t * fs), halves up) or + 'samples' for integer, zero based sample indices; + * window ('hann'), (str): + 'hann', 'rect' or any window name scipy.signal.get_window + accepts without parameters. The slope has abs(end - start) + 1 + samples and is one half of a symmetric window twice that long, + so a 'hann' slope ends at exactly zero; + * symmetric (False), (bool): + mirror the window about the centre of the signal, for impulse + responses that are slightly non causal. + + The behaviour follows ita_time_window of the ITA-Toolbox (RWTH Aachen), + except that the bounds are not moved to even sample numbers. + + >>> ir = pytta.time_window(ir, [0.02, 0, 0.8, 1.0]) + """ + if not isinstance(signalObj, SignalObj): + raise TypeError('signalObj must be a SignalObj.') + bounds = np.asarray(interval, dtype=float).ravel() + if bounds.size == 0 or bounds.size % 2: + raise ValueError('interval must hold an even number of bounds.') + if unit == 'time': + bounds = np.floor(bounds * signalObj.samplingRate + 0.5) + elif unit != 'samples': + raise ValueError("unit must be 'time' or 'samples'.") + numSamples = signalObj.numSamples + if np.any(bounds < 0) or np.any(bounds >= numSamples): + raise ValueError('interval bounds must lie within the signal.') + bounds = bounds.astype(int) + name = {'rect': 'boxcar', 'rectwin': 'boxcar'}.get(window, window) + try: + ss.get_window(name, 4, fftbins=False) + except ValueError: + raise ValueError(f"unknown window '{window}'.") + fullWindow = np.ones(numSamples) + for start, end in bounds.reshape(-1, 2): + length = abs(end - start) + 1 + halves = ss.get_window(name, 2 * length, fftbins=False) + slope = np.ones(numSamples) + if start <= end: + slope[start:end + 1] = halves[length:] + slope[end + 1:] = 0 + else: + slope[:end] = 0 + slope[end:start + 1] = halves[:length] + fullWindow *= slope + if symmetric: + fullWindow = fullWindow + fullWindow[::-1] + fullWindow -= fullWindow.min() + newSignal = SignalObj(signalObj.timeSignal * fullWindow[:, np.newaxis], + 'time', + samplingRate=signalObj.samplingRate, + signalType=signalObj.signalType, + freqMin=signalObj.freqMin, + freqMax=signalObj.freqMax, + comment=signalObj.comment) + newSignal.channels = cp.deepcopy(signalObj.channels) + return newSignal + + def fft_degree(*args,**kwargs): """ DEPRECATED diff --git a/tests/golden/make_time_window_ita.m b/tests/golden/make_time_window_ita.m new file mode 100644 index 0000000..61a8395 --- /dev/null +++ b/tests/golden/make_time_window_ita.m @@ -0,0 +1,49 @@ +function make_time_window_ita(itaRoot) +% MAKE_TIME_WINDOW_ITA Golden data for tests/test_time_window.py. +% +% make_time_window_ita(itaRoot) runs ita_time_window from the ITA-Toolbox +% (RWTH Aachen, https://git.rwth-aachen.de/ita/toolbox) on a fixed random +% signal and writes time_window_ita.mat next to this file. +% +% Intervals are given in SAMPLES, 1-based as MATLAB indexes them, so the +% file pins the window shape itself and not the seconds-to-samples +% rounding of either implementation. The Python test subtracts 1. +% +% The signal is stored in the file: the test never regenerates it. +% +% Usage: matlab -batch "make_time_window_ita('/path/to/ITA-Toolbox')" + +addpath(genpath(itaRoot)); + +fs = 1000; +rng(0, 'twister'); +x = randn(1000, 2); +a = itaAudio(x, fs, 'time'); + +% name, interval (1-based samples), window, symmetric +spec = { + 'falling_hann', [201 400], @hann, false + 'rising_hann', [600 450], @hann, false + 'both_ends_hann', [100 1 800 1000], @hann, false + 'both_ends_rect', [50 1 900 1000], @rectwin, false + 'symmetric_hann', [301 500], @hann, true +}; + +cases = struct('name', {}, 'interval', {}, 'window', {}, 'symmetric', {}, 'y', {}); +for k = 1:size(spec, 1) + if spec{k, 4} + r = ita_time_window(a, spec{k, 2}, spec{k, 3}, 'samples', 'symmetric'); + else + r = ita_time_window(a, spec{k, 2}, spec{k, 3}, 'samples'); + end + cases(k).name = spec{k, 1}; + cases(k).interval = spec{k, 2}; + cases(k).window = func2str(spec{k, 3}); + cases(k).symmetric = spec{k, 4}; + cases(k).y = r.timeData; +end + +out = fullfile(fileparts(mfilename('fullpath')), 'time_window_ita.mat'); +save(out, 'x', 'fs', 'cases', '-v7'); +fprintf('wrote %s (%d cases)\n', out, numel(cases)); +end diff --git a/tests/golden/time_window_ita.mat b/tests/golden/time_window_ita.mat new file mode 100644 index 0000000000000000000000000000000000000000..9c61a1ac3c2a4c1234b7651d90586759bf635515 GIT binary patch literal 78603 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 DI7?Lf literal 0 HcmV?d00001 diff --git a/tests/test_time_window.py b/tests/test_time_window.py new file mode 100644 index 0000000..4246b0a --- /dev/null +++ b/tests/test_time_window.py @@ -0,0 +1,144 @@ +""" +Tests for pytta.time_window. + +Each test pins one rule of the function. The shape rules are checked on a +signal of ones, so the output is the window itself. The last test compares +the whole thing with the ITA-Toolbox (RWTH Aachen) on data generated by +golden/make_time_window_ita.m. + +Index convention: an interval is a list of [start, end] pairs. start <= end +is a falling slope (ones before start, zeros after end); start > end is a +rising slope (zeros before end, ones after start). Both bounds belong to the +slope, which therefore has abs(end - start) + 1 samples. +""" +import os +import unittest + +import numpy as np +import scipy.io as sio + +import pytta + +GOLDEN = os.path.join(os.path.dirname(__file__), 'golden', 'time_window_ita.mat') +FS = 1000 +N = 1000 +TOL32 = 1e-6 # rounding of the float32 SignalObj storage + + +def ones(numChannels=1): + return pytta.SignalObj(np.ones((N, numChannels)), 'time', FS) + + +def window_of(interval, **kwargs): + """Apply time_window to ones and return the resulting window, 1-D.""" + out = pytta.time_window(ones(), interval, unit='samples', **kwargs) + return out.timeSignal[:, 0].astype(float) + + +class TestTimeWindow(unittest.TestCase): + + def test_falling_slope_is_hann_half_between_bounds(self): + # [200, 399]: 200 ones, then the falling half of hann(400), i.e. + # 0.5 * (1 - cos(2 pi k / 399)) for k = 200..399, then zeros. + # The slope ends at exactly 0 (symmetric hann, not hanning). + s, e = 200, 399 + w = window_of([s, e]) + L = e - s + 1 + k = np.arange(L, 2 * L) + expected = 0.5 * (1 - np.cos(2 * np.pi * k / (2 * L - 1))) + worst = np.max(np.abs(w[s:e + 1] - expected)) + print(f'\n falling slope vs analytic hann, worst={worst:.2e} (tol {TOL32})') + self.assertTrue(np.all(w[:s] == 1)) + self.assertLess(worst, TOL32) + self.assertEqual(w[e], 0) + self.assertTrue(np.all(w[e + 1:] == 0)) + + def test_rising_slope_mirrors_falling(self): + # start > end reverses the slope: zeros, rise, ones. It must be the + # sample-by-sample mirror of the falling window on mirrored indices. + rising = window_of([600, 450]) + falling = window_of([N - 1 - 600, N - 1 - 450]) + self.assertTrue(np.array_equal(rising, falling[::-1])) + + def test_pairs_compose_by_product(self): + # Two pairs are two windows multiplied, independent of order. + both = window_of([120, 0, 800, 999]) + rise = window_of([120, 0]) + fall = window_of([800, 999]) + self.assertTrue(np.allclose(both, rise * fall, atol=TOL32)) + self.assertTrue(np.array_equal(both, window_of([800, 999, 120, 0]))) + + def test_rect_window_is_hard_cut(self): + # A rectangular window keeps the slope at 1: a cut right after end. + w = window_of([300, 499], window='rect') + self.assertTrue(np.all(w[:500] == 1)) + self.assertTrue(np.all(w[500:] == 0)) + + def test_time_unit_rounds_to_nearest_sample(self): + # Seconds are converted with round(t * fs), halves up. 0.2004 s at + # 1 kHz is sample 200, 0.3995 s is sample 400 (not 399). No further + # adjustment of the bounds (the ITA-Toolbox moves them to even + # numbers; this implementation does not). + inSeconds = pytta.time_window(ones(), [0.2004, 0.3995], unit='time') + inSamples = pytta.time_window(ones(), [200, 400], unit='samples') + self.assertTrue(np.array_equal(inSeconds.timeSignal, inSamples.timeSignal)) + + def test_symmetric_mirrors_window_about_centre(self): + # symmetric=True adds the window to its reverse and removes the + # offset: for a falling slope in the first half it yields + # ones, fall, zeros, rise, ones, symmetric about the centre. + s, e = 300, 499 + w = window_of([s, e], symmetric=True) + self.assertTrue(np.array_equal(w, w[::-1])) + self.assertTrue(np.all(w[:s] == 1)) + self.assertEqual(w[e], 0) + self.assertEqual(w[N // 2], 0) + + def test_returns_new_object_and_keeps_metadata(self): + # The input is not modified; the output keeps sampling rate and + # channel count and windows every channel the same way. + sig = pytta.SignalObj(np.random.default_rng(0).standard_normal((N, 3)), + 'time', FS) + before = sig.timeSignal.copy() + out = pytta.time_window(sig, [0.1, 0.4]) + self.assertTrue(np.array_equal(sig.timeSignal, before)) + self.assertIsNot(out, sig) + self.assertEqual(out.samplingRate, FS) + self.assertEqual(out.numChannels, 3) + w = window_of([100, 400]) + for ch in range(3): + self.assertTrue(np.allclose(out.timeSignal[:, ch], + before[:, ch] * w, atol=TOL32)) + + def test_rejects_invalid_interval(self): + with self.assertRaises(ValueError): + pytta.time_window(ones(), [100, 200, 300], unit='samples') # odd + with self.assertRaises(ValueError): + pytta.time_window(ones(), [100, N], unit='samples') # past end + with self.assertRaises(ValueError): + pytta.time_window(ones(), [0.1, 0.2], unit='seconds') # unknown + with self.assertRaises(ValueError): + pytta.time_window(ones(), [100, 200], unit='samples', window='no') + + def test_matches_ita_toolbox(self): + # Sample-by-sample against ita_time_window on the stored signal, all + # five cases of golden/make_time_window_ita.m. Intervals there are + # 1-based MATLAB samples; subtract 1. Tolerance is the float32 + # storage of SignalObj relative to the signal peak. + self.assertTrue(os.path.exists(GOLDEN), 'run golden/make_time_window_ita.m') + g = sio.loadmat(GOLDEN, squeeze_me=True, struct_as_record=False) + x, fs = g['x'], int(g['fs']) + sig = pytta.SignalObj(x, 'time', fs) + peak = np.max(np.abs(x)) + for case in np.atleast_1d(g['cases']): + interval = (np.atleast_1d(case.interval) - 1).tolist() + window = {'hann': 'hann', 'rectwin': 'rect'}[case.window] + out = pytta.time_window(sig, interval, unit='samples', + window=window, symmetric=bool(case.symmetric)) + diff = np.max(np.abs(out.timeSignal - case.y)) / peak + print(f'\n {case.name:16s} rel peak diff vs ITA = {diff:.2e} (tol {TOL32})') + self.assertLess(diff, TOL32, case.name) + + +if __name__ == '__main__': + unittest.main()