Компрессор |
Предыдущая Содержание Следующая |
![]() |
Компрессор используется для уменьшения динамического диапазона сигнала.
Параметрами компрессора являются: порог, выше которого начинается обработка отношение - отношение уровня входного сигнала к выходному выше точки перелома перелом - крутизна в точке перелома время атаки - как быстро реагирует на повышение уровня время спада - как быстро реагирует на понижение уровня
Трактовка параметров компрессоров различается. Где-то используется "отношение" как отношение уровня входного сигнала к выходному выше точки перелома как абсолютная величина, где-то как относительная выше точки перелома. Кривая выше точки перелома может рассматриваться как линейная или логарифмическая. РеализацияПростой компрессор. Перелом жесткий. Кривая регулирования логарифмическая.
Вариант параметров: 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; } } |
Предыдущая Содержание Следующая |