Skip to content

Commit

Permalink
dsp libs
Browse files Browse the repository at this point in the history
  • Loading branch information
catompiler committed May 8, 2019
1 parent e07a838 commit ac7443c
Show file tree
Hide file tree
Showing 14 changed files with 906 additions and 0 deletions.
39 changes: 39 additions & 0 deletions dsp/avg.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#include "avg.h"


err_t avg_init(avg_t* avg)
{
avg->count = 0;
avg->data = 0;
avg->sum = 0;

return E_NO_ERROR;
}

void avg_reset(avg_t* avg)
{
avg->sum = 0;
avg->data = 0;
avg->count = 0;
}

void avg_put(avg_t* avg, avg_data_t data)
{
avg->sum = iq15_add(avg->sum, data);
avg->count ++;
}

avg_data_t avg_calc(avg_t* avg)
{
if(avg->count > 1){
avg->data = iq15_idiv(avg->sum, (int32_t)avg->count);
}else if(avg->count == 1){
avg->data = avg->sum;
}else{
avg->data = 0;
}
avg->sum = 0;
avg->count = 0;

return avg->data;
}
66 changes: 66 additions & 0 deletions dsp/avg.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/**
* @file avg.h Библиотека усреднениея.
*/

#ifndef AVG_H_
#define AVG_H_

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "errors/errors.h"
#include "defs/defs.h"
#include "q15/q15.h"

//! Тип данных для усреднения.
typedef q15_t avg_data_t;

//! Тип суммы данных для усреднения.
typedef iq15_t avg_sum_t;

//! Структура усреднения.
typedef struct _Avg {
size_t count; //!< Количество элементов для усреднения.
avg_sum_t sum; //!< Сумма данных.
avg_data_t data; //!< Текущие данные.
} avg_t;


/**
* Инициализирует усреднение.
* @param avg Усреднение.
* @return Код ошибки.
*/
extern err_t avg_init(avg_t* avg);

/**
* Сбрасывает усреднение.
* @param avg Усреднение.
*/
extern void avg_reset(avg_t* avg);

/**
* Помещает данные в усреднение.
* @param avg Усреднение.
* @param data Данные.
*/
extern void avg_put(avg_t* avg, avg_data_t data);

/**
* Вычисляет среднее.
* @param avg Усреднение.
* @return Последние данные.
*/
extern avg_data_t avg_calc(avg_t* avg);

/**
* Получает последние данные.
* @param avg Усреднение.
* @return Последние данные.
*/
ALWAYS_INLINE static avg_data_t avg_data(avg_t* avg)
{
return avg->data;
}

#endif /* AVG_H_ */
31 changes: 31 additions & 0 deletions dsp/decim.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include "decim.h"


err_t decim_init(decim_t* decim, size_t scale)
{
if(scale == 0) return E_INVALID_VALUE;

decim->scale = scale;
decim->index = 0;
decim->data = 0;

return E_NO_ERROR;
}

void decim_reset(decim_t* decim)
{
decim->data = 0;
decim->index = 0;
}

void decim_put(decim_t* decim, decim_data_t data)
{
size_t next = decim->index + 1;

if(next >= decim->scale){
decim->data = data;
next = 0;
}

decim->index = next;
}
86 changes: 86 additions & 0 deletions dsp/decim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/**
* @file decim.h Библиотека дециматора.
*/

#ifndef DECIM_H_
#define DECIM_H_

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "errors/errors.h"
#include "defs/defs.h"
#include "q15/q15.h"

//! Тип данных для децимации.
typedef q15_t decim_data_t;

//! Структура дециматора.
typedef struct _Decim {
size_t scale; //!< Коэффициент децимации.
size_t index; //!< Счётчик семплов.
decim_data_t data; //!< Текущие данные.
} decim_t;


/**
* Инициализирует дециматор.
* @param decim Дециматор.
* @param scale Коэффициент децимации.
* @return Код ошибки.
*/
extern err_t decim_init(decim_t* decim, size_t scale);

/**
* Сбрасывает дециматор.
* @param decim Дециматор.
*/
extern void decim_reset(decim_t* decim);

/**
* Помещает данные в дециматор.
* @param decim Дециматор.
* @param data Данные.
*/
extern void decim_put(decim_t* decim, decim_data_t data);

/**
* Получает флаг готовности данных.
* @param decim Дециматор.
* @return Флаг готовности данных.
*/
ALWAYS_INLINE static bool decim_ready(decim_t* decim)
{
return decim->index == 0;
}

/**
* Получает последние данные.
* @param decim Дециматор.
* @return Последние данные.
*/
ALWAYS_INLINE static decim_data_t decim_data(decim_t* decim)
{
return decim->data;
}
/**
* Получает коэффициент децимации.
* @param decim Дециматор.
* @return Коэффициент децимации.
*/
ALWAYS_INLINE static size_t decim_scale(decim_t* decim)
{
return decim->scale;
}

/**
* Получает смещение с последней выборки исходного сигнала.
* @param decim Дециматор.
* @return Смещение.
*/
ALWAYS_INLINE static size_t decim_skew(decim_t* decim)
{
return decim->index;
}

#endif /* DECIM_H_ */
42 changes: 42 additions & 0 deletions dsp/decim_avg.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#include "decim_avg.h"


err_t decim_avg_init(decim_avg_t* decim, size_t scale)
{
if(scale == 0) return E_INVALID_VALUE;

decim->scale = scale;
decim->index = 0;
decim->data = 0;
decim->sum = 0;

return E_NO_ERROR;
}

void decim_avg_reset(decim_avg_t* decim)
{
decim->sum = 0;
decim->data = 0;
decim->index = 0;
}

void decim_avg_put(decim_avg_t* decim, decim_avg_data_t data)
{
size_t next = decim->index + 1;

decim->sum = iq15_add(decim->sum, data);

if(next >= decim->scale){
if(decim->scale > 1){
decim->data = iq15_idiv(decim->sum, (int32_t)decim->scale);
}else if(decim->scale == 1){
decim->data = decim->sum;
}else{
decim->data = 0;
}
decim->sum = 0;
next = 0;
}

decim->index = next;
}
90 changes: 90 additions & 0 deletions dsp/decim_avg.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/**
* @file decim_avg_avg.h Библиотека дециматора с усреднением.
*/

#ifndef DECIM_AVG_H_
#define DECIM_AVG_H_

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "errors/errors.h"
#include "defs/defs.h"
#include "q15.h"

//! Тип данных для децимации.
typedef q15_t decim_avg_data_t;

//! Тип суммы данных для децимации.
typedef iq15_t decim_avg_sum_t;

//! Структура дециматора.
typedef struct _Decim_Avg {
size_t scale; //!< Коэффициент децимации.
size_t index; //!< Счётчик семплов.
decim_avg_sum_t sum; //!< Сумма данных.
decim_avg_data_t data; //!< Текущие данные.
} decim_avg_t;


/**
* Инициализирует дециматор.
* @param decim Дециматор.
* @param scale Коэффициент децимации.
* @return Код ошибки.
*/
extern err_t decim_avg_init(decim_avg_t* decim, size_t scale);

/**
* Сбрасывает дециматор.
* @param decim Дециматор.
*/
extern void decim_avg_reset(decim_avg_t* decim);

/**
* Помещает данные в дециматор.
* @param decim Дециматор.
* @param data Данные.
*/
extern void decim_avg_put(decim_avg_t* decim, decim_avg_data_t data);

/**
* Получает флаг готовности данных.
* @param decim Дециматор.
* @return Флаг готовности данных.
*/
ALWAYS_INLINE static bool decim_avg_ready(decim_avg_t* decim)
{
return decim->index == 0;
}

/**
* Получает последние данные.
* @param decim Дециматор.
* @return Последние данные.
*/
ALWAYS_INLINE static decim_avg_data_t decim_avg_data(decim_avg_t* decim)
{
return decim->data;
}
/**
* Получает коэффициент децимации.
* @param decim Дециматор.
* @return Коэффициент децимации.
*/
ALWAYS_INLINE static size_t decim_avg_scale(decim_avg_t* decim)
{
return decim->scale;
}

/**
* Получает смещение с последней выборки исходного сигнала.
* @param decim Дециматор.
* @return Смещение.
*/
ALWAYS_INLINE static size_t decim_avg_skew(decim_avg_t* decim)
{
return decim->index;
}

#endif /* DECIM_H_ */
39 changes: 39 additions & 0 deletions dsp/edge_detect.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#include "edge_detect.h"

//! Маска детектора фронта.
#define EDGE_DETECT_MASK 0x3



void edge_detect_init(edge_detect_t* edge_detect)
{
edge_detect->data = EDGE_DETECT_LOW;
}

void edge_detect_reset(edge_detect_t* edge_detect)
{
edge_detect->data = EDGE_DETECT_LOW;
}

void edge_detect_reset_value(edge_detect_t* edge_detect, bool value)
{
edge_detect->data = value ? EDGE_DETECT_HIGH : EDGE_DETECT_LOW;
}

edge_detect_state_t edge_detect_put(edge_detect_t* edge_detect, bool value)
{
uint32_t data = edge_detect->data;
uint32_t bit = value & 0x1;

data = ((data << 1) | bit);

edge_detect->data = (uint8_t)(data & EDGE_DETECT_MASK);

return (edge_detect_state_t)edge_detect->data;
}

edge_detect_state_t edge_detect_state(edge_detect_t* edge_detect)
{
return (edge_detect_state_t)edge_detect->data;
}

Loading

0 comments on commit ac7443c

Please sign in to comment.