2016-07-17 2 views
1

Я пытаюсь сэмплировать звук микрофона снова и снова (для передачи). Но после процесса звук немного сломан (опалубка). Вы можете попробовать это самостоятельно, если у вас есть микрофон:Звуковая заслонка после понижающей и повышающей дискретизации

FIDDLE:https://jsfiddle.net/q4yjfxqv/10/ (обновлено 21.07.16)

Вы слышите опалубку больше на более высоких частотах.

Я декодирую, просто удаляя половину массива

function newDownSample(data) { 
    var retBuffer = []; 
    for(var i=0;i<data.length;i++) { 
    if(i%2==0) 
    retBuffer.push(data[i]) 
    } 
    return retBuffer; 
}; 

И повышающую дискретизация (liniar)

function newUpSample(data) { 
    var retBuffer = []; 
    for(var i=0;i<data.length;i++) { 
    retBuffer.push(data[i]) 
    if(i<data.length-1) 
     retBuffer.push((data[i]+data[i+1])/2); 
    else 
     retBuffer.push(data[i]); 
    } 
    return retBuffer; 
}; 

Я пробовал другие методы интерполяции, как liniar, кубическую и Ланцош форма here, а также ... с тем же эффектом затвора.

Затвор всегда происходит на краю куска. Вы можете это услышать, перебирая размер блока размером от 1024 до 4096 в примере (это будет меньше).

Но почему? Кто-нибудь может искупить это и как его решить?

Любой намек ценится :)

ответ

0

Проблемы с кодом для интерполяции, что вы не знаете, первый образец следующего блока и, следовательно, не может правильно интерполировать последний образец текущего.

Чтобы обойти это, вам нужно сохранить последний образец из одного блока, чтобы вычислить первый интерполированный образец для следующего блока.

https://jsfiddle.net/hhb240ms/1/

usSample[0] = (lastSample + data[0])/2; 
usSample[1] = data[0]; 
for(var i=1;i<512;i++) { 
    usSample[2*i] = (data[i] + data[i-1])/2; 
    usSample[2*i+1] = data[i] 
} 
lastSample = data[data.length-1]; 
+0

очень приятно :) Мне нравится! – Cracker0dks

0

Im не эксперт о аудио программирования.

Что я пытаюсь, когда получаю странные результаты (с проблемами общего программирования), меняет параметры алгоритма и возвращает его к основам.

Что происходит, когда вы не делаете снимок?.

Аудио очень чувствительно к наименьшим ошибкам. Что делать, если буфер не достаточно большой или когда (используя основной поток) обрабатывает блоки, воспроизводящие звуки.

Выполняете ли вы какую-либо другую обработку, кроме модуляции по этой теме? Как насчет другого браузера (HTML5)? В настоящее время я не могу думать о каких-либо других решениях или подсказках.

Удачи, надеюсь, это поможет. Пожалуйста, опубликуйте решение, это также поможет другим программистам.

+0

эй, спасибо за ... Я акустический отклик опробовали много до сих пор. вы можете переключить повторную выборку на скрипке и проверить, что без ее работы хорошо. Firefox и хром сломаны (по крайней мере) ... Я буду тестировать больше компьютеров завтра. – Cracker0dks

+0

Попробуйте это ..https: //jsfiddle.net/ck3sgan9/9/ - это масштабирование необходимо? Потому что вы всегда будете терять качество, это работа (не upsampling), но она работает. и я не слышу тяжелую потерю качества звука. Этот поворот только использует понижающую дискретизацию. – Zezura

+0

WoW спасибо. Я не знаю, как это возможно ... лучше использовать одно и то же значение дважды, чем для интерполяции? – Cracker0dks

0

В зависимости от ОС и машины, на которой вы работаете, вы можете увеличить размер буфера, указанный в creatScriptProcessor. Имея размер, я слышу артефакты, но когда я увеличиваю размер до 16384, я больше не слышу артефакты. (Но теперь я получаю довольно длинную задержку, прежде чем услышу что-нибудь, как и ожидалось из большого размера буфера).

+0

Если я изменю размер куска, только продолжительность между разворотами сбрасывается – Cracker0dks

0

Когда i = (data.length-1), вы получите нуль для данных [i + 1] - поэтому повышение частоты дискретизации, вероятно, будет усреднением последнего образца с нулем?

(Это не большое понижающее - так как он не пропускной-contrain первым. - но я ожидаю, что вы знали, что)

+0

Да, я уже нашел эту ошибку data.length-1, но все еще опалубка. Я удалил пропускную способность для этого примера, потому что он не является его ошибкой – Cracker0dks

+0

Действительно? Я не слышу никаких проблем с аудио в пересмотренной скрипте на моем macbook или рабочем столе. Может быть, это из-за машины, на которой вы работаете, не в состоянии идти в ногу с событиями в аудиопроцессе? (Хотя я думаю, что это было странно.) Динамическое распределение и array.push(), вероятно, неэффективны; Я написал hardcoded версию на https://jsfiddle.net/12ubug1o/. Посмотрите, проявляет ли он такое же поведение. – cwilso

+0

Кроме того, вы можете отключить эхоподавление - a la https://jsfiddle.net/12ubug1o/1/. – cwilso

Смежные вопросы