Насколько я вижу, в конце концов вы получаете только отсечение источника с порогом клипа, который соответствует пропорции clipThr / max (input) = distLvlSho / 0x7fff.большинство входных данных таким образом в основном не изменяются.
Если вы действительно хотите исказить сигнал, вы должны применить какую-то нелинейную функцию ко всему сигналу (плюс, в конечном итоге, обрезание около максимума выборки для имитации аналогового насыщения)
В этой книге перечислены несколько простых моделей искажения: http://books.google.it/books?id=h90HIV0uwVsC&printsec=frontcover#v=onepage&q&f=false
Самым простым является симметричное мягкое ограничение (см. Стр. 118).Вот ваш метод, модифицированный с помощью этой функции мягкого клипа, посмотрите, соответствует ли он вашим потребностям в искаженном звуке (я протестировал его, составив несколько синусоид на входе и используя Excel для построения графика выхода)
В той же главе выВы найдете простое моделирование трубок и моделирование нечеткого фильтра (есть несколько экспонент по ним, поэтому, если производительность является проблемой, вы можете приблизиться к ним).
public void onMarkerReachedSoftClip(short[] buffer) {
double th=1.0/3.0;
double multiplier = 1.0/0x7fff; // normalize input to double -1,1
double out = 0.0;
for(int i=0;i<buffer.length;i++){
double in = multiplier*(double)buffer[i];
double absIn = java.lang.Math.abs(in);
if(absIn<th){
out=(buffer[i]*2*multiplier);
}
else if(absIn<2*th){
if(in>0)out= (3-(2-in*3)*(2-in*3))/3;
else if(in<0)out=-(3-(2-absIn*3)*(2-absIn*3))/3;
}
else if(absIn>=2*th){
if(in>0)out=1;
else if(in<0)out=-1;
}
buffer[i] = (short)(out/multiplier);
}
}