Понижение частоты звука PCM с 44100 до 8000

Я взял на себя поддержку приложения для Android, которое записывает источник звука с помощью AudioRecord в формате 44100, 16-битное моно. Мне нужно понизить его до 8000. В текущем приложении есть алгоритм понижения разрешения, и я не уверен, что он работает правильно. Когда другое приложение (которое является черным ящиком) получает его, звук воспроизводится, но с громким жужжанием в фоновом режиме и более медленным, чем ожидалось, звуком. Другой звук в правильном формате, переданный в принимающее приложение, принимается без проблем.

Алгоритм, который у меня есть, указан здесь (я подозреваю, что это был изначально декомпилированный код откуда-то на основе имен переменных).

private void downSample() {
    int v5 = 0;
    int v4 = 0;
    int v2;
    for (v2 = 0; v2 < 0xA0; ++v2) {
        v5 += 0xD755;
        int v6 = v5 / 0x2710;
        v5 -= v6 * 0x2710;
        double v0 = 0;
        int v3 = v4;
        v4 += v6;
        while (v3 < v4) {
            v0 += ((double) ((((float) this.readBuffer[v3])) * this.volume));
            ++v3;
        }

        v0 /= ((double) v6);
        if (32767 < v0) {
            v0 = 32767;
        }
        else if (-32768 > v0) {
            v0 = -32768;
        }

        this.downSampledBuffer[v2] = ((short) (((int) v0)));
    }
}

readBuffer — это тип short[], который заполняется источником записи. downSampledBuffer также является коротким []. Любые мысли о том, что происходит не так?


person mjsalinger    schedule 26.10.2013    source источник
comment
Это особенно громоздкий и неуправляемый фрагмент кода. На что это точно не похоже, так это на повторную выборку путем прореживания, которая является ортодоксальный способ достижения этого обращения. Если там и есть ФНЧ, то он довольно дрянной. Я очень сомневаюсь, что результаты звучат хорошо. Для этого почти наверняка должна быть поддержка библиотек в Android, а не создание собственной.   -  person marko    schedule 26.10.2013
comment
Android поддерживает библиотеки, начиная с Honeycomb, но, к сожалению, для этого приложения мне нужен Gingerbread. Я собираюсь работать над алгоритмом повторной выборки путем прореживания, чтобы заменить тот, который есть сейчас.   -  person mjsalinger    schedule 27.10.2013


Ответы (1)


«Жужжащий звук» и «звук медленнее, чем ожидалось» создаются вне этого алгоритма.

Алгоритм обрабатывает ровно 882 входных выборки и производит 160 выходных выборок. Таким образом, перед каждым вызовом downSample() вы должны заполнить this.readBuffer ровно 882 новыми короткими значениями, а после возврата из downSample() вы должны конкатенировать полученные 160 коротких значений с уже обработанными выборками.

Встроенный низкочастотный «фильтр» представляет собой простое усреднение по 5 или 6 входным сэмплам, так что вы не можете избавиться от всех наложений, но, с другой стороны, это не самое медленное решение проблемы понижения частоты дискретизации.

person Hartmut Pfitzinger    schedule 31.10.2013
comment
Спасибо - это помогло локализовать мою проблему. - person mjsalinger; 06.11.2013