Компрессор

Предыдущая  Содержание  Следующая  V*D*V

Компрессор используется для уменьшения динамического диапазона сигнала.

 

Параметрами компрессора являются:

порог, выше которого начинается обработка

отношение - отношение уровня входного сигнала к выходному выше точки перелома

перелом - крутизна в точке перелома

время атаки - как быстро реагирует на повышение уровня

время спада - как быстро реагирует на понижение уровня

 

Трактовка параметров компрессоров различается. Где-то используется "отношение" как отношение уровня входного сигнала к выходному выше точки перелома как абсолютная величина, где-то как относительная выше точки перелома.

Кривая выше точки перелома может рассматриваться как линейная или логарифмическая.

Реализация

Простой компрессор. Перелом жесткий. Кривая регулирования логарифмическая.

 

Вариант параметров:

dBthreshold = -12

ratio = 4

attackMS = 10

releaseMS = 10

 

/**

* Аудио компрессор

*

*/

public class Compressor {

 private int m_maxLevel = 32768;

 private double m_threshold = 0.0;

 private float m_ratio = 1.0f;

 private int m_attack = 1;

 private int m_release = 1;

 private double m_prevLevel = 0;

 

 public Compressor() { }

 public void init(int dBthreshold, int ratio, int attackMS, int releaseMS, int softKnee, int sampleRate, int bitsPerSample)

 {

         m_maxLevel = 1 << (bitsPerSample - 1);

         m_threshold = Math.pow( 10.0, dBthreshold / 20.0 ) * m_maxLevel;//32768.0;

         m_ratio = 1.0f / ratio;

         m_attack = ( attackMS * sampleRate / 1000 + 1 );

         m_release = ( releaseMS * sampleRate / 1000 + 1 );

 }

 public double proc(double sample) {

         double s = sample > 0 ? sample : -sample;

         s -= m_prevLevel;

         if( s >= 0 )

                 m_prevLevel += s / m_attack;

         else

                 m_prevLevel += s / m_release;

         if( m_prevLevel > m_threshold ) {

                 //k = (( currLevel - m_level ) / m_ratio + m_level) / currLevel;

                 double k = Math.pow( m_prevLevel / m_threshold, (double)m_ratio ) * m_threshold / m_prevLevel;

                 sample *= k;

         }

         return sample;

 }

}

Предыдущая  Содержание  Следующая