Как правильно реализовать ось графика в децибеллах?

Тема в разделе "WASM.A&O", создана пользователем WishMaster, 2 ноя 2006.

  1. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Строится график звукового сигнала. По оси абсцисс - время, по оси ординат - нормированные значения (т.е. от -1 до 1). Необходимо сделать возможность по оси ординат откладывать не нормированные значения, а децибеллы. Переход осуществляется в соответсвии с выражением D = 20*lg(x), где х - нормированное значение. Соответсвенно, изменению нормированных значений от 0 до 1 соответствует диапазон от минус бесконечности до 0 дБ.
    Проблема в следующем. При построении меток и сетки для случая с нормированным шагом проблем не возникает, так как шаг сетки постоянный. А вот как быть в случае с логарифмической шкалой, то есть как определять изменяющийся шаг вывода сетки и меток с дБ для определенного диапазона изменений х - никак придумать не могу. Например, пускай на оси ординат отображен диапазон [0.2; 0.7] и метки (а также линии сетки) идут с равномерным шагом 0,05. Какая картина будет при переходе к децибеллам?
    Если кто-нибудь с таким стыкался, помогите, пожалуйста.
    Заранее благодарен.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Как на логарифмической бумаге, может?
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Логарифмическую шкалу можно оцифровывать в разах или в децибелах. Если в разах, то шаг сетки ес-но получается неравномерным - как на логарифмической бумаге ;) А если в децибелах, то ес-но - шаг равномерный (например, основные деления чере 1дБ, дополнительные через 0.5 или 0.1 дБ). Поэтому для диапазона отношений [0.2;0.7] будем иметь равномерную шкалу в децибелах от -3.0 до -14.0 дБ
     
  4. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    Я наверное не слишком точно сформулировал свой вопрос. Как будут изменяться метки на оси в децибеллах при масштабировании?
    Например на исходном графике ось будет иметь вид (ось направлена вверх, минус бесонечости соответсвует 0 нормированной оси, а 0 дБ соответсвует 1 нормированной оси):

    ^
    | 0
    |
    |
    |
    |
    | -1
    |
    |
    | -3
    |
    |
    | -6
    |
    |
    | -9
    |
    | -12
    |
    | -18
    | -24
    | - бесконечность
    ________________________________________________

    Как, с каким шагом должны изменяться метки на оси при масштабировании графика по вертикали? То есть, эта шкала соответствует нормированному отрезку [0; 1]. А какая будет соответсвовать [0.25; 0.75]? А если дальше увеличивать масштаб? Интересует имеено способ выбора шага сетки и меток!

    ПС. Если у кого есть CoolEdit - посмотрите, плиз, как реализована шкала децибелов там. Там в дБ, но неравномерно :) Вот никак не могу догнать, за каким принципом они там метки высчитывають для новых масштабов.
     
  5. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    leo, о какой равномерности в дБ может идти речь, когда на шкале есть минус бесконечность? Идти от нее с равномерным шагом - это как идти пятилетками к светлому будущему комунизма =)
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    WishMaster
    Во-первых, бесконечность как и светлое незбыточное будущее существует только в больных головах строителей коммунизма ;) А в измерительной технике существуют понятия погрешности измерений, разрешающей способности, динамического диапазона и условного нуля. Для 24-разрядного АЦП разрешающая способность составляет "всего лишь" 1/2^24 = -144.5 дБ, и с точки зрения физики рассматривать шкалу АЦП - от 0 до 2^n-1 или от 1 до 2^n - дело чисто условное. Но вот при расчете отношений в первом случае мы столкнемся с нулем и бесконечными децибелами, а во втором случае - нет, и это более точно соответствует действительности, т.к. абсолютных теоретических нулей и бесконечностей в измерениях не бывает (про тепловой шум надеюсь слышал ;)

    Во-вторых, значит я действительно тебя неправильно понял - тебе нужен линейный масштаб, но с оцифровкой в децибелах. Чего там твой CoolEdit делает не знаю, но можно сделать примерно так. Берешь исходный диапазон Y [0.25; 0.75], вычисляешь, соотв.диапазон в децибелах Ydb [-2.5; -12.0] и делаешь цикл по целым децибелам из этого диапазона (или десятым долям в завис-ти от масштаба). Переводишь Ydb в Y=10^(Ydb/20), затем в пикселы и проверяешь разность с предыдущей меткой - если больше некоторого dYmin - ставишь метку, если меньше - пропускаешь, пока не накопится нужное расстояние >= dYmin. С подписями также, только расстояние dYmin может быть больше в завис-ти от размера шрифта. Если быстродействие не критично, то можешь вычислять степени 10 для каждого значения Ydb, если же хочется побыстрее, то вычисляешь Y[0] и затем Y[i+1]=Y*Ystep, где Ystep=10^(-dBstep/20), dBstep - шаг сетки в децибелах (1, 0.1 и т.п.)
     
  7. WishMaster

    WishMaster New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    54
    Адрес:
    Ukraine
    leo, искреннее спасибо за желание помочь. Мне нужен был вывод в дБ, но с НЕРАВНОМЕРНЫМ шагом. Понять это тяжело, легче посмотреть в Куле. Я уже проблему решил, в том числе то, что ты советовал, там отчасти тоже имеет место. Просто ограничение на расстояние ставится не только минемальное, а и максимально. Выберается шаг по минимальному расстоянию и использую этот шаг, пока расстояние между метками не станет больше максимального. Тогдя снова перерасчитываю шаг. Понять это со слов наверно сложно, если кому то действительно это надо будет, пишите на мыло, я код вышлю.
    Спасибо всем! =)