본문 바로가기
Audio Processing

다이내믹 신호처리(6)-피크 모드 컴프레서, 리미터

by gigasound 2021. 10. 21.


피크 검출기를 이용한 컴프레서

저번의 실효치를 이용한 컴프레서에서 피크 포락선을 검출하는 방법으로 변형하여 컴프레서를 구현해 보겠습니다.

  • 내용은 저번 글과 동일하게 포락선을 구하고,
  • 포락선과 문턱 레벨(threshold)의 차이를 이용해서 압축비(ratio)를 반영한 이득을 구하고,
  • 입력 신호에 이득을 곱해서 출력하는 방법입니다.  

구현 코드

다음은 GNU Octave로 구현한 피크 모드 컴프레서입니다. 

clear all
file_name = 'test.wav';
[xx,fs]=audioread(file_name);
peak_hold_time = 5*10^-3;
peak_hold_max = peak_hold_time * fs;
peak_hold_cnt =0;
start_x = 25000;
gap = 30000;
end_x = start_x + (gap-1);
x = xx(start_x:end_x,1);
alpha_a = 10 * 10^-3;
alpha_r = 100 * 10^-3;
tau_a = exp(-1/ alpha_a/fs);
tau_r = exp(-1/ alpha_r/fs);
threshold = -21;
dc_offset = 0.000000001;
over_dB = dc_offset;
peak =0;
env_dB = 0;
ratio = 4;
for i = 1 : gap
  tmp = abs(x(i,1));
  if((tmp>=peak)||(peak_hold_cnt > peak_hold_max))
    peak_hold_cnt=0;
  else 
    peak_hold_cnt++;
  endif
  if(peak_hold_cnt ==0)
    peak = tmp;
    if (peak==0)
      peak = dc_offset;
    endif
  endif
  signal_dB = 20*log10(peak);
  over_dB = signal_dB - threshold;
  if(over_dB<0)
    over_dB = dc_offset;    
  endif
  # 이득이 감소 또는 증가에 따라 포락선 이득 구함
  if(over_dB>env_dB)
    env_dB = over_dB +(tau_a*(env_dB-over_dB));
  else
    env_dB = over_dB +(tau_r*(env_dB-over_dB));
  endif
  # 포락선 내용 반영
  control_dB = env_dB * (1-ratio);
  #압축비를고려하여 이득 수정
  if (control_dB==0)
    control_dB_dB = dc_offset;
  endif
  #출력 기록
  y(i,1) = x(i,1)*10^(control_dB/20);
  #입력과 출력의 차이 기록
  dy(i,1)=x(i)-y(i,1);
  # 이득의 변화를 기록
  g(i,1)=control_dB;
endfor

clf 
subplot(3,1,1)
plot(x,'g');
hold on 
plot(y,'r');
ylim([-0.4 0.4]);
grid on;
subplot(3,1,2);
plot(dy);
ylim([-0.4 0.4]);
grid on;
subplot(3,1,3);
plot(g);
ylim([-30 3]);
grid on;

기존과 글과 동일한 조건으로 컴프레서를 동작하면 피크 포락선의 조건에 너무 과도하게 반응해서 압축이 많이 적용되었습니다. 

문턱 레벨을 -15dB로 변경해 보겠습니다. 그러면 어택 부분과 릴리즈 부분이 구분되면서 압축이 진행되고 있습니다. 또한 작은 신호에서는 압축이 덜 적용되고 있습니다. 

피크 포락선으로도 컴프레서 동작이 잘됩니다. 실효치보다 신호 변화에 민감하게 반응합니다. 이 내용이 꼭 좋다는 의미가 아니라 실효치 방식과 피크 방식이 서로 다른 특성을 보인다는 의미입니다.  


리미터 

이번엔 압축률을 10으로 해서 피크 모드 리미터를 만들어 보겠습니다. 큰 입력 신호에 대해 압축이 크게 발생하고 있고, 출력 신호의 크기가 제한되어 보입니다. 


광고좀 꾹 눌러주시면 고맙겠습니다. 


위의 내용을 참조용으로만 사용해주세요. 무단 도용이나 무단 복제는 불허합니다.

기타 문의 사항은 gigasound@naver.com에 남겨 주시면 고맙겠습니다.