def test_fft_nofft(self): for _ in range(10): x = th.randn(1024) freq = random.uniform(0.01, 0.5) freq2 = random.uniform(freq, 0.5) y_fft = filters.bandpass_filter(x, freq, freq2, fft=True) y_ref = filters.bandpass_filter(x, freq, freq2, fft=False) self.assertSimilar(y_fft, y_ref, x, f"freq={freq}", tol=0.01)
def test_stride(self): x = th.randn(1024) y = filters.bandpass_filter(x, 0.1, 0.2, stride=1)[::3] y2 = filters.bandpass_filter(x, 0.1, 0.2, stride=3) self.assertEqual(y.shape, y2.shape) self.assertSimilar(y, y2, x) y = filters.bandpass_filter(x, 0.1, 0.2, stride=1, pad=False)[::3] y2 = filters.bandpass_filter(x, 0.1, 0.2, stride=3, pad=False) self.assertEqual(y.shape, y2.shape) self.assertSimilar(y, y2, x)
def test_keep_or_kill(self): for _ in range(10): freq = random.uniform(0.01, 0.4) sr = 1024 tone = pure_tone(freq * sr, sr=sr, dur=10) # For this test we accept 5% tolerance in amplitude, or -26dB in power. tol = 5 zeros = 16 y_pass = filters.bandpass_filter(tone, 0.9 * freq, 1.1 * freq, zeros=zeros) self.assertSimilar(y_pass, tone, tone, f"freq={freq}, pass", tol=tol) y_killed = filters.bandpass_filter(tone, 1.1 * freq, 1.2 * freq, zeros=zeros) self.assertSimilar(y_killed, 0 * tone, tone, f"freq={freq}, kill", tol=tol) y_killed = filters.bandpass_filter(tone, 0.8 * freq, 0.9 * freq, zeros=zeros) self.assertSimilar(y_killed, 0 * tone, tone, f"freq={freq}, kill", tol=tol)
def test_same_as_lowpass(self): x = th.randn(1024) y_ref = filters.lowpass_filter(x, 0.2) y = filters.bandpass_filter(x, 0., 0.2) self.assertSimilar(y, y_ref, x)
def test_constant(self): x = th.ones(2048) for zeros in [4, 10]: for freq in [0.01, 0.1]: y = filters.bandpass_filter(x, freq, 1.2 * freq, zeros=zeros) self.assertLessEqual(y.abs().mean(), 1e-6, (zeros, freq))