X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/146c201cbe67cf3967cb497b3d67fb579c3ccb0e..0d704c7f5e1ddcf2a4e18f9f5759e6779a30119a:/client/data_operations.c diff --git a/client/data_operations.c b/client/data_operations.c new file mode 100644 index 00000000..f694600c --- /dev/null +++ b/client/data_operations.c @@ -0,0 +1,58 @@ +#include + +extern void PrintAndLog(char *fmt, ...); + +int autoCorr(const int* in, int *out, size_t len, int window) +{ + static int CorrelBuffer[MAX_GRAPH_TRACE_LEN]; + + if (window == 0) { + PrintAndLog("needs a window"); + return 0; + } + if (window >= len) { + PrintAndLog("window must be smaller than trace (%d samples)", + len); + return 0; + } + + PrintAndLog("performing %d correlations", len - window); + + for (int i = 0; i < len - window; ++i) { + int sum = 0; + for (int j = 0; j < window; ++j) { + sum += (in[j]*in[i + j]) / 256; + } + CorrelBuffer[i] = sum; + } + //GraphTraceLen = GraphTraceLen - window; + memcpy(out, CorrelBuffer, len * sizeof (int)); + return 0; +} +int directionalThreshold(const int* in, int *out, size_t len, int8_t up, int8_t down) +{ + int lastValue = in[0]; + out[0] = 0; // Will be changed at the end, but init 0 as we adjust to last samples value if no threshold kicks in. + + for (int i = 1; i < len; ++i) { + // Apply first threshold to samples heading up + if (in[i] >= up && in[i] > lastValue) + { + lastValue = out[i]; // Buffer last value as we overwrite it. + out[i] = 1; + } + // Apply second threshold to samples heading down + else if (in[i] <= down && in[i] < lastValue) + { + lastValue = out[i]; // Buffer last value as we overwrite it. + out[i] = -1; + } + else + { + lastValue = out[i]; // Buffer last value as we overwrite it. + out[i] = out[i-1]; + } + } + out[0] = out[1]; // Align with first edited sample. + return 0; +}