Как избежать трескучих трескучих звуков после увеличения громкости в Гобой? - PullRequest
0 голосов
/ 07 декабря 2018

Я начал реализовывать библиотеку Oboe c ++ для Android.(Согласно Создание музыкальной игры с использованием Oboe Я просто масштабирую семпл для увеличения громкости, и он работает, но с потрескивающим щелчком. Могу ли я увеличить амплитуду без потрескивания? Я пытался сохранить сэмплы звукас небольшим усилением, но звучит очень плохо. Спасибо.

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

for (int i = 0; i < mNextFreeTrackIndex; ++i) {

    mTracks[i]->renderAudio(mixingBuffer, numFrames);

    for (int j = 0; j < numFrames * kChannelCount; ++j) {
        audioData[j] += (mixingBuffer[j] * ((float)volume));
    }

Отредактировано:

int16_t Mixer::hardLimiter(int16_t sample) {
    int16_t audioData = sample * volume;
    if(audioData >= INT16_MAX){
        return INT16_MAX;
    }else if(audioData <= INT16_MIN){
        return  INT16_MIN;
    }
    return audioData;
};

1 Ответ

0 голосов
/ 12 декабря 2018

Код, который вы опубликовали от Mixer::renderAudio(int16_t *audioData, int32_t numFrames).Его задача - объединить значения семплов из отдельных треков в один массив 16-битных семплов.

Если вы микшируете 2 или более треков вместе, не уменьшая сначала значения, то вы можете превысить максимальное значение семпла 32 767 (иначе INT16_MAX).Это может привести к обтеканию (то есть запись 32 768 в int16_t приведет к сохранению значения -32 768) и, следовательно, к слышимым искажениям / потрескиванию.

Имея это в виду, вы можете написать очень простой (жесткий) ограничитель - выполнить масштабирование объема с помощью int32_t и записать его в массив int16_t, только если значение не превышает максимальное значение,в противном случае просто напишите максимум.

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

...