collection of audio DSP plugins
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

85 lines
2.1 KiB

/*
* Foo
*
* This is a dummy module. It doesn't do much.
* Feel free to use this as a boilerplate template.
*
*/
#include <stdlib.h>
#include "soundpipe.h"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
int sp_hilbert_create(sp_hilbert **p)
{
*p = malloc(sizeof(sp_hilbert));
return SP_OK;
}
int sp_hilbert_destroy(sp_hilbert **p)
{
free(*p);
return SP_OK;
}
int sp_hilbert_init(sp_data *sp, sp_hilbert *p)
{
int j;
SPFLOAT onedsr = 1.0 / sp->sr;
/* pole values taken from Bernie Hutchins, "Musical Engineer's Handbook" */
SPFLOAT poles[12] = {0.3609, 2.7412, 11.1573, 44.7581, 179.6242, 798.4578,
1.2524, 5.5671, 22.3423, 89.6271, 364.7914, 2770.1114};
SPFLOAT polefreq, rc, alpha, beta;
/* calculate coefficients for allpass filters, based on sampling rate */
for (j=0; j<12; j++) {
polefreq = poles[j] * 15.0;
rc = 1.0 / (2.0 * M_PI * polefreq);
alpha = 1.0 / rc;
alpha = alpha * 0.5 * onedsr;
beta = (1.0 - alpha) / (1.0 + alpha);
p->xnm1[j] = p->ynm1[j] = 0.0;
p->coef[j] = -(SPFLOAT)beta;
}
return SP_OK;
}
int sp_hilbert_compute(sp_data *sp, sp_hilbert *p, SPFLOAT *in, SPFLOAT *out1, SPFLOAT *out2)
{
SPFLOAT xn1 = 0;
SPFLOAT yn1 = 0;
SPFLOAT xn2 = 0;
SPFLOAT yn2 = 0;
SPFLOAT *coef;
int j;
coef = p->coef;
xn1 = *in;
/* 6th order allpass filter for sine output. Structure is
* 6 first-order allpass sections in series. Coefficients
* taken from arrays calculated at i-time.
*/
for (j=0; j < 6; j++) {
yn1 = coef[j] * (xn1 - p->ynm1[j]) + p->xnm1[j];
p->xnm1[j] = xn1;
p->ynm1[j] = yn1;
xn1 = yn1;
}
xn2 = *in;
/* 6th order allpass filter for cosine output. Structure is
* 6 first-order allpass sections in series. Coefficients
* taken from arrays calculated at i-time.
*/
for (j=6; j < 12; j++) {
yn2 = coef[j] * (xn2 - p->ynm1[j]) + p->xnm1[j];
p->xnm1[j] = xn2;
p->ynm1[j] = yn2;
xn2 = yn2;
}
*out1 = yn2;
*out2 = yn1;
return SP_OK;
}