mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
better median for clietside 10%-90% only. thanks for the suggestion @doegox!. Device side still uses old algo
This commit is contained in:
parent
3e0b93f199
commit
9a0ca9c4cd
1 changed files with 76 additions and 17 deletions
|
@ -38,11 +38,12 @@
|
||||||
|
|
||||||
#include "lfdemod.h"
|
#include "lfdemod.h"
|
||||||
#include <string.h> // for memset, memcmp and size_t
|
#include <string.h> // for memset, memcmp and size_t
|
||||||
|
#include <stdlib.h> // qsort
|
||||||
#include "parity.h" // for parity test
|
#include "parity.h" // for parity test
|
||||||
#include "pm3_cmd.h" // error codes
|
#include "pm3_cmd.h" // error codes
|
||||||
//**********************************************************************************************
|
// **********************************************************************************************
|
||||||
//---------------------------------Utilities Section--------------------------------------------
|
// ---------------------------------Utilities Section--------------------------------------------
|
||||||
//**********************************************************************************************
|
// **********************************************************************************************
|
||||||
#define LOWEST_DEFAULT_CLOCK 32
|
#define LOWEST_DEFAULT_CLOCK 32
|
||||||
#define FSK_PSK_THRESHOLD 123
|
#define FSK_PSK_THRESHOLD 123
|
||||||
|
|
||||||
|
@ -81,18 +82,53 @@ static void printSignal(void) {
|
||||||
prnt(" THRESHOLD noise amplitude......%d", NOISE_AMPLITUDE_THRESHOLD);
|
prnt(" THRESHOLD noise amplitude......%d", NOISE_AMPLITUDE_THRESHOLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ON_DEVICE
|
||||||
|
static int cmp_uint8(const void *a, const void *b) {
|
||||||
|
if (*(const uint8_t *)a < * (const uint8_t *)b)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return *(const uint8_t *)a > *(const uint8_t *)b;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void computeSignalProperties(uint8_t *samples, uint32_t size) {
|
void computeSignalProperties(uint8_t *samples, uint32_t size) {
|
||||||
resetSignal();
|
resetSignal();
|
||||||
|
|
||||||
|
if (samples == NULL || size < SIGNAL_MIN_SAMPLES) return;
|
||||||
|
|
||||||
uint32_t sum = 0;
|
uint32_t sum = 0;
|
||||||
for (uint32_t i = 0; i < size; i++) {
|
uint32_t offset_size = size - SIGNAL_IGNORE_FIRST_SAMPLES;
|
||||||
|
|
||||||
|
#ifndef ON_DEVICE
|
||||||
|
uint8_t tmp[offset_size];
|
||||||
|
memcpy(tmp, samples + SIGNAL_IGNORE_FIRST_SAMPLES, sizeof(tmp));
|
||||||
|
qsort(tmp, sizeof(tmp), sizeof(uint8_t), cmp_uint8);
|
||||||
|
|
||||||
|
uint8_t low10 = 0.5 * (tmp[(int)(offset_size * 0.1)] + tmp[(int)((offset_size - 1) * 0.1)]);
|
||||||
|
uint8_t hi90 = 0.5 * (tmp[(int)(offset_size * 0.9)] + tmp[(int)((offset_size - 1) * 0.9)]);
|
||||||
|
uint32_t cnt = 0;
|
||||||
|
for (uint32_t i = SIGNAL_IGNORE_FIRST_SAMPLES; i < size; i++) {
|
||||||
|
|
||||||
|
if (samples[i] < signalprop.low) signalprop.low = samples[i];
|
||||||
|
if (samples[i] > signalprop.high) signalprop.high = samples[i];
|
||||||
|
|
||||||
|
if (samples[i] < low10 || samples[i] > hi90)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
sum += samples[i];
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
signalprop.mean = sum / cnt;
|
||||||
|
#else
|
||||||
|
for (uint32_t i = SIGNAL_IGNORE_FIRST_SAMPLES; i < size; i++) {
|
||||||
if (samples[i] < signalprop.low) signalprop.low = samples[i];
|
if (samples[i] < signalprop.low) signalprop.low = samples[i];
|
||||||
if (samples[i] > signalprop.high) signalprop.high = samples[i];
|
if (samples[i] > signalprop.high) signalprop.high = samples[i];
|
||||||
sum += samples[i];
|
sum += samples[i];
|
||||||
}
|
}
|
||||||
|
signalprop.mean = sum / offset_size;
|
||||||
|
#endif
|
||||||
|
|
||||||
// measure amplitude of signal
|
// measure amplitude of signal
|
||||||
signalprop.mean = sum / size;
|
|
||||||
signalprop.amplitude = signalprop.high - signalprop.mean;
|
signalprop.amplitude = signalprop.high - signalprop.mean;
|
||||||
// By measuring mean and look at amplitude of signal from HIGH / LOW,
|
// By measuring mean and look at amplitude of signal from HIGH / LOW,
|
||||||
// we can detect noise
|
// we can detect noise
|
||||||
|
@ -106,9 +142,32 @@ void removeSignalOffset(uint8_t *samples, uint32_t size) {
|
||||||
if (samples == NULL || size < SIGNAL_MIN_SAMPLES) return;
|
if (samples == NULL || size < SIGNAL_MIN_SAMPLES) return;
|
||||||
|
|
||||||
int acc_off = 0;
|
int acc_off = 0;
|
||||||
|
uint32_t offset_size = size - SIGNAL_IGNORE_FIRST_SAMPLES;
|
||||||
|
|
||||||
|
#ifndef ON_DEVICE
|
||||||
|
|
||||||
|
uint8_t tmp[offset_size];
|
||||||
|
memcpy(tmp, samples + SIGNAL_IGNORE_FIRST_SAMPLES, sizeof(tmp));
|
||||||
|
qsort(tmp, sizeof(tmp), sizeof(uint8_t), cmp_uint8);
|
||||||
|
|
||||||
|
uint8_t low10 = 0.5 * (tmp[(int)(offset_size * 0.05)] + tmp[(int)((offset_size - 1) * 0.05)]);
|
||||||
|
uint8_t hi90 = 0.5 * (tmp[(int)(offset_size * 0.95)] + tmp[(int)((offset_size - 1) * 0.95)]);
|
||||||
|
int32_t cnt = 0;
|
||||||
|
for (uint32_t i = SIGNAL_IGNORE_FIRST_SAMPLES; i < size; i++) {
|
||||||
|
|
||||||
|
if (samples[i] < low10 || samples[i] > hi90)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
acc_off += samples[i] - 128;
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
acc_off /= cnt;
|
||||||
|
#else
|
||||||
for (uint32_t i = SIGNAL_IGNORE_FIRST_SAMPLES; i < size; i++)
|
for (uint32_t i = SIGNAL_IGNORE_FIRST_SAMPLES; i < size; i++)
|
||||||
acc_off += samples[i] - 128;
|
acc_off += samples[i] - 128;
|
||||||
acc_off /= (int)(size - SIGNAL_IGNORE_FIRST_SAMPLES);
|
|
||||||
|
acc_off /= (int)offset_size;
|
||||||
|
#endif
|
||||||
|
|
||||||
// shift and saturate samples to center the mean
|
// shift and saturate samples to center the mean
|
||||||
for (uint32_t i = 0; i < size; i++) {
|
for (uint32_t i = 0; i < size; i++) {
|
||||||
|
@ -265,13 +324,13 @@ bool preambleSearchEx(uint8_t *bits, uint8_t *preamble, size_t pLen, size_t *siz
|
||||||
//first index found
|
//first index found
|
||||||
foundCnt++;
|
foundCnt++;
|
||||||
if (foundCnt == 1) {
|
if (foundCnt == 1) {
|
||||||
prnt("DEBUG: (preambleSearchEx) preamble found at %i", idx);
|
if (g_debugMode >= 1) prnt("DEBUG: (preambleSearchEx) preamble found at %i", idx);
|
||||||
*startIdx = idx;
|
*startIdx = idx;
|
||||||
if (findone)
|
if (findone)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (foundCnt == 2) {
|
if (foundCnt == 2) {
|
||||||
prnt("DEBUG: (preambleSearchEx) preamble 2 found at %i", idx);
|
if (g_debugMode >= 1) prnt("DEBUG: (preambleSearchEx) preamble 2 found at %i", idx);
|
||||||
*size = idx - *startIdx;
|
*size = idx - *startIdx;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -479,9 +538,9 @@ bool DetectCleanAskWave(uint8_t *dest, size_t size, uint8_t high, uint8_t low) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//**********************************************************************************************
|
// **********************************************************************************************
|
||||||
//-------------------Clock / Bitrate Detection Section------------------------------------------
|
// -------------------Clock / Bitrate Detection Section------------------------------------------
|
||||||
//**********************************************************************************************
|
// **********************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
// by marshmellow
|
// by marshmellow
|
||||||
|
@ -1176,9 +1235,9 @@ uint8_t detectFSKClk(uint8_t *bits, size_t size, uint8_t fcHigh, uint8_t fcLow,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//**********************************************************************************************
|
// **********************************************************************************************
|
||||||
//--------------------Modulation Demods &/or Decoding Section-----------------------------------
|
// --------------------Modulation Demods &/or Decoding Section-----------------------------------
|
||||||
//**********************************************************************************************
|
// **********************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
// look for Sequence Terminator - should be pulses of clk*(1 or 2), clk*2, clk*(1.5 or 2), by idx we mean graph position index...
|
// look for Sequence Terminator - should be pulses of clk*(1 or 2), clk*2, clk*(1.5 or 2), by idx we mean graph position index...
|
||||||
|
@ -1985,9 +2044,9 @@ int pskRawDemod(uint8_t *dest, size_t *size, int *clock, int *invert) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//**********************************************************************************************
|
// **********************************************************************************************
|
||||||
//-----------------Tag format detection section-------------------------------------------------
|
// -----------------Tag format detection section-------------------------------------------------
|
||||||
//**********************************************************************************************
|
// **********************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
// by marshmellow
|
// by marshmellow
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue