본문 바로가기
Audio Processing

다이내믹 신호처리(4)-어택과 릴리즈를 고려한 포락선 검출

by gigasound 2021. 10. 21.


오디오 신호 특성을 고려한 포락선 검출

지난 글에서 오디오 신호가 시간에 따라 4개의 구간으로 구분된다고 설명했습니다. 이 중에서 어택과 릴리즈에 따라서 포락선을 다르게 구하는 방법을 알아보겠습니다.

이는 오디오 신호의 변화를 청감적인 특성을 좀 더 고려해서 포락선을 구하는 방법으로 에텍 구간에서는 될 수 있으면 빠르게 증가하는 오디오 신호를 포락선에 빠르게 반영하고 오디오 신호가 감소하는 릴리즈 구간에서는 포락선 감소로를 다소 늦추는 것입니다. 이 방법은 다이내믹 신호처리에서 일반적으로 사용하는 방법입니다.


 신호 변화만 고려한 포락선 검출

지난 글에서 신호의 변화에서 피크신호를 둔화시키는 내용의 포락선을 구한 적이 있습니다. 이를 좀 변경해서 신호가 증가할 때와 감소할 때 각기 다른 시정수를 적용하도록 GNU Octave의 스크립트를 변경했습니다.

일반적으로 어택 조정 시간(alpha_a)이 릴리즈 시간(alpha_r)보다 짧습니다. 아래처럼 두 시간을 같게 하면 기존의 포락선 검출 내용과 같은 결과를 얻게 됩니다.  시간은 모두 ms단위입니다. 

clear all
file_name = 'test.wav';
[xx,fs]=audioread(file_name);
fs = 44100;
alpha_a = 10 * 10^-3;
alpha_r = 10 * 10^-3;
tau_a = exp(-1/ alpha_a/fs);
tau_r = exp(-1/ alpha_r/fs);
start_x = 25000;
gap = 50000;
end_x = start_x + (gap-1);
x = xx(start_x:end_x,1);
env= abs(x(1,1));
for i = 1 : gap
  tmp = abs(x(i));
  if(tmp>env)
    env = tmp +(tau_a*(env-tmp));
  else
    env = tmp +(tau_r*(env-tmp));
  endif
  y(i,1) = env;
endfor
clf 
plot(x,'g');
hold on 
plot(y,'r');
ylim([-0.3 0.3]);
grid on;

릴리즈 시간 alpha_r=100으로 증가하면 다음과 같이 신호가 감소하는 부분의 포락선 모양이 현저하게 달라집니다. 감소 부분을 다소 무시하듯이 포락선이 형성되는데 이런 상태의 포락선으로 다이내믹 신호처리를 하는 것이 더 좋습니다. 왜 야하면 신호의 증감을 모두 반영하면 다이내믹 처리 결과가 너무 심한 볼륨 변화로 느껴져 불쾌감만 증가하게 됩니다.  


실효치 포락선에 어택과 릴리즈 조건 추가

저번 글에서 다룬 실효치 포락선 검출에도 어택과 릴리즈 조건을 추가할 수 있습니다. 일단 실효치 포락선을 구한 다음에 어택과 릴리즈 조건에 따라 포락선의 증가 감소를 조정합니다. 이를 위해서 3개의 시정수가 필요합니다. 기존의 실효치를 구하는 시정수와 어택 그리고 릴리즈 조건의 시정수를 함께 사용합니다. 

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);
rms = 0;
avg = 0;
env = 0;
for i = 1 : gap
  tmp = x(i) * x(i);
  avg = tmp + (tau_avg*(avg-tmp));
  rms = sqrt(avg);
  if(rms>env)
    env = rms +(tau_a*(env-rms));
  else
    env = rms +(tau_r*(env-rms));
  endif
  y(i,1) = env;
endfor
clf 
plot(x,'g');
hold on 
plot(y,'r');
ylim([-0.3 0.3]);
grid on;

그러면 어택과 릴리즈 구간에서 다른 포락선 특성을 구할 수 있습니다. 이 스크립트 내용이 다이내믹 신호처리에서 주로 사용됩니다.

다른 글에서 이 포락선 검출 방법을 이용해서 다이내믹 신호처리 방법을 알아보겠습니다. 


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


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

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