Преобразование линейных точек звуковой волны в логарифмические
У меня есть линейный график звуковой волны :
Мне нужно получить график звуковой волны в логарифмической форме, а именно :
Для этого для каждого образца мне нужно применить формулу для преобразования значения из линейного в логарифмическое.
Я думаю, мне нужно использовать формулу из этого материала.
Но когда я получаю определенный коэффициент, я не знаю, что с ним делать дальше.
Я хочу отметить, что максимальное значение выборки составляет 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 шт):
Прологарифмировав набор значений, вы получаете новый набор значений. Теперь для рисования графика нужна нормировка на минимум и максимум этого нового набора - только и всего.
Если пределы графика фиксированы - просто используйте новые пределы. Например, если для графика амплитуд использовалась шкала, в которой значения -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))




