본문 바로가기

이직로그/DSP

Audio DSP: 일렉기타 이펙터 만들기 1

일렉기타 이펙터 만들기 0 

 

일단 0의 방식을 진행하기 전에 우선 기본적으로 오버드라이브를 만들어보자

 

import numpy as np
import soundfile as sf

x, sr = sf.read("sine_wave.wav")

gain = 10
y = np.tanh(gain * x)

sf.write("sine_wave_gain10.wav", y, sr)

 

게인을 5, 10씩 줘서 다양한 outpupt 을 생성하였다. 이를 토대로 매트랩으로 스펙트럼 분석을 해보자

더보기

코드는 아래와 같다

sine_files = {
    'DATA/sine wave.wav'
    'DATA/sine wave gain5.wav'
    'DATA/sine wave gain10.wav'
};



files = sine_files;

figure

for i = 1:length(files)
    
    [x, fs] = audioread(files{i});
    [P, f] = pspectrum(x,fs);

    P_dB = 10*log10(P);

    % 그래프 생성
    subplot(length(files),1,i);
    plot(f, P_dB)
    xlabel('Frequency (Hz)')
    ylabel('Power (dB)')
    grid on
    title(files{i}(6:end-4))
end

 

sine_files = {
    'DATA/sine wave.wav'
    'DATA/sine wave gain5.wav'
    'DATA/sine wave gain10.wav'
};

figure

for i = 1:length(sine_files)
    
    [x, fs] = audioread(sine_files{i});
    
    if size(x,2) > 1
        x = x(:,1);
    end

    t = (0:length(x)-1)/fs;

    subplot(length(sine_files),1,i)
    plot(t, x)
    xlabel('Time (s)')
    ylabel('Amplitude')
    xlim([0 0.01])
    ylim([-1.1 1.1])
    title(sine_files{i}(6:end-4))
    grid on
end

Time Domain

이런식으로 sin파가 사각파에 가까워지는걸 clipping이라고 한다.

Frequency Domain

 

원본은 440Hz 부근에서만 피크가 보이지만

gain 을 늘릴수록 배음이 커지느것을 볼수있다.

 

배음을 좀더 분석해보려고 peak를 분석해보았다.

더보기

 

sine_files = {
    'DATA/sine wave.wav'
    'DATA/sine wave gain5.wav'
    'DATA/sine wave gain10.wav'
};



files = sine_files;

figure

for i = 1:length(files)
    
    [x, fs] = audioread(files{i});
    [P, f] = pspectrum(x,fs);

    P_dB = 10*log10(P);

    % peak 검출
    [pks, locs] = findpeaks(P_dB, f, ...
        'MinPeakHeight', max(P_dB)-40,...   % 상위 40 dB만
        'MinPeakDistance', 50);              % 너무 가까운 peak 제거

    fprintf('\n%s\n', files{i}(6:end-4));
    fprintf('Peak Frequencies (Hz) | Power (dB)\n');
    fprintf('-----------------------------------\n');
    for k = 1:length(pks)
        fprintf('%10.2f Hz | %8.2f dB\n', locs(k), pks(k));
    end
    % 그래프 생성
    subplot(length(files),1,i);
    plot(f, P_dB)
    xlabel('Frequency (Hz)')
    ylabel('Power (dB)')
    grid on
    title(files{i}(6:end-4))
end
sine wave
Peak Frequencies (Hz) | Power (dB)
-----------------------------------
    441.54 Hz |    -3.03 dB

sine wave gain5
Peak Frequencies (Hz) | Power (dB)
-----------------------------------
    441.54 Hz |    -1.08 dB
   1319.23 Hz |   -11.76 dB
   2202.31 Hz |   -18.31 dB
   3080.00 Hz |   -23.99 dB
   3957.69 Hz |   -29.51 dB
   4840.77 Hz |   -34.89 dB
   5718.46 Hz |   -40.29 dB

sine wave gain10
Peak Frequencies (Hz) | Power (dB)
-----------------------------------
    441.54 Hz |    -0.97 dB
   1319.23 Hz |   -10.78 dB
   2202.31 Hz |   -15.81 dB
   3080.00 Hz |   -19.51 dB
   3957.69 Hz |   -22.77 dB
   4840.77 Hz |   -25.72 dB
   5718.46 Hz |   -28.59 dB
   6601.54 Hz |   -31.39 dB
   7479.23 Hz |   -34.13 dB
   8362.31 Hz |   -36.91 dB
   9240.00 Hz |   -39.60 dB

 

두가지 분석 결과를 얻을 수 있다.

1. overdrive를 거치면 홀수 배음 생성된다.

2. gain값이 커질수록 배음의 진폭이 커진다.