mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 21:33:47 -07:00
ADD: added a simple averging filter function. input parameter K, can be 1 to 8
ref: http://www.edn.com/design/systems-design/4320010/A-simple-software-lowpass-filter-suits-embedded-system-applications
This commit is contained in:
parent
7aa24806f4
commit
4c543dbd3f
3 changed files with 37 additions and 7 deletions
|
@ -2417,7 +2417,10 @@ int Cmdhex2bin(const char *Cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdDataIIR(const char *Cmd){
|
int CmdDataIIR(const char *Cmd){
|
||||||
iceIIR_Butterworth(GraphBuffer, GraphTraceLen);
|
|
||||||
|
uint8_t k = param_get8(Cmd,0);
|
||||||
|
//iceIIR_Butterworth(GraphBuffer, GraphTraceLen);
|
||||||
|
iceSimple_Filter(GraphBuffer, GraphTraceLen, k);
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
32
client/ui.c
32
client/ui.c
|
@ -85,9 +85,13 @@ void iceIIR_Butterworth(int *data, const size_t len){
|
||||||
int i,j;
|
int i,j;
|
||||||
|
|
||||||
int * output = (int* ) malloc(sizeof(int) * len);
|
int * output = (int* ) malloc(sizeof(int) * len);
|
||||||
|
if ( !output ) return;
|
||||||
|
|
||||||
|
// clear mem
|
||||||
memset(output, 0x00, len);
|
memset(output, 0x00, len);
|
||||||
float fc = 0.1125f; // center frequency
|
|
||||||
size_t adjustedLen = len;
|
size_t adjustedLen = len;
|
||||||
|
float fc = 0.1125f; // center frequency
|
||||||
|
|
||||||
// create very simple low-pass filter to remove images (2nd-order Butterworth)
|
// create very simple low-pass filter to remove images (2nd-order Butterworth)
|
||||||
float complex iir_buf[3] = {0,0,0};
|
float complex iir_buf[3] = {0,0,0};
|
||||||
|
@ -98,7 +102,7 @@ void iceIIR_Butterworth(int *data, const size_t len){
|
||||||
float complex x_prime = 1.0f; // save sample for estimating frequency
|
float complex x_prime = 1.0f; // save sample for estimating frequency
|
||||||
float complex x;
|
float complex x;
|
||||||
|
|
||||||
for (i=0; i<adjustedLen; ++i) {
|
for (i = 0; i < adjustedLen; ++i) {
|
||||||
|
|
||||||
sample = data[i];
|
sample = data[i];
|
||||||
|
|
||||||
|
@ -118,16 +122,38 @@ void iceIIR_Butterworth(int *data, const size_t len){
|
||||||
float freq = cargf(x*conjf(x_prime));
|
float freq = cargf(x*conjf(x_prime));
|
||||||
x_prime = x; // retain this sample for next iteration
|
x_prime = x; // retain this sample for next iteration
|
||||||
|
|
||||||
output[i] =(freq > 0)? 10 : -10;
|
output[i] =(freq > 0) ? 127 : -127;
|
||||||
}
|
}
|
||||||
|
|
||||||
// show data
|
// show data
|
||||||
|
//memcpy(data, output, adjustedLen);
|
||||||
for (j=0; j<adjustedLen; ++j)
|
for (j=0; j<adjustedLen; ++j)
|
||||||
data[j] = output[j];
|
data[j] = output[j];
|
||||||
|
|
||||||
free(output);
|
free(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iceSimple_Filter(int *data, const size_t len, uint8_t k){
|
||||||
|
// ref: http://www.edn.com/design/systems-design/4320010/A-simple-software-lowpass-filter-suits-embedded-system-applications
|
||||||
|
// parameter K
|
||||||
|
#define FILTER_SHIFT 4
|
||||||
|
|
||||||
|
int32_t filter_reg = 0;
|
||||||
|
int16_t input, output;
|
||||||
|
int8_t shift = (k <=8 ) ? k : FILTER_SHIFT;
|
||||||
|
|
||||||
|
for (int i = 0; i < len; ++i){
|
||||||
|
|
||||||
|
input = data[i];
|
||||||
|
// Update filter with current sample
|
||||||
|
filter_reg = filter_reg - (filter_reg >> shift) + input;
|
||||||
|
|
||||||
|
// Scale output for unity gain
|
||||||
|
output = filter_reg >> shift;
|
||||||
|
data[i] = output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float complex cexpf (float complex Z)
|
float complex cexpf (float complex Z)
|
||||||
{
|
{
|
||||||
float complex Res;
|
float complex Res;
|
||||||
|
|
|
@ -42,4 +42,5 @@ extern int offline;
|
||||||
extern int flushAfterWrite; //buzzy
|
extern int flushAfterWrite; //buzzy
|
||||||
|
|
||||||
void iceIIR_Butterworth(int * data, const size_t len);
|
void iceIIR_Butterworth(int * data, const size_t len);
|
||||||
|
void iceSimple_Filter(int *data, const size_t len, uint8_t k);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue