파이썬 오디오 처리 - paisseon odio cheoli

# 모든 소리는 진동이다

## 우리가 소리를 감지하는 과정

  1. 어떤 물체가 진동을 한다. 이때 진동 주파수는 대충 440hz라고 하자
  2. 그 물체 주변의 매질이 440hz의 진동을 전달한다 (eg.공기)
  3. 그 진동 신호를 달팽이관이 전기신호로 바꿔서 청신경에 전달한다.
  4. 뇌가 신호를 받아서 해석한다 440hz를 인식

소리의 진동을 표현하는 단위는 헤르츠(herz, hz) 이다.
10hz는 1초에 10번, 100hz는 1초에 100번 진동을 했다는 의미이고
1khz는 1초에 1000번 진동을 했다는 것이다.

이때의 진동은 자연적으로 발생한 것으로 아날로그(Analog)형태로 나타난다.
아날로그란 자료를 연속적인 물리량으로 나타낸 것으로 여기서 포인트는 연속적이다
반대로 생각하면 디지털은 연속적이지 않다고 할 수 있다.

## 소리의 3요소

소리의 3요소란 소리의 세기, 높낮이, 맵시를 말한다. 이 세 가지 요소는 각각 소리라는 파동의 진폭, 진동수, 파형에 해당한다. 파동의 진폭이 클수록 더 소리는 크게 난다. 또한 파동의 주파수는 소리의 높낮이를 결정짓는다. 고음은 진동수가 높고, 저음은 진동수가 낮다. 마지막으로 소리의 맵시는 파형에 의하여 결정된다. 같은 음이라도 피아노의 도, 사람의 도, 바이올린의 도가 다른 이유도 소리의 파형이 달라서이다.


# 수학적으로 나타내기

## 선행지식

파동을 수학적으로 나타내기 위해 우리는 삼각함수를 사용한다. 그리고 삼각함수를 제대로 이해하기 위해 기본적인 개념을 선행해야 한다.

1. 일반각

파이썬 오디오 처리 - paisseon odio cheoli

위 그림에서 OB→\overrightarrow{OB} 가 회전할 때, 회전한 정도를 각의 크기라고 하고 시작하는 선인 OA→\overrightarrow{OA} 를 시초선, 움직이는 선인 OB→\overrightarrow{OB}동경이라 한다

여기서 중요한 것은 같은 위치에 있는 동경이라고 하더라도 회전한 방향과 회전한 수에 따라 각의 크기가 다르다. (일반각360°\degree와 720°\degree는 동경의 위치가 같음)

θ=360°×n+a°\theta = 360\degree \times n + a\degree(n은 정수)

동경의 위치만으로 각의 크기를 나타낼 때는 위와 같이 쓰며, 이를 일반각 이라 한다.


2. 호도법

호의 길이와 중심각의 크기가 비례하는 성질을 이용하여 호의 길이가 반지름의 길이와 같을 때의 중심각의 크기를 1라디안으로 정의하는 방법.

각도를 호도법으로 나타낼 때는 관습상 단위를 생략한다.

  1. 호의길이 : 원의둘레 = 호의각도 : 전체각도360
  2. r:2πr=a:360r:2\pi r=a:360
  3. a=180 πa = {180\over\ \pi}

1 라디안 = 180π180\over \pi
1°\degree = π180\pi \over180 라디안
π\pi 라디안 = 180°\degree


## 왜 삼각함수일까?

먼저 단위원을 그려보자

파이썬 오디오 처리 - paisseon odio cheoli
단위원은 반지름이 1이기 때문에 sinθsin\thetayy값이 일치하며, tanθtan\thetaxx 값이 일치한다

θ\theta가 90°\degree에 가까워지면 sinθsin\theta의 값은 1에 가까워진다.
θ\theta가 180°\degree에 가까워지면 sinθsin\theta의 값은 0에 가까워진다.
θ\theta가 270°\degree에 가까워지면 sinθsin\theta의 값은 -1에 가까워지고
θ\theta가 360° \degree에 가까워지면 sinθsin\theta의 값은 0에 가까워진다.

원의 위에서 (x, yx,y)좌표는 주기를 반복한다. 그래서 삼각함수는 주기를 그리는 함수이고 그렇기 때문에 파동을 표현할 수 있게 된다.

파이썬 오디오 처리 - paisseon odio cheoli
( 여기서 xx좌표는 원의 둘레 이며 yy좌표는 똑같이 yy좌표이다. )

삼각함수 그래프 설명 영상

## wave equation

y = A sin(2π\pift)

A=A = 진폭 (피크 값)
f=f = 주파수
t=t = 시간

파동방정식(sin waves) 분석

  1. 호도법을 적용하면 π\pi라디안은 180°\degree이므로 원이 한바퀴를 돌았을때의 라디안은 2π2\pi이다.
  2. sin함수에 2π2\pi를 넣으면 한번의 주기가 그려진다.
  3. 주파수는 440hz일때 1초에 440번을 진동한다는 의미 이므로 440을 곱하게되면 440번의 주기를 그린다
  4. 시간이 1이면 440번을 진동, 14401\over 440초 이면 한번의 주기만을 그린다.
  5. AA는 반지름이다. 단위원 일때는 1이다.

( 위 분석은 주관적인 분석 입니다. 오류가 있다면 알려주세요 )


파동 종류 참고
파이썬 오디오 처리 - paisseon odio cheoli



# 파이썬으로 구현하기

## 함수만들기

import numpy as np


def get_wave(freq, time, amplitude):
  '''
  amplitude=진폭, 반지름
  freq=주파수,1초당 진동횟수
  '''

  sample_rate = freq * 100
  time_sr = np.linspace(0, time, int(sample_rate * time))

  # 파동함수
  wave = amplitude * np.sin(2 * np.pi * freq * time_sr)
    
  return time_sr, wave


x, y = get_wave(440, 1, 1) 

## 그래프로 나타내기

import matplotlib.pyplot as plt

#hz당 100개로 나누었기때문에 100까지가 하나의 파동, 100까지만 그래프로 나타낸다
plt.plot(x[0:100], y[0:100])
plt.xlabel('time')
plt.ylabel('Amplitude')
plt.show()

파이썬 오디오 처리 - paisseon odio cheoli

## 소리재생

from IPython.display import Audio
Audio(y, rate=len(y))

440hz는 '라'음이기 때문에 라 소리가 난다


Reference

음악과 물리학 -2. 소리와 파동
How to Play Music Using Mathematics in Python
소리의 3요소(three elements of sound)
파이썬 오디오 라이브러리 Top 5종 (Python Audio Library)