aboutsummaryrefslogtreecommitdiffhomepage
path: root/pyecsca/align.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyecsca/align.py')
-rw-r--r--pyecsca/align.py52
1 files changed, 39 insertions, 13 deletions
diff --git a/pyecsca/align.py b/pyecsca/align.py
index 1c4b891..ff586ab 100644
--- a/pyecsca/align.py
+++ b/pyecsca/align.py
@@ -63,6 +63,7 @@ def align_correlation(reference: Trace, *traces: Trace,
correlation = np.correlate(trace_part, reference_part, "same")
max_correlation_offset = correlation.argmax(axis=0)
max_correlation = correlation[max_correlation_offset]
+ del trace_part
if max_correlation < min_correlation:
return False, 0
left_space = min(max_offset, reference_offset)
@@ -103,25 +104,26 @@ def align_peaks(reference: Trace, *traces: Trace,
@public
-def align_sad(reference: Trace, *traces: Trace,
- reference_offset: int, reference_length: int, max_offset: int) -> List[Trace]:
+def align_offset(reference: Trace, *traces: Trace,
+ reference_offset: int, reference_length: int, max_offset: int,
+ dist_func: Callable[[np.ndarray, np.ndarray], float], max_dist: float = float("inf")) -> List[Trace]:
"""
- Align `traces` to the reference `trace` so that the Sum Of Absolute Differences between the
- reference trace window from `reference_offset` of `reference_length` and the trace being aligned
- within `max_offset` of the reference window is maximized.
+ Align `traces` to the reference `trace` so that the value of the `dist_func` is minimized
+ between the reference trace window from `reference_offset` of `reference_length` and the trace
+ being aligned within `max_offset` of the reference window.
:param reference:
:param traces:
:param reference_offset:
:param reference_length:
:param max_offset:
+ :param dist_func:
:return:
"""
reference_part = reference.samples[reference_offset: reference_offset + reference_length]
-
def align_func(trace):
length = len(trace.samples)
- best_sad = 0
+ best_distance = 0
best_offset = 0
for offset in range(-max_offset, max_offset):
start = reference_offset + offset
@@ -129,17 +131,41 @@ def align_sad(reference: Trace, *traces: Trace,
if start < 0 or stop >= length:
continue
trace_part = trace.samples[start:stop]
- # todo: add other distance functions here
- sad = np.sum(np.abs(reference_part - trace_part))
- if sad > best_sad:
- best_sad = sad
+ distance = dist_func(reference_part, trace_part)
+ if distance < best_distance:
+ best_distance = distance
best_offset = offset
- return True, best_offset
-
+ if best_distance < max_dist:
+ return True, best_offset
+ else:
+ return False, 0
return align_reference(reference, *traces, align_func=align_func)
@public
+def align_sad(reference: Trace, *traces: Trace,
+ reference_offset: int, reference_length: int, max_offset: int) -> List[Trace]:
+ """
+ Align `traces` to the reference `trace` so that the Sum Of Absolute Differences between the
+ reference trace window from `reference_offset` of `reference_length` and the trace being aligned
+ within `max_offset` of the reference window is maximized.
+
+ :param reference:
+ :param traces:
+ :param reference_offset:
+ :param reference_length:
+ :param max_offset:
+ :return:
+ """
+ def sad(reference_part, trace_part):
+ return float(np.sum(np.abs(reference_part - trace_part)))
+
+ return align_offset(reference, *traces,
+ reference_offset=reference_offset, reference_length=reference_length,
+ max_offset=max_offset, dist_func=sad)
+
+
+@public
def align_dtw_scale(reference: Trace, *traces: Trace, radius: int = 1,
fast: bool = True) -> List[Trace]:
"""