diff options
| author | J08nY | 2018-11-20 00:36:46 +0100 |
|---|---|---|
| committer | J08nY | 2019-03-14 18:03:54 +0100 |
| commit | e0a6e7c452cd55365096bc3e4b8f36f5f9660ae7 (patch) | |
| tree | bf1c80e015cdfd47d864665946f44a072f7b38db /pyecsca/combine.py | |
| download | pyecsca-e0a6e7c452cd55365096bc3e4b8f36f5f9660ae7.tar.gz pyecsca-e0a6e7c452cd55365096bc3e4b8f36f5f9660ae7.tar.zst pyecsca-e0a6e7c452cd55365096bc3e4b8f36f5f9660ae7.zip | |
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) |
