diff options
| -rw-r--r-- | pyecsca/align.py | 19 | ||||
| -rw-r--r-- | pyecsca/edit.py | 10 | ||||
| -rw-r--r-- | pyecsca/filter.py | 7 | ||||
| -rw-r--r-- | pyecsca/process.py | 13 | ||||
| -rw-r--r-- | pyecsca/sampling.py | 4 | ||||
| -rw-r--r-- | pyecsca/trace.py | 4 |
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: |
