Я пишу механизм гранулярного синтеза с линейной интерполяцией. Проблема в том, что интерполяция в том виде, в каком она реализована в настоящее время, примерно на 10% тяжелее для процессора, чем обработка без интерполяции.
Я публикую упрощенный пример программы, демонстрирующий обработку, которую я применяю к чередующемуся буферу сэмплов. Есть ли способ сделать вычисления внутри функции interpolation
более эффективными и, следовательно, менее тяжелыми для процессора? Функция работает отлично и обеспечивает очень плавное звучание звука. Это просто потребление процессора, которое должно быть оптимизировано.
Я пишу код в свободное время, поэтому я не очень опытный программист. Кажется, я не могу уложить это в голове. Боролся с этим уже несколько недель.
Я отредактировал код, чтобы исправить несоответствие типа переменной dist
. Еще одно редактирование, чтобы избежать усеченных результатов int/long.
int main(void) {
long i;
long oldlength = 5000;
long newlength = 10000;
double dist;
double oldbuffer[oldlength]; // assume the buffer contains values
double newbuffer[newlength];
// method with linear interpolation
for (i = 0; i < newlength; i++) {
dist = ((double)i / (double)newlength) * (double)oldlength;
newbuffer[i] = interpolation(dist, oldbuffer, 1, 0);
}
// method without linear interpolation
for (i = 0; i < newlength; i++) {
dist = ((double)i / (double)newlength) * (double)oldlength;
newbuffer[i] = oldbuffer[(long)dist];
}
return 0;
}
double interpolation(double dist, float *buffer, short chcount, short ch) {
// dist = current read position in buffer
// buffer = interleaved sample buffer
// chcount = channels contained in sample buffer
// ch = channel to be read from buffer
long i = (long)dist; // get truncated index
dist -= (long)dist; // calculate fraction value for interpolation
return buffer[i * chcount + ch] + dist * (buffer[(i + 1) * chcount + ch] - buffer[i * chcount + ch]);
}
i < newlength
(условие в циклах for) истинно, результатом(i / newlength)
будет0
. - person mch   schedule 22.01.2015dist
в первую очередь должно бытьdouble
. Я отредактировал код. - person Matthias Müller   schedule 22.01.2015buffer
объявлен какfloat*
, но на самом деле вы используетеdouble*
. - person Persixty   schedule 22.01.2015double
вместо постоянного преобразования междуlong
иdouble
и обратно. - person Luis Colorado   schedule 23.01.2015