본문 바로가기
Audio Processing

다이내믹 신호처리(7)-게이트

by gigasound 2021. 10. 21.


게이트

다이내믹 프로세서에서 게이트(gate) 또는 노이즈 게이트(noise gate)는 아래 그림과 같이 문턱 레벨(threshold) 이하의 신호는 모두 묵음(mute)으로 처리하는 장치입니다. 

 

게이트 또한 포락선을 구하고, 포락선에서 문턱 레벨 조건을 이용해서 동작합니다.

포락선을 사용하지 않고 그냥 입력 신호의 크기 조건으로 게이트를 동작시키면, 신호의 중간중간마다 묵음이 발생해서 딱딱 끊기는듯한 소리로 들리게 됩니다. 그러니 포락선을 기준으로 게이트가 동작해야 합니다.


실효치 게이트 구현 코드

아래의 코드는 실효치 포락선을 구해서 게이트를 구현하는 내용입니다. 포락선 조건만 잘 구하면 이득을 처리하는 부분인 매우 단순합니다. 

clear all
file_name = 'test.wav';
[xx,fs]=audioread(file_name);
fs = 44100;
alpha_avg = 5 * 10^-3;
alpha_a = 10 * 10^-3;
alpha_r = 100 * 10^-3;
tau_avg = exp(-1/ alpha_avg/fs);
tau_a = exp(-1/ alpha_a/fs);
tau_r = exp(-1/ alpha_r/fs);
start_x = 25000;
gap = 30000;
end_x = start_x + (gap-1);
x = xx(start_x:end_x,1);
threshold = -27;
thd = 10^(threshold/20)
rms = 0;
avg = 0;
env = 0;
for i = 1 : gap
  tmp = x(i,1) * x(i,1);
  avg = tmp + (tau_avg*(avg-tmp));
  rms = sqrt(avg);
  y(i,1) = rms;
  if(rms>env)
    env = rms +(tau_a*(env-rms));
  else
    env = rms +(tau_r*(env-rms));
  endif
  y(i,1) = x(i,1);
  if(env<thd)
    y(i,1) =0;
  endif
endfor
clf 
plot(x,'g');
hold on 
plot(y,'r');
ylim([-0.3 0.3]);
grid on;

게이트의 동작 결과입니다. 포락선 조건으로 출력 신호가 제한되는 것을 볼 수 있습니다.


피크 모드 게이트 구현 코드

피크 모드도 실효치 모드만큼 간단하게 구현이 가능합니다. 다만 실효치 모드보다 신호 변화에 대해 민감하게 동작합니다. 

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 = -27;
dc_offset = 0.000000001;
over_dB = dc_offset;
peak =0;
env_dB = 0;
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);
  # 이득이 감소 또는 증가에 따라 포락선 이득 구함
  if(over_dB>env_dB)
    env_dB = signal_dB +(tau_a*(env_dB-signal_dB));
  else
    env_dB = signal_dB +(tau_r*(env_dB-signal_dB));
  endif
  y(i,1) = x(i,1);
  if(env_dB<threshold)
    y(i,1) =0;
  endif
endfor

clf 
plot(x,'g');
hold on 
plot(y,'r');
ylim([-0.4 0.4]);
grid on;

피크 모드의 구현 결과입니다. 문턱 레벨 조건 이하의 신호가 억제되어 있습니다.

 

위의 출력을 보면 중간에 약간 묵음이 있는 형태입니다. 이는 원치 않는 게이트 출력일 수도 있습니다. 원인은 릴리즈 시간입니다. 일반적으로 게이트는 릴리즈 시간을 길게 형성해서 실제로 신호가 없는 경우에만 게이트가 동작하도록 유도합니다. 


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


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

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