Нормализация данных БПФ для человеческого слуха
-
20-08-2019 - |
Вопрос
Типичный БПФ для аудио выглядит примерно так, при этом большая часть действий происходит на дальней левой стороне
http://www.flight404.com/blog/images/fft.jpg
Он умножил это на частичную синусоидальную волну, чтобы добраться до сути, но статья не слишком конкретизирует эту часть.Это также похоже на "достаточно хорошую" модификацию набора данных, а не на модификацию, основанную на каком-то свойстве.Я понимаю, что человеческий слух лучше приспособлен к более высоким частотам, поэтому в большинстве музыкальных произведений будут усилены низкие и ослаблены высокие частоты, так что и те, и другие звучат для нас относительно одинаково.
Мой вопрос заключается в том, какую модификацию необходимо внести в FFT, чтобы компенсировать это стандартное падение?
for(i = 0; i < fft.length; i++){
fft[i] = fft[i] * Math.log(i + 1); // does, eh, ok but the high
// end is still not really "loud"
// enough
}
Редактировать ::
http://en.wikipedia.org/wiki/Equal-loudness_contour
Я наткнулся на эту статью, я думаю, что это может быть направление, в котором следует двигаться, но все еще может существовать какое-то свойство FFT, которому необходимо противодействовать.
Решение
Во-первых, вы уверены, что хотите это сделать?Имеет смысл компенсировать некоторые вещи, например, не ровный отклик микрофона, но не человеческое восприятие.Люди привыкли слышать звуки со спектральным содержанием, которое они имеют в реальном мире, а не по кривым одинаковой громкости для восприятия.Если вы воспроизведете звук, который вы изменили так, как вы предлагаете, это будет звучать странно.Возможно, некоторым людям нравится, чтобы в музыке были усиленные низкие частоты, но это вопрос вкуса, а не психофизики.
Или, возможно, вы компенсируете это по какой-то другой причине, например, принимая во внимание меньшую чувствительность к более низким частотам, вы можете улучшить алгоритм сжатия.Это и есть идея?
Если вы действительно хотите нормализовать с помощью кривых равной громкости, следует отметить, что большинство кривых и уравнений приведены в терминах уровня звукового давления (SPL).SPL - это логарифм квадрата амплитуды сигнала, поэтому, когда вы работаете с БПФ, вероятно, проще всего работать с их квадратом (спектром мощности).(Или, конечно, вы могли бы компенсировать другими способами, скажем, умножив на sqrt (log (i + 1)) в вашем уравнении выше - предполагая, что log был приближением обратной кривой равной громкости.)
Другие советы
Я думаю, что контур равной громкости это совершенно правильное направление.Однако его форма зависит от уровня абсолютного давления.Другими словами, кривая чувствительности нашего слуха изменяется в зависимости от звукового давления.
Нет никакой "правильной нормализации", если у вас нет информации об абсолютных уровнях.Является ли это проблемой, зависит от того, что вы хотите сделать с данными.
Контур громкости стандартизирован в стандарте ISO 226, но этот документ недоступен для свободного скачивания.Хотя она должна быть в приличной университетской библиотеке.Вот другой источник для контуров громкости
Итак, вы пытаетесь повысить уровень высоких частот?Похоже, может сработать фильтр высоких частот с минимальным множителем, чтобы вы не слишком ослабляли низкочастотные сигналы.Возьмите хорошую книгу по дизайну фильтров, может быть, поиграйте с этот апплет
В старые времена первых сэмплеров это было до того, как люди MOTU Boost :) это был не FFT, а простая (я думаю, сначала это был Fairlight или Roland) нормализация, выполняемая для исходного или результирующего сигнала во временной области (если вы выполняете нарезку ритмов, в стиле recycle);ты не можешь этого сделать?Или переходите к БПФ только после того, как вы компенсируете его, чтобы противодействовать ему?
Похоже на двухэтапную процедуру, в противном случае я бы лично оставил FFT как есть для этой задачи..