thedreiskre
Active member
I'm using floating point math for interpolation through a wavetable, but it seems quite inefficient and requires converting ints to floats and vice versa.
Is there a way to convert my code to work using only integers?
Any help would be much appreciated.
Is there a way to convert my code to work using only integers?
Code:
case WAVEFORM_ARBITRARY:
if (!arbdata) {
release(block);
if (shapedata) release(shapedata);
return;
}
// len = 256
for (i = 0; i < AUDIO_BLOCK_SAMPLES; i++) {
ph = phasedata[i];
index = ph >> 24;
index2 = index + 1;
if (index2 >= 256) index2 = 0;
tablePos = (abs(shapedata->data[i]) * 0.00003051757) * 3;
// 3 is table length. (table length of 3 allows for table of 4 waves)
//TODO add a set length function.
switch (interpolationType)
{
case INTERPOLATION_SMOOTH:
//sample 1
val1 = *(arbdata + index + (((int)(tablePos)) * 256));
val3 = *(arbdata + index + (((int)(tablePos + 1)) * 256));
val1 = (int)(val1 * (1 - (tablePos - (int)(tablePos))));
val3 = (int)(val3 * (tablePos - (int)(tablePos)));
//sample 2
val2 = *(arbdata + index2 + (((int)(tablePos)) * 256));
val4 = *(arbdata + index2 + (((int)(tablePos + 1)) * 256));
val2 = (int)(val2 * (1 - (tablePos - (int)(tablePos))));
val4 = (int)(val4 * (tablePos - (int)(tablePos)));
//merge
val2 = val2 + val4;
val1 = val1 + val3;
break;
case INTERPOLATION_STEP:
val1 = *(arbdata + index + (((int)(tablePos + 0.01)) * 256));
val2 = *(arbdata + index2 + (((int)(tablePos + 0.01)) * 256));
//add 0.01 so that the top wave can be reached.
break;
}
scale = (ph >> 8) & 0xFFFF;
val2 *= scale;
val1 *= 0x10000 - scale;
*bp++ = multiply_32x32_rshift32(val1 + val2, magnitude);
}
break;
Any help would be much appreciated.