Преобразование линейных точек звуковой волны в логарифмические

У меня есть линейный график звуковой волны :

введите сюда описание изображения

Мне нужно получить график звуковой волны в логарифмической форме, а именно :

введите сюда описание изображения

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

Я думаю, мне нужно использовать формулу из этого материала.

Но когда я получаю определенный коэффициент, я не знаю, что с ним делать дальше.

Я хочу отметить, что максимальное значение выборки составляет 32512, а минимальное - 1.


Пример преобразования линейного значения выборки в логарифмическое :

const double linearSample = 27000;
const double logSample = 20.0 * log10(27000);

// Res: 88.6272753

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


Upd

Согласно одной из рекомендаций MBo, я применил следующию логику:

for (int i = 0; i < samples.size(); ++i) {
    const int16_t curSample = samples[i];
    if (curSample != 0) {
        samples[i] = curSample > 0 ? static_cast<int16_t>(720 * log10(curSample)) : static_cast<int16_t>(-720 * log10(-curSample));
    }
}

Вот что получилось при линейном отображение

введите сюда описание изображения

и логарифмическом отображение

введите сюда описание изображения

Я попытался отбросить слишком маленькие значения, и вот что произошло:

for (int i = 0; i < samples.size(); ++i) {
    const int16_t curSample = samples[i];
    if (curSample != 0) {
        samples[i] = curSample > 50 ? static_cast<int16_t>(720 * log10(curSample)) : ((curSample < -50) ? static_cast<int16_t>(-720 * log10(-curSample)) : curSample);
    }
}

введите сюда описание изображения


Ответы (1 шт):

Автор решения: MBo

Прологарифмировав набор значений, вы получаете новый набор значений. Теперь для рисования графика нужна нормировка на минимум и максимум этого нового набора - только и всего.

Если пределы графика фиксированы - просто используйте новые пределы. Например, если для графика амплитуд использовалась шкала, в которой значения -32768...32767 соответствовали координатам по вертикали y_min.. y_max, то теперь эти же y_min.. y_max соответствуют значениям в децибелах -90 дБ..90 дБ (значения по вашей формуле)

if (value == 0)
     выводить 0
else if (value > 0)
     выводить 720*log10(value))
else
     выводить -720*log10(-value))
→ Ссылка