2010-05-25 15:03:14 -04:00
|
|
|
#ifndef __SMA_BUFFER_H__
|
|
|
|
#define __SMA_BUFFER_H__
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
2010-05-26 13:30:29 -05:00
|
|
|
#ifndef _MSC_VER
|
2010-05-25 15:03:14 -04:00
|
|
|
#include <stdint.h>
|
2010-05-26 13:30:29 -05:00
|
|
|
#endif
|
2010-05-25 15:03:14 -04:00
|
|
|
#include <string.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include "buffer.h"
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
size_t len;
|
|
|
|
BUFF_TYPE *data;
|
|
|
|
BUFF_TYPE sma;
|
|
|
|
size_t pos;
|
|
|
|
size_t lpos;
|
|
|
|
} sma_buffer_t;
|
|
|
|
|
|
|
|
#define INIT_SMA_BUFFER(b, l, s) \
|
2010-05-26 13:30:29 -05:00
|
|
|
{ \
|
2010-05-25 15:03:14 -04:00
|
|
|
(void)memset((b), 0, sizeof(sma_buffer_t)); \
|
|
|
|
(b)->len = (l); \
|
|
|
|
(b)->data = (BUFF_TYPE *)switch_core_session_alloc((s), sizeof(BUFF_TYPE) * (l)); \
|
|
|
|
assert((b)->data != NULL); \
|
|
|
|
(void)memset((b)->data, 0, sizeof(BUFF_TYPE) * (l)); \
|
|
|
|
(b)->sma = 0.0; \
|
|
|
|
(b)->pos = 0; \
|
|
|
|
(b)->lpos = 0; \
|
2010-05-26 13:30:29 -05:00
|
|
|
}
|
2010-05-25 15:03:14 -04:00
|
|
|
|
|
|
|
#define GET_SMA_SAMPLE(b, p) ((b)->data[(p) % (b)->len])
|
|
|
|
#define SET_SMA_SAMPLE(b, p, v) ((b)->data[(p) % (b)->len] = (v))
|
|
|
|
#define GET_CURRENT_SMA_POS(b) ((b)->lpos)
|
|
|
|
|
|
|
|
#define INC_SMA_POS(b) \
|
2010-05-26 13:30:29 -05:00
|
|
|
{ \
|
2010-05-25 15:03:14 -04:00
|
|
|
(b)->lpos++; \
|
|
|
|
(b)->pos = (b)->lpos % (b)->len; \
|
2010-05-26 13:30:29 -05:00
|
|
|
}
|
2010-05-25 15:03:14 -04:00
|
|
|
|
|
|
|
#define APPEND_SMA_VAL(b, v) \
|
2010-05-26 13:30:29 -05:00
|
|
|
{ \
|
2010-05-25 15:03:14 -04:00
|
|
|
INC_SMA_POS(b); \
|
|
|
|
(b)->sma -= ((b)->data[(b)->pos] / (BUFF_TYPE)(b)->len); \
|
|
|
|
(b)->data[(b)->pos] = (v); \
|
|
|
|
(b)->sma += ((b)->data[(b)->pos] / (BUFF_TYPE)(b)->len); \
|
2010-05-26 13:30:29 -05:00
|
|
|
}
|
2010-05-25 15:03:14 -04:00
|
|
|
|
|
|
|
#define RESET_SMA_BUFFER(b) \
|
2010-05-26 13:30:29 -05:00
|
|
|
{ \
|
2010-05-25 15:03:14 -04:00
|
|
|
(b)->sma = 0.0; \
|
|
|
|
(void)memset((b)->data, 0, sizeof(BUFF_TYPE) * (b)->len); \
|
2010-05-26 13:30:29 -05:00
|
|
|
}
|
2010-05-25 15:03:14 -04:00
|
|
|
|
|
|
|
/*
|
|
|
|
#define DESTROY_SMA_BUFFER(b) \
|
|
|
|
do{ \
|
|
|
|
free((b)->data); \
|
|
|
|
}while(0);
|
|
|
|
|
|
|
|
*/
|
|
|
|
#endif
|
|
|
|
/*
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
sma_buffer_t b;
|
|
|
|
|
|
|
|
INIT_SMA_BUFFER(&b, 100);
|
|
|
|
|
|
|
|
for(i = 0; i < 20; i++){
|
|
|
|
APPEND_SMA_VAL(&b, 100.0);
|
|
|
|
printf("SMA = %lf\n", b.sma);
|
|
|
|
}
|
|
|
|
|
|
|
|
DESTROY_SMA_BUFFER(&b);
|
|
|
|
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
*/
|
|
|
|
|