본문 바로가기

이직로그/DSP

Audio DSP: 일렉기타 이펙터 만들기 2 - wet, dry 신호 분석

일단 사용하려는 아날로그 이펙터는 Jan Ray 복각버전이다.

clean1.wav
0.85MB
janray.wav
0.85MB

 

clean1.wav의 경우에는 일렉기타에서 바로 오디오인터페이스를 통해 녹음한 신호이다.(일반적으로 clean,dray라고 불림)

janray.wav의 경우에는 clean1.wav파일을 오디오인터페이스로 다시 출력하여 Jan Ray에 다시 시그널을 통과시켜 일종의 리앰핑을 한 신호이다.

잔래이 특유의 고급진 음색을 느낄수있다.

 

 

clean1은 Clean

janray는 JanRay

으로 주파수 대역에서 표기해보도록 해봤다. 코드는 접은글에

더보기
guitar_files = {
    'DATA/clean1.wav'
    'DATA/janray.wav'
};


% wav 읽기
[x, fs] = audioread(guitar_files{1});
[y, ~]  = audioread(guitar_files{2});


% 길이 맞추기
N = min(length(x), length(y));
x = x(1:N);
y = y(1:N) ;

% FFT
X = fft(x);
Y = fft(y);

% H(f) 계산
eps = 1e-10;
H = Y ./ (X1 + eps);

% 주파수 축
f = (0:N-1)*(fs/N);

% magnitude (dB)
X_mag = 20*log10(abs(X) + 1e-12);
Y_mag = 20*log10(abs(Y) + 1e-12);
%plot (양수 주파수만)
half = floor(N/2);
% 아래과정을 진행함으로서 구간별 평균값을 표기해서 smooth한 그래프를 출력한다.
window_size = 200;
% H_smooth = sgolayfilt(H_mag,3,201);
X_smooth = movmean(X_mag, window_size);
Y_smooth = movmean(Y_mag, window_size);
figure

% clean (파란색)
plot(f(1:half), X_smooth(1:half), 'b')
hold on

% janray (빨강)
plot(f(1:half), Y_smooth(1:half), 'r', 'LineWidth', 2)

xlabel('Frequency (Hz)')
ylabel('Magnitude (dB)')
title('Frequency Response Comparison')
legend('Clean', 'JanRay')
grid on

 

필터링 된 신호는 원신호보다 bass는 크고 treble은 작은걸 볼수있다.

그리고 eq 분포가 약간 정돈된 느낌을 가지기도 한다.

 

이므로 주파수 대역에서 (janray)/(clean) 라는 간단한 수식으로 진행하려고 했다.

 

하지만 이럴경우 X(f)값이 0에 가깝거나 0 일때 H값이 매우 커지는 문제가 발생하기 때문에 아래 수식을 더 많이 이용한다고 한다.

 

해당 수식을 이용하여 H함수를 만들고 이를 다시 다른 clean 기타톤인 clean2.wav에 적용하여 

새로운 파일 estimated_janray.wav를 만들어보았다.

clean2.wav
0.71MB
estimated_janray.wav
0.84MB

 

 

들리다 싶이 estimated_janray.wav파일을 들어보면 조악하고 좋게 말해야 리버브 나쁘게 말하면 기분나쁜 피드백 소리가 강하게 나는걸 볼수있다.