From 6aaac04ad27c567e252cf7fd7bf907d9fadb4423 Mon Sep 17 00:00:00 2001 From: Nicolas Gravillon Date: Sat, 29 Jul 2023 16:24:03 +0200 Subject: [PATCH] Included Bandpass filter. --- doc24652.pdf | Bin 0 -> 56508 bytes filter.c | 43 +++++++++++++++++++++++++++++++++++++++---- filter.h | 27 ++++++++++++++++++--------- 3 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 doc24652.pdf diff --git a/doc24652.pdf b/doc24652.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4d04bce9c0afcd895c7164c85099088ac6f26219 GIT binary patch literal 56508 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 z�|xsgD;qvGFQu5k)nPcer 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 literal 0 HcmV?d00001 diff --git a/filter.c b/filter.c index 0e1ee24..7cd9b29 100644 --- a/filter.c +++ b/filter.c @@ -213,14 +213,49 @@ ChebFilter* create_che_filter(int NP, double PR, int LH, double FC) { return(filter); } -ChebFilter* create_bw_low_pass_filter(int NP, double FC) { - return(create_che_filter(NP, 0, 0, FC)); +dChebFilter* create_bw_low_pass_filter(int NP, double FC) { + dChebFilter *filter=(dChebFilter*)malloc(sizeof(dChebFilter)); + + filter->type=0; + filter->lp_filter=create_che_filter(NP, 0, 0, FC); + filter->hp_filter=NULL; + + return(filter); } -ChebFilter* create_bw_high_pass_filter(int NP, double FC) { - return(create_che_filter(NP, 0, 1, FC)); +dChebFilter* create_bw_high_pass_filter(int NP, double FC) { + dChebFilter *filter=(dChebFilter*)malloc(sizeof(dChebFilter)); + + filter->type=1; + filter->lp_filter=NULL; + filter->hp_filter=create_che_filter(NP, 0, 1, FC); + + return(filter); } +dChebFilter* create_bw_bp_pass_filter(int NP, double FC, double winwidth) { + dChebFilter *filter=(dChebFilter*)malloc(sizeof(dChebFilter)); + + filter->type=2; + filter->lp_filter=create_che_filter(NP, 0, 0, FC*(1.0+fabsl(winwidth))); + filter->hp_filter=create_che_filter(NP, 0, 1, FC*(1.0-fabsl(winwidth))); + + return(filter); +} + +double applydfilter(dChebFilter* filter, double X0) { + double output=X0; + + if(filter->lp_filter!=NULL) + output=applyfilter(filter->lp_filter, output); + + if(filter->hp_filter!=NULL) + output=applyfilter(filter->hp_filter, output); + + return(output); +} + + ChebFilter* create_che_low_pass_filter(int NP, double FC, double PR) { return(create_che_filter(NP, PR, 0, FC)); } diff --git a/filter.h b/filter.h index a891f68..83cef5d 100644 --- a/filter.h +++ b/filter.h @@ -1,14 +1,14 @@ typedef struct filter { - double a[20]; - double b[20]; + double a[20]; // inputs coefficients + double b[20]; // output coefficients - double X[20]; - double Y[20]; + double X[20]; // history of inputs + double Y[20]; // history of outputs - int NP; + int NP; // Nomber of Poles - Order - double a0; + double a0; // internal double a1; double a2; double b0; @@ -16,13 +16,22 @@ typedef struct filter { double b2; } ChebFilter; + +typedef struct doublefilter { + int type; + ChebFilter *lp_filter; + ChebFilter *hp_filter; +} dChebFilter; + ChebFilter* call_205(int P, ChebFilter* filter, double FC, int NP, int LH, double PR); ChebFilter* create_che_filter(int NP, double PR, int LH, double FC); -ChebFilter* create_bw_low_pass_filter(int NP, double FC); - -ChebFilter* create_bw_high_pass_filter(int NP, double FC); ChebFilter* create_che_low_pass_filter(int NP, double FC, double PR); ChebFilter* create_che_high_pass_filter(int NP, double FC, double PR); + +dChebFilter* create_bw_low_pass_filter(int NP, double FC); +dChebFilter* create_bw_high_pass_filter(int NP, double FC); +dChebFilter* create_bw_bp_pass_filter(int NP, double FC, double winwidth); + double applyfilter(ChebFilter* filter, double X0); \ No newline at end of file