124 lines
3.6 KiB
C
124 lines
3.6 KiB
C
/**********************************************************************
|
|
|
|
resamplesubs.c
|
|
|
|
Real-time library interface by Dominic Mazzoni
|
|
|
|
Based on resample-1.7:
|
|
http://www-ccrma.stanford.edu/~jos/resample/
|
|
|
|
License: LGPL - see the file LICENSE.txt for more information
|
|
|
|
This file provides the routines that do sample-rate conversion
|
|
on small arrays, calling routines from filterkit.
|
|
|
|
**********************************************************************/
|
|
|
|
/* Definitions */
|
|
#include "resample_defs.h"
|
|
|
|
#include "filterkit.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
|
|
/* Sampling rate up-conversion only subroutine;
|
|
* Slightly faster than down-conversion;
|
|
*/
|
|
int lrsSrcUp(float X[],
|
|
float Y[],
|
|
double factor,
|
|
double *TimePtr,
|
|
UWORD Nx,
|
|
UWORD Nwing,
|
|
float LpScl,
|
|
float Imp[],
|
|
float ImpD[],
|
|
BOOL Interp)
|
|
{
|
|
float *Xp, *Ystart;
|
|
float v;
|
|
|
|
double CurrentTime = *TimePtr;
|
|
double dt; /* Step through input signal */
|
|
double endTime; /* When Time reaches EndTime, return to user */
|
|
|
|
dt = 1.0/factor; /* Output sampling period */
|
|
|
|
Ystart = Y;
|
|
endTime = CurrentTime + Nx;
|
|
while (CurrentTime < endTime)
|
|
{
|
|
double LeftPhase = CurrentTime-floor(CurrentTime);
|
|
double RightPhase = 1.0 - LeftPhase;
|
|
|
|
Xp = &X[(int)CurrentTime]; /* Ptr to current input sample */
|
|
/* Perform left-wing inner product */
|
|
v = lrsFilterUp(Imp, ImpD, Nwing, Interp, Xp,
|
|
LeftPhase, -1);
|
|
/* Perform right-wing inner product */
|
|
v += lrsFilterUp(Imp, ImpD, Nwing, Interp, Xp+1,
|
|
RightPhase, 1);
|
|
|
|
v *= LpScl; /* Normalize for unity filter gain */
|
|
|
|
*Y++ = v; /* Deposit output */
|
|
CurrentTime += dt; /* Move to next sample by time increment */
|
|
}
|
|
|
|
*TimePtr = CurrentTime;
|
|
return (Y - Ystart); /* Return the number of output samples */
|
|
}
|
|
|
|
/* Sampling rate conversion subroutine */
|
|
|
|
int lrsSrcUD(float X[],
|
|
float Y[],
|
|
double factor,
|
|
double *TimePtr,
|
|
UWORD Nx,
|
|
UWORD Nwing,
|
|
float LpScl,
|
|
float Imp[],
|
|
float ImpD[],
|
|
BOOL Interp)
|
|
{
|
|
float *Xp, *Ystart;
|
|
float v;
|
|
|
|
double CurrentTime = (*TimePtr);
|
|
double dh; /* Step through filter impulse response */
|
|
double dt; /* Step through input signal */
|
|
double endTime; /* When Time reaches EndTime, return to user */
|
|
|
|
dt = 1.0/factor; /* Output sampling period */
|
|
|
|
dh = MIN(Npc, factor*Npc); /* Filter sampling period */
|
|
|
|
Ystart = Y;
|
|
endTime = CurrentTime + Nx;
|
|
while (CurrentTime < endTime)
|
|
{
|
|
double LeftPhase = CurrentTime-floor(CurrentTime);
|
|
double RightPhase = 1.0 - LeftPhase;
|
|
|
|
Xp = &X[(int)CurrentTime]; /* Ptr to current input sample */
|
|
/* Perform left-wing inner product */
|
|
v = lrsFilterUD(Imp, ImpD, Nwing, Interp, Xp,
|
|
LeftPhase, -1, dh);
|
|
/* Perform right-wing inner product */
|
|
v += lrsFilterUD(Imp, ImpD, Nwing, Interp, Xp+1,
|
|
RightPhase, 1, dh);
|
|
|
|
v *= LpScl; /* Normalize for unity filter gain */
|
|
*Y++ = v; /* Deposit output */
|
|
|
|
CurrentTime += dt; /* Move to next sample by time increment */
|
|
}
|
|
|
|
*TimePtr = CurrentTime;
|
|
return (Y - Ystart); /* Return the number of output samples */
|
|
}
|