mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-02-13 02:34:48 +08: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){
|
||||
iceIIR_Butterworth(GraphBuffer, GraphTraceLen);
|
||||
|
||||
uint8_t k = param_get8(Cmd,0);
|
||||
//iceIIR_Butterworth(GraphBuffer, GraphTraceLen);
|
||||
iceSimple_Filter(GraphBuffer, GraphTraceLen, k);
|
||||
RepaintGraphWindow();
|
||||
return 0;
|
||||
}
|
||||
|
|
38
client/ui.c
38
client/ui.c
|
@ -85,10 +85,14 @@ void iceIIR_Butterworth(int *data, const size_t len){
|
|||
int i,j;
|
||||
|
||||
int * output = (int* ) malloc(sizeof(int) * len);
|
||||
memset(output, 0x00, len);
|
||||
float fc = 0.1125f; // center frequency
|
||||
size_t adjustedLen = len;
|
||||
if ( !output ) return;
|
||||
|
||||
// clear mem
|
||||
memset(output, 0x00, len);
|
||||
|
||||
size_t adjustedLen = len;
|
||||
float fc = 0.1125f; // center frequency
|
||||
|
||||
// create very simple low-pass filter to remove images (2nd-order Butterworth)
|
||||
float complex iir_buf[3] = {0,0,0};
|
||||
float b[3] = {0.003621681514929, 0.007243363029857, 0.003621681514929};
|
||||
|
@ -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;
|
||||
|
||||
for (i=0; i<adjustedLen; ++i) {
|
||||
for (i = 0; i < adjustedLen; ++i) {
|
||||
|
||||
sample = data[i];
|
||||
|
||||
|
@ -118,16 +122,38 @@ void iceIIR_Butterworth(int *data, const size_t len){
|
|||
float freq = cargf(x*conjf(x_prime));
|
||||
x_prime = x; // retain this sample for next iteration
|
||||
|
||||
output[i] =(freq > 0)? 10 : -10;
|
||||
output[i] =(freq > 0) ? 127 : -127;
|
||||
}
|
||||
|
||||
// show data
|
||||
//memcpy(data, output, adjustedLen);
|
||||
for (j=0; j<adjustedLen; ++j)
|
||||
data[j] = output[j];
|
||||
|
||||
|
||||
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 Res;
|
||||
|
|
|
@ -42,4 +42,5 @@ extern int offline;
|
|||
extern int flushAfterWrite; //buzzy
|
||||
|
||||
void iceIIR_Butterworth(int * data, const size_t len);
|
||||
void iceSimple_Filter(int *data, const size_t len, uint8_t k);
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue