/*
* filter.h
*
* Copyright (c) 2018 Disi A
*
* Author: Disi A
* Email: adis@live.cn
* https://www.mathworks.com/matlabcentral/profile/authors/3734620-disi-a
*/
#ifndef filter_h
#define filter_h
#if __cplusplus
extern "C"{
#endif
#define DOUBLE_PRECISION 0
#if DOUBLE_PRECISION
#define FTR_PRECISION double
#if defined(_WIN32) || defined(__ZEPHYR__)
#define M_PI 3.141592653589793238462643383279502884197163993751
#endif
#else
#define FTR_PRECISION float
#if defined(_WIN32) || defined(__ZEPHYR__)
#define M_PI 3.1415927f
#endif
#endif
typedef struct {
int n;
FTR_PRECISION *A;
FTR_PRECISION *d1;
FTR_PRECISION *d2;
FTR_PRECISION *w0;
FTR_PRECISION *w1;
FTR_PRECISION *w2;
} BWLowPass;
// BWHighPass uses exactly the same struct
typedef BWLowPass BWHighPass;
typedef struct {
int m;
FTR_PRECISION ep;
FTR_PRECISION *A;
FTR_PRECISION *d1;
FTR_PRECISION *d2;
FTR_PRECISION *w0;
FTR_PRECISION *w1;
FTR_PRECISION *w2;
} CHELowPass;
typedef CHELowPass CHEHighPass;
typedef struct {
int n;
FTR_PRECISION *A;
FTR_PRECISION *d1;
FTR_PRECISION *d2;
FTR_PRECISION *d3;
FTR_PRECISION *d4;
FTR_PRECISION *w0;
FTR_PRECISION *w1;
FTR_PRECISION *w2;
FTR_PRECISION *w3;
FTR_PRECISION *w4;
} BWBandPass;
typedef struct {
int m;
FTR_PRECISION ep;
FTR_PRECISION *A;
FTR_PRECISION *d1;
FTR_PRECISION *d2;
FTR_PRECISION *d3;
FTR_PRECISION *d4;
FTR_PRECISION *w0;
FTR_PRECISION *w1;
FTR_PRECISION *w2;
FTR_PRECISION *w3;
FTR_PRECISION *w4;
} CHEBandPass;
typedef struct {
int n;
FTR_PRECISION r;
FTR_PRECISION s;
FTR_PRECISION *A;
FTR_PRECISION *d1;
FTR_PRECISION *d2;
FTR_PRECISION *d3;
FTR_PRECISION *d4;
FTR_PRECISION *w0;
FTR_PRECISION *w1;
FTR_PRECISION *w2;
FTR_PRECISION *w3;
FTR_PRECISION *w4;
} BWBandStop;
typedef struct {
int m;
FTR_PRECISION ep;
FTR_PRECISION r;
FTR_PRECISION s;
FTR_PRECISION *A;
FTR_PRECISION *d1;
FTR_PRECISION *d2;
FTR_PRECISION *d3;
FTR_PRECISION *d4;
FTR_PRECISION *w0;
FTR_PRECISION *w1;
FTR_PRECISION *w2;
FTR_PRECISION *w3;
FTR_PRECISION *w4;
} CHEBandStop;
void update_bw_low_pass_filter(BWLowPass* filter, FTR_PRECISION s, FTR_PRECISION f, FTR_PRECISION q);
BWLowPass* create_bw_low_pass_filter(int order, FTR_PRECISION sampling_frequency, FTR_PRECISION half_power_frequency);
BWHighPass* create_bw_high_pass_filter(int order, FTR_PRECISION sampling_frequency, FTR_PRECISION half_power_frequency);
BWBandPass* create_bw_band_pass_filter(int order, FTR_PRECISION sampling_frequency, FTR_PRECISION lower_half_power_frequency, FTR_PRECISION upper_half_power_frequency);
BWBandStop* create_bw_band_stop_filter(int order, FTR_PRECISION sampling_frequency, FTR_PRECISION lower_half_power_frequency, FTR_PRECISION upper_half_power_frequency);
CHELowPass* create_che_low_pass_filter(int order, FTR_PRECISION epsilon, FTR_PRECISION sampling_frequency, FTR_PRECISION half_power_frequency);
CHEHighPass* create_che_high_pass_filter(int order, FTR_PRECISION epsilon, FTR_PRECISION sampling_frequency, FTR_PRECISION half_power_frequency);
CHEBandPass* create_che_band_pass_filter(int order, FTR_PRECISION epsilon, FTR_PRECISION sampling_frequency, FTR_PRECISION lower_half_power_frequency, FTR_PRECISION upper_half_power_frequency);
CHEBandStop* create_che_band_stop_filter(int order, FTR_PRECISION epsilon, FTR_PRECISION sampling_frequency, FTR_PRECISION lower_half_power_frequency, FTR_PRECISION upper_half_power_frequency);
void free_bw_low_pass(BWLowPass* filter);
void free_bw_high_pass(BWHighPass* filter);
void free_bw_band_pass(BWBandPass* filter);
void free_bw_band_stop(BWBandStop* filter);
void free_che_low_pass(CHELowPass* filter);
void free_che_high_pass(CHEHighPass* filter);
void free_che_band_pass(CHEBandPass* filter);
void free_che_band_stop(CHEBandStop* filter);
FTR_PRECISION bw_low_pass(BWLowPass* filter, FTR_PRECISION input);
FTR_PRECISION bw_high_pass(BWHighPass* filter, FTR_PRECISION input);
FTR_PRECISION bw_band_pass(BWBandPass* filter, FTR_PRECISION input);
FTR_PRECISION bw_band_stop(BWBandStop* filter, FTR_PRECISION input);
FTR_PRECISION che_low_pass(CHELowPass* filter, FTR_PRECISION input);
FTR_PRECISION che_high_pass(CHEHighPass* filter, FTR_PRECISION input);
FTR_PRECISION che_band_pass(CHEBandPass* filter, FTR_PRECISION input);
FTR_PRECISION che_band_stop(CHEBandStop* filter, FTR_PRECISION input);
FTR_PRECISION softmax(FTR_PRECISION* data, int size, int target_ind);
// Output should be pre-allocated which has the same(or larger) size as the input.
void spike_filter_upward(FTR_PRECISION * input, int size, FTR_PRECISION * output, FTR_PRECISION strength);
#if __cplusplus
}
#endif
#endif /* filter_h */