diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 8926329ba..6e8059ce8 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -814,9 +814,13 @@ static int Cmdaskrawdemod(const char *Cmd) { int AutoCorrelate(const int *in, int *out, size_t len, size_t window, bool SaveGrph, bool verbose) { // sanity check - if (window > len) window = len; + if (window > len) { + window = len; + } - if (verbose) PrintAndLogEx(INFO, "performing " _YELLOW_("%zu") " correlations", g_GraphTraceLen - window); + if (verbose) { + PrintAndLogEx(INFO, "performing " _YELLOW_("%zu") " correlations", g_GraphTraceLen - window); + } //test double autocv = 0.0; // Autocovariance value @@ -830,6 +834,9 @@ int AutoCorrelate(const int *in, int *out, size_t len, size_t window, bool SaveG int *correl_buf = calloc(MAX_GRAPH_TRACE_LEN, sizeof(int)); + uint8_t peak_cnt = 0; + size_t peaks[10] = {0}; + for (size_t i = 0; i < len - window; ++i) { for (size_t j = 0; j < (len - i); j++) { @@ -844,44 +851,38 @@ int AutoCorrelate(const int *in, int *out, size_t len, size_t window, bool SaveG double ac_value = autocv / variance; // keep track of which distance is repeating. - if (ac_value > 1) { + // A value near 1.0 or more indicates a correlation in the signal + if (ac_value > 0.95) { correlation = i - lastmax; lastmax = i; + + if ((correlation > 1) && peak_cnt < ARRAYLEN(peaks)) { + peaks[peak_cnt++] = correlation; + } } } - // - int hi = 0, idx = 0; - int distance = 0, hi_1 = 0, idx_1 = 0; - for (size_t i = 0; i <= len; ++i) { - if (correl_buf[i] > hi) { - hi = correl_buf[i]; - idx = i; + // Find shorts distance between peaks + int distance = -1; + for (size_t i = 0; i < ARRAYLEN(peaks); ++i) { + + if (peaks[i] < 2) { + continue; + } + + if (distance == -1) { + distance = peaks[i]; + continue; + } + + if (peaks[i] < distance) { + distance = peaks[i]; } } - for (size_t i = idx + 1; i <= window; ++i) { - if (correl_buf[i] > hi_1) { - hi_1 = correl_buf[i]; - idx_1 = i; - } - } - - int foo = ABS(hi - hi_1); - int bar = (int)((int)((hi + hi_1) / 2) * 0.04); - - int retval = correlation; - - if (foo < bar) { - distance = (idx_1 - idx); - retval = distance; + if (distance > -1) { if (verbose) { - PrintAndLogEx(SUCCESS, "possible visible correlation "_YELLOW_("%4d") " samples", distance); - } - - } else if (correlation > 1) { - if (verbose) { - PrintAndLogEx(SUCCESS, "possible correlation " _YELLOW_("%4zu") " samples", correlation); + PrintAndLogEx(SUCCESS, "possible correlation at "_YELLOW_("%4d") " samples", distance); } } else { PrintAndLogEx(HINT, "no repeating pattern found, try increasing window size"); @@ -892,20 +893,12 @@ int AutoCorrelate(const int *in, int *out, size_t len, size_t window, bool SaveG if (SaveGrph) { //g_GraphTraceLen = g_GraphTraceLen - window; memcpy(out, correl_buf, len * sizeof(int)); - if (distance > 0) { - setClockGrid(distance, idx); - retval = distance; - } else { - setClockGrid(correlation, idx); - } - - g_CursorCPos = idx_1; - g_CursorDPos = idx_1 + retval; + setClockGrid(distance, 0); g_DemodBufferLen = 0; RepaintGraphWindow(); } free(correl_buf); - return retval; + return distance; } static int CmdAutoCorr(const char *Cmd) { @@ -1413,7 +1406,8 @@ int NRZrawDemod(int clk, int invert, int maxErr, bool verbose) { if (errCnt > 0 && (verbose || g_debugMode)) PrintAndLogEx(DEBUG, "DEBUG: (NRZrawDemod) Errors during Demoding (shown as 7 in bit stream): %d", errCnt); if (verbose || g_debugMode) { - PrintAndLogEx(SUCCESS, "NRZ demoded bitstream:"); + PrintAndLogEx(SUCCESS, "NRZ demoded bitstream"); + PrintAndLogEx(INFO, "---------------------"); // Now output the bitstream to the scrollback by line of 16 bits printDemodBuff(0, false, invert, false); } diff --git a/client/src/cmdlf.c b/client/src/cmdlf.c index 0e0410c5c..7f7c95edc 100644 --- a/client/src/cmdlf.c +++ b/client/src/cmdlf.c @@ -1555,11 +1555,11 @@ out: return retval; } -static int check_autocorrelate(int clock) { +static int check_autocorrelate(const char *prefix, int clock) { PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(INFO, _CYAN_("Performing auto correlations...")); - for (int win = 4000; win < 30000; win += 2000) { + PrintAndLogEx(INFO, _CYAN_("%s - auto correlations"), prefix); + for (int win = 2000; win < 30000; win += 2000) { int ans = AutoCorrelate(g_GraphBuffer, g_GraphBuffer, g_GraphTraceLen, win, false, false); if (ans == -1) { continue; @@ -1912,68 +1912,93 @@ int CmdLFfind(const char *Cmd) { PrintAndLogEx(INFO, _CYAN_("Checking for unknown tags...") "\n"); // FSK + PrintAndLogEx(INFO, "FSK clock.......... " NOLF); int clock = GetFskClock("", false); if (clock) { + PrintAndLogEx(NORMAL, _GREEN_("detected")); if (FSKrawDemod(0, 0, 0, 0, true) == PM3_SUCCESS) { PrintAndLogEx(INFO, _GREEN_("FSK") " modulation detected!"); - check_autocorrelate(clock); + check_autocorrelate("FSK", clock); if (search_cont) { found++; } else { goto out; } - } + } else { + PrintAndLogEx(INFO, "FSK demodulation... " _RED_("failed")); + } + } else { + PrintAndLogEx(NORMAL, _RED_("no")); } // ASK + PrintAndLogEx(INFO, "ASK clock.......... " NOLF); clock = GetAskClock("", false); if (clock) { + PrintAndLogEx(NORMAL, _GREEN_("detected")); bool st = true; if (ASKDemod_ext(0, 0, 0, 0, false, true, false, 1, &st) == PM3_SUCCESS) { + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, _GREEN_("ASK") " modulation / Manchester encoding detected!"); PrintAndLogEx(INFO, "if it does not look right it could instead be ASK/Biphase - try " _YELLOW_("'data rawdemod --ab'")); - check_autocorrelate(clock); + check_autocorrelate("ASK", clock); if (search_cont) { found++; } else { goto out; } + } else { + PrintAndLogEx(INFO, "ASK demodulation... " _RED_("failed")); } + } else { + PrintAndLogEx(NORMAL, _RED_("no")); } // NZR + PrintAndLogEx(INFO, "NRZ clock.......... " NOLF); clock = GetNrzClock("", false); if (clock) { - if (NRZrawDemod(0, 0, 0,false) == PM3_SUCCESS) { + PrintAndLogEx(NORMAL, _GREEN_("detected")); + if (NRZrawDemod(0, 0, 0, true) == PM3_SUCCESS) { PrintAndLogEx(INFO, _GREEN_("NRZ") " modulation detected!"); - check_autocorrelate(clock); + check_autocorrelate("NRZ", clock); if (search_cont) { found++; } else { goto out; } - } + } else { + PrintAndLogEx(INFO, "NRZ demodulation... " _RED_("failed")); + } + } else { + PrintAndLogEx(NORMAL, _RED_("no")); } // PSK + PrintAndLogEx(INFO, "PSK clock.......... " NOLF); clock = GetPskClock("", false); - if (clock) { + if (clock) { + PrintAndLogEx(NORMAL, _GREEN_("detected")); if (CmdPSK1rawDemod("") == PM3_SUCCESS) { PrintAndLogEx(INFO, "Possible " _GREEN_("PSK1") " modulation detected!"); PrintAndLogEx(INFO, " Could also be PSK2 - try " _YELLOW_("'data rawdemod --p2'")); PrintAndLogEx(INFO, " Could also be PSK3 - [currently not supported]"); PrintAndLogEx(INFO, " Could also be NRZ - try " _YELLOW_("'data rawdemod --nr")); - check_autocorrelate(clock); + check_autocorrelate("PSK", clock); if (search_cont) { found++; } else { goto out; } + } else { + PrintAndLogEx(INFO, "PSK demodulation... " _RED_("failed")); } + } else { + PrintAndLogEx(NORMAL, _RED_("no")); } if (found == 0) {