aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/combine.py
diff options
context:
space:
mode:
authorJ08nY2018-11-20 00:36:46 +0100
committerJ08nY2019-03-14 18:03:54 +0100
commite0a6e7c452cd55365096bc3e4b8f36f5f9660ae7 (patch)
treebf1c80e015cdfd47d864665946f44a072f7b38db /pyecsca/combine.py
downloadpyecsca-e0a6e7c452cd55365096bc3e4b8f36f5f9660ae7.tar.gz
pyecsca-e0a6e7c452cd55365096bc3e4b8f36f5f9660ae7.tar.zst
pyecsca-e0a6e7c452cd55365096bc3e4b8f36f5f9660ae7.zip
Diffstat (limited to 'pyecsca/combine.py')
-rw-r--r--pyecsca/combine.py30
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)