2011-03-23 6 views
1

У меня 8k16bit pcm audio, и я хочу увеличить его до 16k16bit. Я должен сделать это вручную.PCM-алгоритм для повышения частоты дискретизации

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

Также, когда я поднимаю вверх, я должен внести изменения для заголовка wav - что мне изменить?

ответ

5

Как уже упоминалось, линейная интерполяция не дает лучшего качества звука, но это просто и дешево.

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

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 или аналогичный инструмент для этого.

0

Не уверен в заголовке, но я бы посмотрел на кубическую сплайн-интерполяцию. Вы можете посмотреть на this website. У этого есть очень аккуратный способ выполнения кубической интерполяции. Я не уверен, как изменить заголовок, но я уверен, что были ответы на это в Stack Overflow, которые вы могли бы искать.

+0

Хорошо, я с помощью линейной интерполяции и расчеты кажутся правильными, но все, что я получаю некоторые статические, как шум. Я интерполирую между каждыми двумя байтами, добавляя новый байт между ними ... но я думаю, что это моя ошибка. Поскольку pcm равно 16 бит, это означает, что на выборку приходится 16 бит, поэтому, возможно, я должен интерполировать между каждыми двумя образцами (куски 16 бит). Это правильно, или я понял, что вся идея не так? –

+0

Если вы покажете свой код, я могу взглянуть на него и посмотреть, что-то не так (просто часть интерполяции). – Phonon

+4

@gosho: Да, конечно, вы должны интерполировать между парами * samples *, а не парами * байтов *. Отдельные байты не имеют никакого значения. –

2

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

уверен:

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.

+1

Обратите внимание, что «окно» - это нечто другое; «Фильтр» - это подходящий термин здесь ... –