public void interpolate(float[] in,
float[] in_offset,
float in_end,
float[] startpitch,
float pitchstep,
float[] out,
int[] out_offset,
int out_end) {
float pitch = startpitch[0];
float ix = in_offset[0];
int ox = out_offset[0];
float ix_end = in_end;
int ox_end = out_end;
if (pitchstep == 0) {
while (ix < ix_end && ox < ox_end) {
int iix = (int) ix;
float[] sinc_table
= this.sinc_table[(int) ((ix - iix) * sinc_table_fsize)];
int xx = iix - sinc_table_center;
float y = 0;
for (int i = 0; i < sinc_table_size; i++, xx++)
y += in[xx] * sinc_table[i];
out[ox++] = y;
ix += pitch;
}
} else {
while (ix < ix_end && ox < ox_end) {
int iix = (int) ix;
float[] sinc_table
= this.sinc_table[(int) ((ix - iix) * sinc_table_fsize)];
int xx = iix - sinc_table_center;
float y = 0;
for (int i = 0; i < sinc_table_size; i++, xx++)
y += in[xx] * sinc_table[i];
out[ox++] = y;
ix += pitch;
pitch += pitchstep;
}
}
in_offset[0] = ix;
out_offset[0] = ox;
startpitch[0] = pitch;
}
|