54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
"""Tests for CFC filtering."""
|
|
|
|
import numpy as np
|
|
import pytest
|
|
|
|
from impakt.transform.cfc import CFCFilter, cfc_filter
|
|
|
|
|
|
class TestCFCFilter:
|
|
def test_cfc60(self, head_accel_x):
|
|
filtered = cfc_filter(head_accel_x, 60)
|
|
assert filtered.cfc_class == 60
|
|
assert len(filtered.data) == len(head_accel_x.data)
|
|
# Filtered signal should be smoother (lower peak)
|
|
assert filtered.peak <= head_accel_x.peak
|
|
# But still retain the general shape
|
|
assert filtered.peak > 20.0 # Not completely killed
|
|
|
|
def test_cfc180(self, head_accel_x):
|
|
filtered = cfc_filter(head_accel_x, 180)
|
|
assert filtered.cfc_class == 180
|
|
|
|
def test_cfc600(self, head_accel_x):
|
|
filtered = cfc_filter(head_accel_x, 600)
|
|
assert filtered.cfc_class == 600
|
|
|
|
def test_cfc1000(self, head_accel_x):
|
|
filtered = cfc_filter(head_accel_x, 1000)
|
|
assert filtered.cfc_class == 1000
|
|
# CFC 1000 removes very little — peak should be close to original
|
|
assert abs(filtered.peak - head_accel_x.peak) < 5.0
|
|
|
|
def test_invalid_cfc_class(self):
|
|
with pytest.raises(ValueError, match="Invalid CFC class"):
|
|
CFCFilter(cfc_class=42)
|
|
|
|
def test_transform_history(self, head_accel_x):
|
|
filtered = cfc_filter(head_accel_x, 180)
|
|
assert len(filtered.transform_history) == 1
|
|
assert "CFC 180" in filtered.transform_history[0]
|
|
|
|
def test_original_unchanged(self, head_accel_x):
|
|
original_data = head_accel_x.data.copy()
|
|
_ = cfc_filter(head_accel_x, 180)
|
|
assert np.array_equal(head_accel_x.data, original_data)
|
|
|
|
def test_progressive_filtering(self, head_accel_x):
|
|
"""Lower CFC classes should produce smoother (lower peak) output."""
|
|
peak_1000 = cfc_filter(head_accel_x, 1000).peak
|
|
peak_600 = cfc_filter(head_accel_x, 600).peak
|
|
peak_180 = cfc_filter(head_accel_x, 180).peak
|
|
peak_60 = cfc_filter(head_accel_x, 60).peak
|
|
assert peak_1000 >= peak_600 >= peak_180 >= peak_60
|