2011-04-20 3 views
4

Я создал приложение, которое рисует FFT на экран в реальном времени (от микрофона). Время по оси x, частота по оси y и цвет пикселя представляют собой амплитуду (в значительной степени ванильную FFT-спектрограмму).Sound spectrogram

Моя проблема в том, что, хотя я вижу рисунок из музыки, также много шума. В результате этого я вижу людей, применяющих логарифмический расчет к амплитуде. Должен ли я это делать? И если да, то как бы выглядела бы формула? (Я использую C#, но я могу перевести математику в код, поэтому любой образец в порядке.)

Я могу обойти эту проблему, применяя цветовую схему, показывающую более низкие значения в качестве более темных цветов. Я просто не уверен, правильно ли представлен звук без логарифмического расчета.

+0

У вас есть скриншот того, как выглядит результат в настоящее время? – RQDQ

+0

Еще лучше, используйте логарифмическую частотную ось, более точно отражающую чувствительность уха. Чтобы понять разницу, см. Http://wikidelia.net/wiki/Spectrogram для примеров – martinwguy

ответ

8

Представление амплитуды по логарифмической шкале приближается к чувствительности человеческой слуховой системы и, следовательно, дает лучшее представление о том, что вы слышите, по сравнению с не логарифмической шкалой. Математически, все, что вам нужно сделать, это:

Alog = 20*log10 (abs (A)) 

Где A амплитуда данных FFT и Alog является выходом. фактор 20 - это просто соглашение и не влияет на изображение, которое вы, вероятно, по-прежнему масштабируете по цветовой схеме.

РЕДАКТИРОВАТЬ

Объяснения относительно 20 фактора: (децибел) Блок дБ является логарифмической единицей измерения отношений: она представляет собой шкалу, на которой расстояние между 100 и 10, является таким же, как и между 1000 и 100 (поскольку они имеют одинаковое соотношение: 1000/100 = 100/10). Если измерить его в дБ вы получите:

10*log10 (1000/100) = 10*log10 (100/10) = 10 

Коэффициент 10 потому, что deci означает tenth, что означает 1 Бел 10 децибел, (как 1 кг составляет 1000 грамм)

С человеческим слуховым система также (приблизительно) измерения отношения, то имеет смысл для измерения уровня звука по логарифмической шкале, т.е. измеряет отношение уровня звука до некоторой опорной величины. Поскольку уровень звука связан с мощностью (в Ваттах) звуковой волны, вы фактически измеряете отношение мощности P/Pref. Кроме того, мощность пропорциональна квадрату амплитуды, поэтому в целом вы получаете:

10*log10 (P/Pref) = 10*log10 (A^2/Aref^2) = 20*log10 (A/Aref) 

по правилам журнала. Это источник фактора 20 - помните, что в компьютере звук представлен мгновенной амплитудой звуковой волны.

+0

Спасибо. Не могли бы вы объяснить еще 20? –

+0

Я отредактировал свой ответ –

3

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

Еще одним важным моментом является то, что просмотр вашего STFT на шкале журнала - это не метод шумоподавления. То, что вы видите как «шум», может быть фактическим noise, или это могут быть такие вещи, как harmonics, transients, spectral leakage и другие вещи, которые, как ожидается, будут там. В зависимости от вашего приложения, если вам нужно провести краткий анализ сигнала, преобразование wavelet может быть более подходящим для ваших нужд.Это устраняет некоторые недостатки STFT, такие как постоянный размер окна.