Я работаю над проектом, где мне нужно визуализировать спектральный анализ, чтобы установить некоторые точные параметры. Теперь я с преобразованием бинов в экранное пространство, потому что в линейном пространстве величины на более низких частотах сжимаются вместе. Вот мой код на C ++:
float windowSize = 640;
float windowHeight = 480;
for (size_t i = 0; i < bins; i++)
{
float m = audioIn.getSpectrum.at(i)*windowHeight;
float pos = i;
drawLine(vec2(pos, 0), vec2(pos, m));
}
Я пытался вычислить pos
используя разные подходы, но с треском провалились. Мне не хватает важных знаний о логарифмах.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это для личного арт-проекта, а не домашнее задание.
Обычно спектрографы отображаются в логарифмическом масштабе по основанию 10.
Если предположить, bins
в твоем случае иди от 0 Hz
в nyquist Hz
Вы можете попробовать что-то вроде этого (для звука 44,1 кГц):
float nyquist = 22050.0;
float logMax = log10(nyquist);
float log = log10((float)i * nyquist / (float)bins);
float pos = log / logMax * windowSize;
Других решений пока нет …