게이트
다이내믹 프로세서에서 게이트(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에 남겨 주시면 고맙겠습니다.
'Audio Processing' 카테고리의 다른 글
오디오 필터(2)-바이쿼드 필터 (Bi-quad Filter), s 영역, z영역, 필터의 안정성 (0) | 2021.10.29 |
---|---|
오디오용 필터(1)-필터의 종류와 특성, 이상적인 필터 특성 (0) | 2021.10.29 |
다이내믹 신호처리(6)-피크 모드 컴프레서, 리미터 (0) | 2021.10.21 |
다이내믹 신호처리(5)-실효치 컴프레서, 리미터 (0) | 2021.10.21 |
다이내믹 신호처리(4)-어택과 릴리즈를 고려한 포락선 검출 (0) | 2021.10.21 |