피크 검출기를 이용한 컴프레서
저번의 실효치를 이용한 컴프레서에서 피크 포락선을 검출하는 방법으로 변형하여 컴프레서를 구현해 보겠습니다.
- 내용은 저번 글과 동일하게 포락선을 구하고,
- 포락선과 문턱 레벨(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에 남겨 주시면 고맙겠습니다.
'Audio Processing' 카테고리의 다른 글
오디오용 필터(1)-필터의 종류와 특성, 이상적인 필터 특성 (0) | 2021.10.29 |
---|---|
다이내믹 신호처리(7)-게이트 (0) | 2021.10.21 |
다이내믹 신호처리(5)-실효치 컴프레서, 리미터 (0) | 2021.10.21 |
다이내믹 신호처리(4)-어택과 릴리즈를 고려한 포락선 검출 (0) | 2021.10.21 |
다이내믹 신호처리(3)-실효치 포락선, 피크 포락선 (0) | 2021.10.21 |