The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

Компрессор

Компрессор

Предыдущая  Содержание  Следующая  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;

 }

}

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