PCM алгоритъм за повишаване на дискретизацията

Имам 8k16bit pcm аудио и искам да го преобразувам до 16k16bit. Трябва да направя това ръчно.

Може ли някой да ми каже алгоритъма за линейна интерполация? Трябва ли да интерполирам между всеки два байта?

Освен това, когато правя надсемплиране, трябва да направя промени за wav заглавката - какво трябва да променя?


person gop    schedule 23.03.2011    source източник


Отговори (4)


Както други споменаха, линейната интерполация не дава най-доброто качество на звука, но е проста и евтина.

За всяка нова проба, която създавате, просто я осреднете със следващата, напр.

short[] source = ...;
short[] result = new short[source.length * 2];
for(int i = 0; i < source.length; ++i) {
  result[i * 2] = source[i];
  result[i * 2 + 1] = (source[i] + source[i + 1]) / 2;
}

Определено трябва да потърсите библиотека, която ви помага да работите с WAV файлове. Въпреки че е прост формат, не би трябвало да го правите сами, ако има наличен код, който ще направи това, от което се нуждаете. Между другото, защо изобщо правиш това? Може би можете просто да използвате sox или подобен инструмент, за да направите това.

person Martin Vilcans    schedule 24.03.2011

Може ли някой да ми каже алгоритъма за линейна интерполация? Трябва ли да интерполирам между всеки два байта?

сигурен:

double interpolate_linear(double a, double b, double x) {
    assert(0.0 <= x);
    assert(1.0 >= x);

    if (0.0 >= x)
        return a;
    else if (1.0 <= x)
        return b;
    else
        return (1.0 - x) * a + x * b;
}

линейната интерполация, макар и по-добра от нищо, има голямо количество грешки. по-добре е да нулирате запълването и прозореца, ако имате процесорно време.

Освен това, когато правя надсемплиране, трябва да направя промени за wav заглавката - какво трябва да променя?

не съм сигурен за java.

person justin    schedule 23.03.2011
comment
Имайте предвид, че прозорецът е нещо различно; филтър е подходящият термин тук... - person Oliver Charlesworth; 23.03.2011

Ето добра връзка за работа с WAV файлове в java:

http://www.labbookpages.co.uk/audio/javaWavFiles.html

person MusiGenesis    schedule 24.03.2011

Не съм сигурен за заглавката, но бих разгледал интерполацията на кубичен сплайн. Можете да разгледате този уебсайт. Има много чист начин за извършване на кубична интерполация. Не съм сигурен как да променя заглавката, но съм почти сигурен, че има отговори на това в Stack Overflow, които можете да потърсите.

person Phonon    schedule 23.03.2011
comment
Добре, използвам линейна интерполация и изчисленията изглеждат правилни, но всичко, което получавам, е статичен шум като шум. Интерполирам между всеки два байта, добавяйки нов байт между тях... но мисля, че това е моя грешка. Тъй като pcm е 16-битов, това означава, че има 16 бита на проба, така че може би трябва да интерполирам между всеки две проби (парчета от 16 бита). Това правилно ли е или съм разбрал грешно цялата идея? - person gop; 23.03.2011
comment
Ако покажете кода си, мога да го погледна и да видя дали нещо не е наред (само частта за интерполация). - person Phonon; 23.03.2011
comment
@gosho: Да, разбира се, трябва да интерполирате между двойки извадки, а не двойки байтове. Отделните байтове нямат значение. - person Oliver Charlesworth; 23.03.2011
comment
@Oli Charlesworth благодаря. Това има смисъл...не знам защо започнах интерполация между байтове. И така, как трябва да интерполирам цели проби? Да кажем, че имам проби A и B (всяка по 16 бита). Как се формира получената проба C? Формира ли се като C[i]=(A[i]+B[i])/2 за всяко i? В момента моят алгоритъм основно използва алгоритъма, предложен от @Justin с x=1/2. Сега не съм на компютъра, където е кодът, но утре мога да покажа малко код. - person gop; 23.03.2011
comment
да Когато извършвате линейна интерполация, всяка нова проба е средната стойност на двете проби, между които се намира. - person Phonon; 23.03.2011
comment
Още веднъж благодаря за помощта ще пиша утре с резултатите - дано успеят :) - person gop; 23.03.2011
comment
Благодаря, момчета, нямах време да пиша през последните няколко дни. Получи се страхотно. Все още имам въпроси относно wav заглавката, но ще създам друг въпрос за това. Ще бъде хубаво да използвам някои apis за манипулиране на wav, но работя върху мобилното издание на Blackberry Java и не познавам такива библиотеки. Благодаря отново! - person gop; 28.03.2011
comment
Кубичната интерполация е по-добра от линейната интерполация, но все още не е толкова добра. stackoverflow.com/questions/1851384/ - person endolith; 23.09.2011