git-svn-id: http://moon:8086/svn/software/trunk/projects/JaySynth@37 b431acfa-c32f-4a4a-93f1-934dc6c82436
130 lines
2.6 KiB
C
130 lines
2.6 KiB
C
// --------------------------------------------------------------
|
|
// --------------------------------------------------------------
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
|
|
#include "synth_defs.h"
|
|
#include "smooth.h"
|
|
|
|
// --------------------------------------------------------------
|
|
// Exported functions
|
|
// --------------------------------------------------------------
|
|
void Smooth_Update(smooth_t *pObj)
|
|
{
|
|
pObj->a_r = (synth_float_t)1/(pObj->fs*pObj->T_r*SMOOTH_KE);
|
|
pObj->a_f = (synth_float_t)1/(pObj->fs*pObj->T_f);
|
|
}
|
|
|
|
void Smooth_Init(smooth_t *pObj, synth_float_t fs, synth_float_t T_r, synth_float_t T_f, synth_float_t inital_value)
|
|
{
|
|
pObj->fs = fs;
|
|
pObj->T_r = T_r;
|
|
pObj->T_f = T_f;
|
|
pObj->y = inital_value;
|
|
Smooth_Update(pObj);
|
|
}
|
|
|
|
void Smooth_Free(smooth_t *pObj)
|
|
{
|
|
}
|
|
|
|
void Smooth_SetValue(smooth_t *pObj, synth_float_t value)
|
|
{
|
|
pObj->y = value;
|
|
}
|
|
|
|
void Smooth_SetFS(smooth_t *pObj, synth_float_t fs)
|
|
{
|
|
pObj->fs = fs;
|
|
Smooth_Update(pObj);
|
|
}
|
|
|
|
void Smooth_SetT(smooth_t *pObj, synth_float_t T_r, synth_float_t T_f)
|
|
{
|
|
pObj->T_r = T_r;
|
|
pObj->T_f = T_f;
|
|
Smooth_Update(pObj);
|
|
}
|
|
|
|
synth_float_t Smooth_ProcessScalar(smooth_t *pObj, synth_float_t x_hard, synth_float_t in)
|
|
{
|
|
if (pObj->y < x_hard)
|
|
pObj->y += pObj->a_r*(x_hard - pObj->y);
|
|
else
|
|
pObj->y += pObj->a_f*(x_hard - pObj->y);
|
|
|
|
return pObj->y*in;
|
|
}
|
|
|
|
void Smooth_Process_VV(smooth_t *pObj, synth_float_t x_hard, synth_float_t *pIn, synth_float_t *pOut, UINT32 len)
|
|
{
|
|
UINT32 i;
|
|
|
|
if (Smooth_is_settled(pObj, x_hard) && (fabs(x_hard) < 1E-18))
|
|
{
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
pOut[i] = 0;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (Smooth_is_settled(pObj, x_hard))
|
|
{
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
pOut[i] = x_hard*pIn[i];
|
|
}
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
if (pObj->y < x_hard)
|
|
pObj->y += pObj->a_r*(x_hard - pObj->y);
|
|
else
|
|
pObj->y += pObj->a_f*(x_hard - pObj->y);
|
|
|
|
pOut[i] = pObj->y*pIn[i];
|
|
}
|
|
}
|
|
|
|
void Smooth_Process_V(smooth_t *pObj, synth_float_t x_hard, synth_float_t *pOut, UINT32 len)
|
|
{
|
|
UINT32 i;
|
|
|
|
if (Smooth_is_settled(pObj, x_hard) && (fabs(x_hard) < 1E-18))
|
|
{
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
pOut[i] = 0;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (Smooth_is_settled(pObj, x_hard))
|
|
{
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
pOut[i] = x_hard;
|
|
}
|
|
return;
|
|
}
|
|
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
if (pObj->y < x_hard)
|
|
pObj->y += pObj->a_r*(x_hard - pObj->y);
|
|
else
|
|
pObj->y += pObj->a_f*(x_hard - pObj->y);
|
|
|
|
pOut[i] = pObj->y;
|
|
}
|
|
}
|
|
|
|
UINT32 Smooth_is_settled(smooth_t *pObj, synth_float_t x_hard)
|
|
{
|
|
return (fabs(pObj->y - x_hard) < SMOOTH_TOL);
|
|
}
|