mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-20 06:45:14 +03:00
Comment updates; Add channel filtering explanation
This commit is contained in:
parent
9a5fcb1719
commit
a115a38892
6 changed files with 69 additions and 34 deletions
|
@ -16,6 +16,7 @@
|
|||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "axis.h"
|
||||
|
@ -260,55 +261,74 @@ void rotateV(struct fp_vector *v, fp_angles_t *delta)
|
|||
// Quick median filter implementation
|
||||
// (c) N. Devillard - 1998
|
||||
// http://ndevilla.free.fr/median/median.pdf
|
||||
#define QMF_SORT(a,b) { if ((a)>(b)) QMF_SWAP((a),(b)); }
|
||||
#define QMF_SWAP(a,b) { int32_t temp=(a);(a)=(b);(b)=temp; }
|
||||
#define QMF_COPY(p,v,n) { int32_t i; for (i=0; i<n; i++) p[i]=v[i]; }
|
||||
#define QMF_SORT(type,a,b) { if ((a)>(b)) QMF_SWAP(type, (a),(b)); }
|
||||
#define QMF_SWAP(type,a,b) { type temp=(a);(a)=(b);(b)=temp; }
|
||||
|
||||
int32_t quickMedianFilter3(int32_t * v)
|
||||
{
|
||||
int32_t p[3];
|
||||
QMF_COPY(p, v, 3);
|
||||
memcpy(p, v, sizeof(p));
|
||||
|
||||
QMF_SORT(p[0], p[1]); QMF_SORT(p[1], p[2]); QMF_SORT(p[0], p[1]) ;
|
||||
QMF_SORT(int32_t, p[0], p[1]); QMF_SORT(int32_t, p[1], p[2]); QMF_SORT(int32_t, p[0], p[1]) ;
|
||||
return p[1];
|
||||
}
|
||||
|
||||
int16_t quickMedianFilter3_16(int16_t * v)
|
||||
{
|
||||
int16_t p[3];
|
||||
memcpy(p, v, sizeof(p));
|
||||
|
||||
QMF_SORT(int16_t, p[0], p[1]); QMF_SORT(int16_t, p[1], p[2]); QMF_SORT(int16_t, p[0], p[1]) ;
|
||||
return p[1];
|
||||
}
|
||||
|
||||
int32_t quickMedianFilter5(int32_t * v)
|
||||
{
|
||||
int32_t p[5];
|
||||
QMF_COPY(p, v, 5);
|
||||
memcpy(p, v, sizeof(p));
|
||||
|
||||
QMF_SORT(p[0], p[1]); QMF_SORT(p[3], p[4]); QMF_SORT(p[0], p[3]);
|
||||
QMF_SORT(p[1], p[4]); QMF_SORT(p[1], p[2]); QMF_SORT(p[2], p[3]);
|
||||
QMF_SORT(p[1], p[2]);
|
||||
QMF_SORT(int32_t, p[0], p[1]); QMF_SORT(int32_t, p[3], p[4]); QMF_SORT(int32_t, p[0], p[3]);
|
||||
QMF_SORT(int32_t, p[1], p[4]); QMF_SORT(int32_t, p[1], p[2]); QMF_SORT(int32_t, p[2], p[3]);
|
||||
QMF_SORT(int32_t, p[1], p[2]);
|
||||
return p[2];
|
||||
}
|
||||
|
||||
int16_t quickMedianFilter5_16(int16_t * v)
|
||||
{
|
||||
int16_t p[5];
|
||||
memcpy(p, v, sizeof(p));
|
||||
|
||||
QMF_SORT(int16_t, p[0], p[1]); QMF_SORT(int16_t, p[3], p[4]); QMF_SORT(int16_t, p[0], p[3]);
|
||||
QMF_SORT(int16_t, p[1], p[4]); QMF_SORT(int16_t, p[1], p[2]); QMF_SORT(int16_t, p[2], p[3]);
|
||||
QMF_SORT(int16_t, p[1], p[2]);
|
||||
return p[2];
|
||||
}
|
||||
|
||||
int32_t quickMedianFilter7(int32_t * v)
|
||||
{
|
||||
int32_t p[7];
|
||||
QMF_COPY(p, v, 7);
|
||||
memcpy(p, v, sizeof(p));
|
||||
|
||||
QMF_SORT(p[0], p[5]); QMF_SORT(p[0], p[3]); QMF_SORT(p[1], p[6]);
|
||||
QMF_SORT(p[2], p[4]); QMF_SORT(p[0], p[1]); QMF_SORT(p[3], p[5]);
|
||||
QMF_SORT(p[2], p[6]); QMF_SORT(p[2], p[3]); QMF_SORT(p[3], p[6]);
|
||||
QMF_SORT(p[4], p[5]); QMF_SORT(p[1], p[4]); QMF_SORT(p[1], p[3]);
|
||||
QMF_SORT(p[3], p[4]);
|
||||
QMF_SORT(int32_t, p[0], p[5]); QMF_SORT(int32_t, p[0], p[3]); QMF_SORT(int32_t, p[1], p[6]);
|
||||
QMF_SORT(int32_t, p[2], p[4]); QMF_SORT(int32_t, p[0], p[1]); QMF_SORT(int32_t, p[3], p[5]);
|
||||
QMF_SORT(int32_t, p[2], p[6]); QMF_SORT(int32_t, p[2], p[3]); QMF_SORT(int32_t, p[3], p[6]);
|
||||
QMF_SORT(int32_t, p[4], p[5]); QMF_SORT(int32_t, p[1], p[4]); QMF_SORT(int32_t, p[1], p[3]);
|
||||
QMF_SORT(int32_t, p[3], p[4]);
|
||||
return p[3];
|
||||
}
|
||||
|
||||
int32_t quickMedianFilter9(int32_t * v)
|
||||
{
|
||||
int32_t p[9];
|
||||
QMF_COPY(p, v, 9);
|
||||
memcpy(p, v, sizeof(p));
|
||||
|
||||
QMF_SORT(p[1], p[2]); QMF_SORT(p[4], p[5]); QMF_SORT(p[7], p[8]);
|
||||
QMF_SORT(p[0], p[1]); QMF_SORT(p[3], p[4]); QMF_SORT(p[6], p[7]);
|
||||
QMF_SORT(p[1], p[2]); QMF_SORT(p[4], p[5]); QMF_SORT(p[7], p[8]);
|
||||
QMF_SORT(p[0], p[3]); QMF_SORT(p[5], p[8]); QMF_SORT(p[4], p[7]);
|
||||
QMF_SORT(p[3], p[6]); QMF_SORT(p[1], p[4]); QMF_SORT(p[2], p[5]);
|
||||
QMF_SORT(p[4], p[7]); QMF_SORT(p[4], p[2]); QMF_SORT(p[6], p[4]);
|
||||
QMF_SORT(p[4], p[2]);
|
||||
QMF_SORT(int32_t, p[1], p[2]); QMF_SORT(int32_t, p[4], p[5]); QMF_SORT(int32_t, p[7], p[8]);
|
||||
QMF_SORT(int32_t, p[0], p[1]); QMF_SORT(int32_t, p[3], p[4]); QMF_SORT(int32_t, p[6], p[7]);
|
||||
QMF_SORT(int32_t, p[1], p[2]); QMF_SORT(int32_t, p[4], p[5]); QMF_SORT(int32_t, p[7], p[8]);
|
||||
QMF_SORT(int32_t, p[0], p[3]); QMF_SORT(int32_t, p[5], p[8]); QMF_SORT(int32_t, p[4], p[7]);
|
||||
QMF_SORT(int32_t, p[3], p[6]); QMF_SORT(int32_t, p[1], p[4]); QMF_SORT(int32_t, p[2], p[5]);
|
||||
QMF_SORT(int32_t, p[4], p[7]); QMF_SORT(int32_t, p[4], p[2]); QMF_SORT(int32_t, p[6], p[4]);
|
||||
QMF_SORT(int32_t, p[4], p[2]);
|
||||
return p[4];
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue