aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyecsca/align.py19
-rw-r--r--pyecsca/edit.py10
-rw-r--r--pyecsca/filter.py7
-rw-r--r--pyecsca/process.py13
-rw-r--r--pyecsca/sampling.py4
-rw-r--r--pyecsca/trace.py4
6 files changed, 35 insertions, 22 deletions
diff --git a/pyecsca/align.py b/pyecsca/align.py
index 3341599..1c4b891 100644
--- a/pyecsca/align.py
+++ b/pyecsca/align.py
@@ -1,11 +1,11 @@
"""
This module provides functions for aligning traces in a trace set to a reference trace within it.
"""
-from typing import List, Callable, Tuple
-from copy import copy, deepcopy
-from public import public
import numpy as np
+from copy import copy, deepcopy
from fastdtw import fastdtw, dtw
+from public import public
+from typing import List, Callable, Tuple
from .process import normalize
from .trace import Trace
@@ -98,6 +98,7 @@ def align_peaks(reference: Trace, *traces: Trace,
window_peak = np.argmax(window)
left_space = min(max_offset, reference_offset)
return True, int(window_peak - reference_peak - left_space)
+
return align_reference(reference, *traces, align_func=align_func)
@@ -134,13 +135,16 @@ def align_sad(reference: Trace, *traces: Trace,
best_sad = sad
best_offset = offset
return True, best_offset
+
return align_reference(reference, *traces, align_func=align_func)
@public
-def align_dtw_scale(reference: Trace, *traces: Trace, radius: int = 1, fast: bool = True) -> List[Trace]:
+def align_dtw_scale(reference: Trace, *traces: Trace, radius: int = 1,
+ fast: bool = True) -> List[Trace]:
"""
- Align `traces` to the reference `trace`. Using fastdtw (Dynamic Time Warping) with scaling as per:
+ Align `traces` to the reference `trace`.
+ Using fastdtw (Dynamic Time Warping) with scaling as per:
Jasper G. J. van Woudenberg, Marc F. Witteman, Bram Bakker:
Improving Differential Power Analysis by Elastic Alignment
@@ -195,11 +199,12 @@ def align_dtw(reference: Trace, *traces: Trace, radius: int = 1, fast: bool = Tr
else:
dist, path = dtw(reference_samples, trace.samples)
result_samples = np.zeros(len(trace.samples), dtype=trace.samples.dtype)
- pairs = np.array(np.array(path, dtype=np.dtype("int,int")), dtype=np.dtype([("x", "int"), ("y", "int")]))
+ pairs = np.array(np.array(path, dtype=np.dtype("int,int")),
+ dtype=np.dtype([("x", "int"), ("y", "int")]))
result_samples[pairs["x"]] = trace.samples[pairs["y"]]
del pairs
# or manually:
- #for x, y in path:
+ # for x, y in path:
# result_samples[x] = trace.samples[y]
result.append(Trace(copy(trace.title), copy(trace.data), result_samples))
return result
diff --git a/pyecsca/edit.py b/pyecsca/edit.py
index 7fe364d..53553a9 100644
--- a/pyecsca/edit.py
+++ b/pyecsca/edit.py
@@ -1,7 +1,7 @@
+import numpy as np
from copy import copy
-from typing import Union, Tuple, Any
from public import public
-import numpy as np
+from typing import Union, Tuple, Any
from .trace import Trace
@@ -23,9 +23,11 @@ def reverse(trace: Trace) -> Trace:
@public
-def pad(trace: Trace, lengths: Union[Tuple[int, int], int], values: Union[Tuple[Any, Any], Any] = (0, 0)) -> Trace:
+def pad(trace: Trace, lengths: Union[Tuple[int, int], int],
+ values: Union[Tuple[Any, Any], Any] = (0, 0)) -> Trace:
if not isinstance(lengths, tuple):
lengths = (lengths, lengths)
if not isinstance(values, tuple):
values = (values, values)
- return Trace(copy(trace.title), copy(trace.data), np.pad(trace.samples, lengths, "constant", constant_values=values))
+ return Trace(copy(trace.title), copy(trace.data),
+ np.pad(trace.samples, lengths, "constant", constant_values=values))
diff --git a/pyecsca/filter.py b/pyecsca/filter.py
index 8a471aa..2635a8d 100644
--- a/pyecsca/filter.py
+++ b/pyecsca/filter.py
@@ -1,12 +1,13 @@
+from copy import copy
from public import public
-from typing import Union, Tuple
from scipy.signal import butter, lfilter
-from copy import copy
+from typing import Union, Tuple
from .trace import Trace
-def filter_any(trace: Trace, sampling_frequency: int, cutoff: Union[int, Tuple[int, int]], type: str) -> Trace:
+def filter_any(trace: Trace, sampling_frequency: int,
+ cutoff: Union[int, Tuple[int, int]], type: str) -> Trace:
nyq = 0.5 * sampling_frequency
if not isinstance(cutoff, int):
normal_cutoff = tuple(map(lambda x: x / nyq, cutoff))
diff --git a/pyecsca/process.py b/pyecsca/process.py
index 3ca43f2..811a118 100644
--- a/pyecsca/process.py
+++ b/pyecsca/process.py
@@ -1,5 +1,5 @@
-from copy import copy
import numpy as np
+from copy import copy
from public import public
from .trace import Trace
@@ -31,7 +31,9 @@ def rolling_window(samples: np.ndarray, window: int) -> np.ndarray:
@public
def rolling_mean(trace: Trace, window: int) -> Trace:
- return Trace(copy(trace.title), copy(trace.data), np.mean(rolling_window(trace.samples, window), -1).astype(dtype=trace.samples.dtype))
+ return Trace(copy(trace.title), copy(trace.data),
+ np.mean(rolling_window(trace.samples, window), -1).astype(
+ dtype=trace.samples.dtype))
@public
@@ -51,9 +53,12 @@ def recenter(trace: Trace) -> Trace:
@public
def normalize(trace: Trace) -> Trace:
- return Trace(copy(trace.title), copy(trace.data), (trace.samples - np.mean(trace.samples)) / np.std(trace.samples))
+ return Trace(copy(trace.title), copy(trace.data),
+ (trace.samples - np.mean(trace.samples)) / np.std(trace.samples))
@public
def normalize_wl(trace: Trace) -> Trace:
- return Trace(copy(trace.title), copy(trace.data), (trace.samples - np.mean(trace.samples)) / (np.std(trace.samples) * len(trace.samples)))
+ return Trace(copy(trace.title), copy(trace.data),
+ (trace.samples - np.mean(trace.samples)) / (
+ np.std(trace.samples) * len(trace.samples)))
diff --git a/pyecsca/sampling.py b/pyecsca/sampling.py
index 73e34b5..b8d690d 100644
--- a/pyecsca/sampling.py
+++ b/pyecsca/sampling.py
@@ -1,7 +1,7 @@
-from copy import copy
import numpy as np
-from scipy.signal import decimate
+from copy import copy
from public import public
+from scipy.signal import decimate
from .trace import Trace
diff --git a/pyecsca/trace.py b/pyecsca/trace.py
index 56e39d3..ab68827 100644
--- a/pyecsca/trace.py
+++ b/pyecsca/trace.py
@@ -1,6 +1,6 @@
import weakref
from numpy import ndarray
-from typing import Optional
+from typing import Optional, Sequence
class Trace(object):
@@ -33,7 +33,7 @@ class Trace(object):
class CombinedTrace(Trace):
def __init__(self, title: Optional[str], data: Optional[bytes],
- samples: ndarray, trace_set=None, parents=None):
+ samples: ndarray, trace_set=None, parents: Sequence[Trace] = None):
super().__init__(title, data, samples, trace_set=trace_set)
self.parents = None
if parents is not None: