diff options
Diffstat (limited to 'pyecsca/combine.py')
| -rw-r--r-- | pyecsca/combine.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/pyecsca/combine.py b/pyecsca/combine.py new file mode 100644 index 0000000..4b29f8c --- /dev/null +++ b/pyecsca/combine.py @@ -0,0 +1,30 @@ +import numpy as np +from public import public +from typing import Callable, Optional + +from .trace import Trace, CombinedTrace + + +@public +def average(*traces: Trace) -> Optional[CombinedTrace]: + if not traces: + return None + if len(traces) == 1: + return CombinedTrace(None, None, traces[0].samples.copy(), parents=traces) + dtype = traces[0].samples.dtype + result_samples = np.mean(np.array([trace.samples for trace in traces]), axis=0).astype(dtype) + return CombinedTrace(None, None, result_samples, parents=traces) + + +@public +def conditional_average(*traces: Trace, condition: Callable[[Trace], bool]) -> Optional[CombinedTrace]: + return average(*filter(condition, traces)) + + +@public +def standard_deviation(*traces: Trace) -> Optional[CombinedTrace]: + if not traces: + return None + dtype = traces[0].samples.dtype + result_samples = np.std(np.array([trace.samples for trace in traces]), axis=0).astype(dtype) + return CombinedTrace(None, None, result_samples, parents=traces) |
