SPRAAK
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
Data Structures | Enumerations | Functions
API_LowLvl::lib::preproc::mod
+ Collaboration diagram for API_LowLvl::lib::preproc::mod:

Data Structures

struct  SprAGCInfo
 
struct  SprSDFX
 
struct  SprSDKD
 

Enumerations

enum  { SPR_FB_WARP_LIN1, SPR_FB_WARP_LIN2, SPR_FB_NWARPMETHOD }
 

Functions

int spr_agc_connect (SprSspDesc *ssp_des, const char *agc_name, void(*func)(SprAGCInfo *), void *ext_info, int query_sz[5])
 
void spr_aut2lpc_levinson (float spr_autocorr[], float refl_coeff[], float LPC_filter[], int order, float LPC_filter_old[])
 
void spr_autocorr (const float in[], int nparam, float out[], int ncorr)
 
void spr_crosscorr (float in[], float in2[], int nparam, float cr[], float cl[], int ncorr)
 

Detailed Description

Enumeration Type Documentation

anonymous enum
Enumerator
SPR_FB_WARP_LIN1 
SPR_FB_WARP_LIN2 
SPR_FB_NWARPMETHOD 

Function Documentation

int spr_agc_connect ( SprSspDesc ssp_des,
const char *  agc_name,
void(*)(SprAGCInfo *)  func,
void *  ext_info,
int  query_sz[5] 
)

Install a function func to interprete the histogram for the AGC with name agc_name. This function may update the record volume (or whatever parameter controls the range of the input data), but this must be reported back by setting the gain_adapt in the AGCinfo structure ext_info to 1.0/gain, with gain the linear gain change corresponding to the adjustment of the record volume.
If the query_sz parameter is not NULL, the following information is returned as well: query_sz = {Nsamples_per_frame, nfr_per_fragment, nfrag_per_hist, nskipa, nskips}

Returns
(-1) on failure (no AGC with the given name found, or this AGC had already an update function installed). Otherwise, a 0 is returned.
void spr_aut2lpc_levinson ( float  spr_autocorr[],
float  refl_coeff[],
float  LPC_filter[],
int  order,
float  LPC_filter_old[] 
)

Convert autocorrelation coefficients autocorr[0..order] to reflection coefficients refl_coeff[1..order] and lpc filter coefficients LPC_filter1..order. The coefficient zero of all those vectors are filled in as follows:

  • LPC_filter[0] = LPC_gain = sqrt(alpha),
  • refl_coeff[0] = autocorr[0] (the average energy).
//initialisation:
LPC_filter[0] = 1;
alpha(0) = autocorr[0]; // error signal energy is energy in signal itself iteration for iorder = 1..order
(each time used, iparam runs from 1..iorder-1)
LPC_filter_old[iparam] = LPC_filter[iparam] // save previous order
sum = Sum(LPC_filter_old[iparam]*autocorr[iorder-iparam])
refl_coeff[iorder] = -1.0/alpha(iorder-1)*(autocorr[iorder] + sum
LPC_filter[iorder] = refl_coeff[iorder];
LPC_filter[iparam] = LPC_filter_old[iparam] + refl_coeff[iorder]LPC_filter_old[iorder-iparam]
alpha(iorder) = (1-refl_coeff[iorder]^2) alpha(iorder-1)
//termination:
LPC_filter[0] = sqrt(alpha) // LPC gain
refl_coeff[0] = autocorr[0];
void spr_autocorr ( const float  in[],
int  nparam,
float  out[],
int  ncorr 
)

Calculate the normalised autocorrelation coeffients from a time domain signal. It computes ncorr+1 autocorrelation coefficients out[0]...out[Lr] on time series in[0]...in[n-1]. Note by JD: gamma removed, adjustment for taking into account the energy scaling when placing a window, is now done in the windowing routines themselves.

out[icorr] = Sum(in[iparam]*in[iparam+icorr])
void spr_crosscorr ( float  in[],
float  in2[],
int  nparam,
float  cr[],
float  cl[],
int  ncorr 
)

Compute ncorr+1 left and right crosscorrelation coefficients cl[0]...[ncorr] and cr[0]...[ncorr] on time series in[0]...in[nparam-1] (move in) and in2[0]...in2[nparam-1].

cr[0] = cl[0];
cr[iparam] = Sum(in[icorr]*in2[icorr+iparam]);
cl[iparam] = Sum(in[icorr]*in2[icorr-iparam])
= Sum(in[icorr+iparam]*in2[icorr])).