728x90

멀티미디어 사운드 프로그래밍(Multimedia Sound Programming)

이론편|실제편|응용편|특강편
한학용, 하성욱, 허강인 공저

Part 1. 이론편

Chapter 1. 디지털 사운드의 기본

소리의 물리적인 특징

소리의 발생

소리와 사운드는 같은말. 디지털 소리 보다는 디지털 사운드라는 표현이 더 어울리고 사운드의 울림 보다는 소리의 울림이 더 자연스러운 표현이다.

소리는 공기의 떨림(진동)에 의해서 발생한다.
진동에 대하여 공기의 교란이 일어날 경우 공기의 압력이 평균 대기압보다 높은 부분과 낮은 부분이 생기고, 그것이 파로 전해진다.

물리적으로 볼 때, 떨림(진동)의 필요조건이 탄성(되돌아 갈려는 성질)과 질량(무게)이다. 용수철 저울의 진동의 경우 탄성이 용수철에 해당하고 질량이 추의 질량에 해당한다.


소리의 전달

소리가 발생한 곳은 음원이라고 한다.
음원으로부터의 아주 미세한 공기의 움직임도 압력의 변화를 가져오고 주위 공기 분자의 충돌에 의하여 옆으로 전달되어 전파되어 간다.
압력은 높은 곳에서 낮은 곳으로 미는 성질이 있다. 공기중의 어떤 한 부분이 물체의 떨림(진동)으로 인해 압력이 높아졌다면 주위의 낮은 부분의 공기를 밀게되고 밀린 부분의 공기는 압력이 높아져 다시 옆의 공기를 밀게된다. 결국 도미노 현상으로 소리가 전달되는 것이다.

음이 전달되는 속도는 공기중에서 온도에 따라 달라진다.
v = 331.5 + 0.61t m/sec (v : 음속, t : 온도)

대기 온도 15도에서 소리가 공기중에서 전달되는 속도를 계산하면 약 340m/sec가 된다.

매질에 따라서도 달라지는데 수중에서는 약 1,500m/sec이고 철과 유리 같은 고체는 약5,000m/sec가 된다.


소리의 성질

소리는 빛과 같이 곧바로 진행하는 성질을 갖지만, 경우에 따라 경로가 굴절되거나 그늘에서 회절하는 성질이 있다.

음파와 물에서 생기는 수면파는 모두 파이지만

음파는 진동에 의해서 생기는 매질의 압축과 팽창의 방향과 파의 진행방향이 같은데 이러한 파를 종파(Transverse Wave)라고 한다.
반면 수면파는 파가 전해지는 방향과 직각으로 매질이 진동하는데 이러한 파를 횡파(Longitudinal Wave)라고 한다.

공기중에 소리가 발생할 경우 음원으로부터 모든 방향에 구의 모양으로 확상된다. 이것을 구면파라고 한다.

구면파는 음원에서 멀어질수록 소리가 급속하게 약해진다.
음원로부터 거리가 2배가 되면 면적은 4배로 늘어나므로 같은 면적으로 측정을 한다면 거리가 2배로 늘어난 면적의 세기는 1/4이 된다.

또한 실내에서는 소리와 반사와 흡음으로 인하여 전파의 성질도 달라지게 된다.
실내에서 물체의 물리적 특징과 공기의 상태에 따라서 특정 주파수는 반사하고 흡수하게된다.
보강 간섭 이 일어나면 음파의 세기가 증가하여 큰소리로 들리고
소멸간섭(상쇄 같섭)이 일어나면 음파의 세기는 감소하여 소리를 들을수 없다.

또한 어떤 표면에 반사되어 튕겨나간 소리는 다른 소리에 충돌할 수 있는데
평면 반사
볼록면 반사
오목면 반사
모서리 반사(90도와 같이 각진 면)

가는 관속에서 전달되는 소리는 구면파와 달리 파가 확산되지 않고 전달되므로 앞에서와 같이 작아지지 않는다.
이러한 파를 평면파라고 하며 구면파와는 달리 거리가 멀어져도 작이지지 않고 전달된다.

소리는 파동이기때문에 물체가 진행방향으로 가로막고 있다고 해도 그 물체의 뒷면으로 전달된다. (Over 의 느낌)
이러한 현상을 회절 이라고 한다.
소리의 회절 현상을 낮은 주파수의 음일수록 현저하며, 주파수가 높을수록 회절을 일으키기 힘들다.

소리는 매질이 다른 곳을 통과할 때 전파속도가 달라져서 그 진행방향이 변화된다.
이것을 음의 굴절이라고 한다. 주간에 안들리는 소리가 야간에 잘들리는 이유도 주변이 조용해지기도 하지만 지표면의 온도변화로 음이 굴절되기 때문이기도 하다.


소리의 모양

소리를 그림으로 그리면 가로축을 시간(x=t) 세로축을 공기의 압력(y=p)로 표현하면 소리를 그림으로 그릴수 있다.
이렇게 그림으로 나타낸 파의 형태를 파형 이라고 한다.

일정한 소리는 기본 패턴의 파형을 반복하게 된다 이러한 동일한 반복 패턴의 길이를 파장이라고 하고, 1초동안의 파장의 반복 횟수를 주파수 라고 한다.

주파수는의 단위는 전파의 존재를 확인한 물리학자의 이름을 따서 헤르츠(Hz)라고 한다. 주파수의 역수는 1회 반복하는데 걸리는 시간을 의미하는데 이를 주기 라고 한다.
음속을 주파수로 나누면 1주기 동안 이동한 거리인 파장을 구할 수 있다. 1000Hz의 소리의 경우 약 34cm가 된다.

일정한 주기로 반복되는 파형의 경우, 음파의 기본 패턴내의 어떠한 시점을 나타내는 단위가 있으면 편리할 것이다.
이것을 위상이라고 하는데 1주기를 360도로 하여 각 순간을 각도로 나타낸다. 위상이 360를 넘으면 같은 파형이 반복된다.

모든 소리는 기본음의 조합으로 나타내어 질 수 있다. 반대로 모든 소리는 여러 개의 기본음으로 분해할 수도 있는데 이 이론은 나폴레옹 시대의 수학자 퓨리에에 의하여 수학적으로 증명되고 실제 이용된다.
(= 모든 복합음은 단순음의 조합으로 만들수 있다.)


소리의 구성

사실 단순음은 인간이 만든 인공음이다. 자연의 모든 소리는 주파수가 다른 여러개의 기본음이 조합된 복합음이다.
복합음을 구성하는 단순음 중에서 가장 주파수가 낮은 단순음을 기본음이라고 하고 그 주파수를 기본 주파수라고 한다.
기본음 외의 소리는 기본음의 정수배의 주파수를 가진 소리를 배음이라고 한다.

예를 들면 음성의 경우에 성대가 주기적으로 진동하는 유성음은 기본음과 그 기본음의 정수배의 배음으로 이루어져 있다.

음율(순정율과 평균율)
음율이란 악기의 각음의 주파수 관계를 말한다.
대표적으로 적용되는것이 피아노와 같은 건반악기의 경우 도레미파솔라시도 각 건반은 평균율로 조율하며 아카펠라와 같은 합창과 현악 4중주는 순정율로 조율한다.

순정율은 도의 주파수가 1이라고 할때 각 건반의 주파수는 다음과 같다.

1 9/8 5/4 4/3 3/2 5/3 15/8 2

그러므로 으뜸화음인 도-미-솔의 주파수 비율은 4:5:6이 되고 딸림화음 솔-시-레의 주파수 비율은 역시 4:5:6이 된다.
즉 수학적으로 주파수의 비를 정수비가 되도록 만들어 놓은 것을 순정률이라고 한다. 순정률의 경우 음과 음 사이의 주파수 간격은 일정하지 않다.

이와는 달리 한 음정과 다음 음정 사이의 비율이 약 1.06으로 일정하게 한 음율을 평균율이라고 한다.||


소리의 울림

소리의 공명
공명 현상을 이해하기 위해서 그네를 살펴보자. 그네는 진자의 일종이다.
자연스럽게 흔들리는 상태에서 그네는 일정 주기로 흔들린다. 즉 그네 줄의 길이에 따라 결정되는 고유 진동수(주파수)가 있는 것이다.
진동하는 크기가 바뀌어도 고유 진동수는 항상 일정하다.

진자의 길이를 짧게 하면 고유 진동수는 증가한다. 여기에서 중요한 사실은 진동할 수 있는 모든 물체는 그 물체 자신이 가장 진동하기 쉬운 고유 주파수(고유 진동수)를 가지고 있다는 사실이다.
이 주파수로 물체가 진동하는 것을 공진 이라고 하고 고유 진동수를 공진 주파수 라고 한다. 또한 공진에 의하여 소리가 들리는 경우를 공명이라고 한다. 물체는 공진 주파수로 진동할 때 가장 크게 진동하게 된다.

주위의 공기가 공진 주파수로 강하게 진동하면 물체도 공진하여 공진 주파수를 성분으로 하는 소리를 낸다. 물체가 울리는 원인 가운데 하나다. 진자는 줄의 길이가 짧을 수록 공진 주파수가 높다.그러므로 현악기 타악기 관악기의 경우도 작을수록 높은 소리를 낸다. 사람의 경우도 성대가ㅏ 작은 여자와 어린이가 높은 소리를 내고 작은 스피커일수록 고음을 맡는 이유가 이 때문이다.

양끝이 고정된 현의 진동과 양쪽이 열린 파이프의 진동의 파장과 주파수는 동일한 형식을 가진다. 양끝이 고정된 현을 켜면 진동하며 소리가 나게 된다.

가장 크게 진동하는 패턴이 기본 진동이며, 이것이 기본음으로 들린다.
현의 양끝이 고정되어 있으므로 중심부분이 가장 크게 진동하는데 이 부분을 배(Loop)라고 하고 진동에 대하여 움직이지 않는 부분을 마디(Node)라고 한다. 기본 진동외에 진동의 마디사이의 길이가 기본 진동의 1/2, 1/3 ... 인 1/정수 이 발생한다. 현의 장력이 일정할 경우, 파장은 1/정수가 되고 주파수는 정수배가 된다. 그러므로 양끝이 고정된 현의 소리는 기본음과 그 정수배음의 주파수로 이루어져 있다.

한쪽이 고정된 현과 한쪽이 닫힌 파이프의 경우는 같은 진동 패턴을 가진다. 파이프 안의 공기는 닫힌 끝을 마디, 열른 끝을 배로 하는 기본 진동의 공명을 발생시킨다.
그래서 파이프의 길이의 4배가 공진 주파수의 파장이 된다. 결국 공진 주파수는 파이프의 길이로 결정되며 굵기와는 무관하다. 그리고 이 기본 진동외에 진동의 마디 사이의 길이가 기본 진동의 1/3 1/1.5 인
1/홀수 가 발생한다. 예를 들어 기이가 17cm인 한쪽이 닫힌 파이프의 경우, 공진 주파수의 파장은 68cm가 된다. 음속인 340cm를 파장으로 나누면, 공진 주파수가 500Hz가 된다. 성인 남성의 성도의 길이가 평균17cm이므로 모음의 공진 주파수가 500Hz를 중심으로 분포하는 이유가 이 때문이다.


소리의 측정 단위 소리의 측정 단위로는 dB을 사용한다.
소리는 공기의 압력이 변화하는 현상이므로 그 강도를 압력으로 나타낸 것이 많으며, 이것을 음압이라고 한다.
단위는 압력의 국제 단위인 파스칼(Pa)이다. 1 파스칼은 면적 1제곱미터에 1N의 힘이 작용할 때의 압력이다.(1Pa = 1N/㎡)

음압의 기준은 사람이 들을 수 있는 최소의 소리 음압(이를 최소 가청값 Po라고 한다)를 기준으로 한다.
Po = 2 * 10^-5 N/㎡ = 20μPa

소리의 강도는 음압의 제곱에 비례하는데 소리의 강도를 그대로 나타내지 않고 이 기준값인 20μPa의 몇배인가로 표시한다.
그런데 강한 음향의 경우 음압이 100만배 이상, 소리의 강도로 약 10조배가 되므로 강도를 표현하기 위해서 많은 자리수가 필요하게 된다.
그래서 일정 소리의 음압P(마이크로 파스칼)와 기준 음압의 비를 제곱의 로그를 취하여 다음과 같은 식으로 나타낸다. 이것을 음압 레벨이라고 한다.
음압 레벨 = 10 log 10 (P/20)^2 dB
여기서 앞의 10이 없을 경우 그 단위가 벨(B)이 되는데 이경우 대부분이 한 자릿수가 되어 이번에는 자리수가 너무 적어 불편하다. 그래서 두~세 자리수의 편리한 자릿수로 음압을 취급할 수 있도록 보통 그 1/10인 데시(d)를 사용하여 dB단위를 이용한다.

음압의 10배 (소리의 강도는 100배)는 음압 레벨로 20dB에 해당한다.
120~140dB는 귀로 듣기에 약간 고통스러운 정도
보통 가정 평균 소음은 40dB, 일상 대화는 60dB, 음악 감상은 85dB, 소리가 큰 록밴드의 경우 약 110dB, 제트 엔진의 소음은 150dB정도가 된다.


소리의 인지 음원에서 발생한 소리는 공기를 매개로 하여 압력의 변화를 일으키고 우리의 귀에까지 전달되어 귀의 고막을 앞뒤로 움직인다. 그리고 그 진동은 고막으로부터 세 개의 작은 뼈에 의하여 내이라고 부르는 기관으로 전달된다. 내이에는 10000개 이상의 다른 크기를 가진 일련의 섬모를 가지고 있는데 여기에서는 전달된 진동을 신경 자극으로 바꾸어 준다. 자극은 뇌에 전달되어 우리가 어떠한 음을 이해하게 된다.

우리의 귀는 소리의 두 가지 특징인 크기(volume)와 피치(pitch)를 완벽하게 처리한다.
파형의 피치 혹은 주파수는 초당 파형의 진동 횟수와 관련이 있다. 귀의 내이에 있는 다른 크기를 가진 섬모들은 음파에 나타나는 특정 주파수에 반응하게 되어 있다. 섬모에 대한 진동의 양(크기)과 신경 자극의 강도가 특정 주파수의 진폭과 비례한다고 한다.

소리인 아날로그 사운드 파형들은 다소 복잡하지만 수학적으로 모델링하고 이를 프로그래밍하고 여러가지 처리를 할 수 있는 것이다. 물론, 자연계에 존재하는 어떠한 현상이나 객체가 얼마나 복잡하게 수학적으로 모델링 되는가 하는 것은 실세계에 존재하는 모델 대상이 얼마나 복잡한가 하는 것에 따라 달라질 것이다.

사운드의 디지털 표현법

샘플링은 연속적인 아날로그 사운드 데이터 중에서 일정한 간격으로 데이터를 취하여 저장하는 것을 말한다.

이러한 아날로그 신호의 디지털 표현법에는 여러가지 방법이 있다. 가장 일반적인 오디오 정보의 디지털적 표현법이 PCM(Pulse Code Modulation)이라는 방법이 있다. 전통적으로 사운드 파형은 다음과 같은 단계를 거쳐서 일련의 숫자 (수열:Sequence)인 디지털(PCM)으로 표현된다.

1. 간단한 사인 파형을 두고 예를 들면 사인 곡선중 중심선 위의 부분은 양의 압력과 중심선 아래의 음의 압력 변화를 나타낸다.
2. 마이크로폰(마이크)은 공기 중에 있는 오디오 신호를 전기적 신호로 변환한다. 마이크로폰의 출력범위는 그림에서 +1 에서 -1볼트 사이이다.
3. 전기적인 아날로그 신호 전압은 ADC(Analog Digital Converter)라 불리는 장치에 의하여 수치값으로 변환된다. 16bit ADC의 경우에는 정수의 출력범위가 +32,767 ~ -32,768의 범위를 가지는데 이는 16bit로 부호를 가진 숫자로 표현 가능한 범위에 해당한다.
4. 연속적인 아날로그 파형을 특징을 만족하도록 무한히 많은 샘플 포인터를 취하여 올 수가 없기 때문에 일정한 간격으로 샘플을 취하여야만 한다. 초당 취해오는 샘플의 수를 샘플링률(Sampling Rate)이라고 부른다.
5. 그 결과 얻을수 있는 각 위치 값은 각 간격에서 위치값으로 나타난다.
6. 이진화 된 값을 전달 하고 받은곳에서는 다시 샘플 데이터를 연결하여 파형을 재구성하게 된다.

원래 파형과 재구성되어 표현된 파형간의 다음과 같은 대략 2가지 문제가 생긴다.
1. ADC가 만들어 내는 값이 정수이므로 소수점 이하는 절삭되던지 반올림 되어진다.
2. 파형 모양의 정확한 재구성은 녹음된 샘플의 수에 의존한다.

일반적으로 디지털로 표현된 어떠한 일련의 유한한 수들은 단지 실세계에 있는 아날로그 파형을 제한된 정확도로 표현하는 것에 불과하다. 그런데 대부분의 오디오 하드웨어 장치는 선형적인 모양으로 데이터 점들을 가로질러 연결함으로써 선형적으로 파형을 재구성하는 것이 아니라 실제로는 하드웨어 장치의 DAC(Digital Analog Converter)의 전기적 특징으로 인하여 완만한 곡선 파형으로 전압 수준에 대응하여 데이터 점들이 변환된다.

스피커는 어떻게 소리가 날까?
스피커 안에는 약간의 틈새를 두고 마주보고 있는 자석이 있다. 이 자석 주위를 감고있는 코일(Coil)에 사운드 파형이 전달되어 전압의 변화에 따라 자석이 진동한다. 이 진동이 스피커를 진동시키고, 스피커의 진동이 공기를 진동시켜 소리로 들리는 것이다.

샘플링과 앨리어싱 현상

오디오 CD는 16비트에 44.1KHz로 샘플링된 소리를 담고 있다고 하는데 여기에서 44.1KHz를 샘플링 주파수 혹은 샘플링률이라고 하고 원래의 아날로그 신호를 초당 44,100번 잘라 디지털 값으로 저장한다는 의미로 소리를 65,536단계로 나눴다는 의미이다.

나이퀴스트(H, Nyquist)와 새논(C.E.Shannon)에 의하면 샘플링률은 신호에 포함되어져 있는 최대 주파수에 따라 결정된다. 만약, 최대 주파수가 fmax인 신호를 샘플링하기 위해서는 초당 2fmax개의 샘플이 필요하다. 아래 식은 샘플링 주파수(fs)와 신호의 최대 주파수(fmax)사이의 관계를 나타내며 이 때 fs를 나이퀴스트 주파수라고도 한다.
fs > 2fmax

일반적으로 샘플링률이 높으면 높을 수록 파형의 저주파 요소가 더 정확하게 재구성 된다.

인간의 가청 주파수는 20~20KHsz이므로 샘플링 정리에 의하여 최대 가청주파수의 2배이상으로 계속 늘려 가기 보다는 오디오 CD의 44.1KHz정도로도 충분한 의미를 가진다.

나이퀴스트 주파수보다 낮은 주파수로 신호를 샘플링하면 앨리어싱이 발생한다.
앨리어싱이 발생되면 신호 안에 실제로 존재하지 않는 파형이 관측된다.
앨리어싱은 샘플링 후에는 제거할 수 없으므로 샘플링 하기전에 신호에서 저역 통과 필터등을 통과시켜 샘플링 주파수를 저역 통과 필터의 차단 주파수의 2배 이상으로 설정하여 불필요한 높은 주파수를 제거하여 샘플링 하는 방법이 취해지기도 한다. 이런 과정을 안티 앨리어싱 필터라고 한다.

Chapter 2. 사운드 소프트웨어와 하드웨어 구조

사운드 응용 소프트웨어의 구조

윈도우 운영영체제의
고수준 인터페이스 : MCI(Media Control Interface)
저수준 인터에피스 : mmio

사운드 변조, 음성 합성 및 인식 프로그램과 같은 응용 프로그래밍은 WAVE 파일 수정, 특정 부분 출력, 녹음 데이터의 변조, 웨이브 파형을 그리는 등 음성 데이터를 직접적으로 세부적으로 다루어야 하므로
저수준 인터페이스를 사용하여야만 한다.

프로젝트 winmm.lib, mmsystem.h 포함
윈도우 운영체제의 구성 요소중의 하나로 멀티미디어에 관련된 모든 역할을 수행한다.

사운드 관련 하드웨어의 구조

사운드카드 동작 원리

사운드 카드에는 여러가지 소리(음원) 데이터가 저장된 음원 롬(ROM)이 있다. 여기에 실제 녹음한 여러가지 악기 소리의 디지털 데이터가 담겨 있어 이 소리들을 섞어 동시에 여러가지 악기 소리는 내는 것이다.
이러한 방식을 PCM(Pulse Code Modulation)이라고 한느데, 실제와 거의 비슷한 소리를 낼 수 있고 주로 게임에서 사람의 말소리나 각종 효과음에 PCM 방식을 사용한다. PCM방식으로 미디 파일을 제대로 연주하기 위해서는 미디 규약에 규정된 악기들의 음원 데이터가 저장되어야 한다.

이를 웨이브 테이블(Wave table)이라고 하는데 웨이브 테이블에 저장된 음원 샘플은 자유롭게 꺼내 사용할 수 있다. 흔히 사운드 폰트라고 하는데 이것이 바로 웨이브 테이블에 담긴 음원 샘플 데이터를 의미한다.


사운드 카드의 구성

ADC(Analog Digital Converter)와 DAC(Digital Analog Converter)로 구성되어 있다.
논리적으로 분리된 구성 요소이지만 보통 CODEC이라 불리는 단일 칩으로 존재한다.

오디오 데이터를 직접 DMA 채널을 이용하여 재생할 경우 RAM으로부터 DAC로 전송하게 되고 녹음시에는 ADC로부터 RAM으로 전송하는 역할을 한다
오디오 컨트롤러는 또한 재생이나 녹음을 하는 동안 샘플의 정밀한 타이밍을 맞추는 역할도 담당하고 있다.

오디오 컨트롤러와 ADC, DAC 변환기의 구성요소는 보통 사운드 카드에 메인보드에 Embeded되 어 있거나 PC의 확장보드(사운드카드)로 존재한다.

대부분의 오디오 하드웨어는 8-bit혹은 16bit해상도를 가지고 샘플링률은 44.100Hz까지 지원한다.


사운드 카드를 통한 사운드 입출력 매커니즘 소프트웨어에서 사운드 카드의 오디오 컨트롤러에 명령을 수행시킨다. 재성, 녹음...

일반적으로 PC에서 오디오 입출력의 연결이 서로간에 충분히 유지되고 있고 인터럽트 없이 녹음과 재생간의 유한한 시간 지연을 허용한다면 실시간 적으로 오디오 신호의 입출력 처리가 충분히 가능하다.

사운드 카드인 SB32, 64,128에서 숫자의 의미
미디(MIDI, Musical Instructment DIgital Interface)라는 것은 전자 악기를 위한 국제 통일 규격이다.
사운드 카드에서 각 숫자는 동시에 낼 수 있는 악기의 개수를 뜻한다. 대부분 디지털 사운드 부분은 16비트로 이어져 있다. 따라서 미디 음악을 주로 감상한다면 미디를 지원하는 PCI방식의 사운드 카드를 선택하면 무난하다-_-뭐야 이건

AC97(Audio Codec '97; 오디오 코덱 '97)
저렴한 각겨으로 컴퓨터에서 오디오를 구혀하기 위한 설계로 인텔이 주축이 되어 재정되었다. AC97하드웨어는 기본적으로 두 개의 칩으로 구성되어 있는데 각각 아날로그와 디지털 출력을 담당한다.
하지만 두 칩을 입출력되는 오디오 데이터를 CPU로 넘겨주는 역할만 하고 실질적인 처리는 CPU가 하기 때문에 매우 간단하다. 게다가 사운드 카드의 역할을 하려면 입출력 부분에 스피커 출력 단자, 마이크 입력 단자등을 붙이면 되고 모뎀의 역할을 하게 하려면 전화선 잭을 붙이면 된다. 그러므로 AC97하드웨어는 매우 저렴한 가격으로 많은 부분에서 응용이 가능하다.
단점은 결국 처리를 카드가 아닌 CPU가 처리하기 때문에 CPU의 부하가 집중되는 점이 있다.

ESS Chip
ESS 테크놀로지에서 만든 사운드 카드 칩이다. 대개 저가형 사운드 카드에서 쓰이는데 ESS칩하나에 사운드 카드의 모든 기능을 내장하고 있어 생산 비용이 저렴하다.


사운드 카드를 통한 3D 입체 음향 효과

3D Sound Positioning(3차운 음향 위치 지정)이라는 기술을 사용한다.

양쪽 스피커에서 내보내는 음향의 크기, 지연 시간등을 적절히 파악해서 내보냄으로써 마치 소리가 스피커에서 나지 않고 다른 곳에서 나는 것 처럼 하는 것으로 보다 현실감 있고 공간감각을 느낄수 있다.

3D 사운드 포지셔닝을 구현하기 위한 API는 DirectX에 포함된 Direct Sound 3D, EAX, A3D등?이 있다.

A3D(Aureal 3D)
오디얼에서 개발한 독자적인 3차원 음향 API혹은 그것을 이용하는 일련의 하드웨어를 뜻한다.
A3D는 다이렉트 사운드 3D를 포함하면서 거기에 다른 음향 효과 관리 기능을 포함시킨 종합적인 음향 관련 API이다. A3D는 오리얼의 보텍스(Vortex)음향 칩셋을 사용하는 사운드 카드에서 작동한다.

EAX(Environmental Audio eXtension : 환경 음향 확장)
환경음향이란 사운드 블라스터의 제작자인 크리이티브가 만들어낸 음향 체계로 입체적인 음향 효과를 구현하는 차원을 넘어 그 음향이 발생하는 주위 환경까지 재현해내어 더 사실적인 분위기는 만들도록 하는 것이다. EAX는 게임에다 적용시킨 것으로 플레이어가 게임중에 있는 위치에 따라 소리의 주위 환경이 적절히 바뀌게 된다.

Chapter3. 고수준 멀티미디어 장치 제어

고수준 멀티미디어 장치 제어의 개념

MCI에 대한 사양(configuration) 정보는 WIN.INI와 SYSTEM.INI 파일에 저장된다.
SYSTEM.INI의 mci 섹션이 이들 장치들을 제어하는 디바이스 드라이브들과 시스템 디바이스 이름들과 매핑되어 있다.
WIN.INI의 mci extension 섹션은 적절한 멀티미디어 장치에 파일 확장과 매핑되어 있다.

이러한 사양 방식은 MCI를 확장 가능하며 적절한 드라이브를 갖는 새로운 멀티미디어 장치들은 MCI가 설계된 초기에 아직 발명되지도 않은 것 조차 MCI시스템으로 통합될 수 있도록 해놓았다.
SYSTEM.INI에서는 이들을 설정함으로 같은 종류의 여러가지 장치들을 또한 사용할 수 있는 것이다.

MCI의 명령을 내리는 방법은 명령 메시지(Command Messages)전달 방식과 명령 문자열(Command Strings) 전달 방식이 있다.
명령 메시지 전달방식은 mciSendCommand
?()함수를 이용하여 메모리 구조체로 작성된 메시지를 MCI시스템에 전달한다.
명령 문자열 전달방식은 mciSendString?()함수를 이용하는데 MCI시스템에 보내어지는 문자열로 구문 분석 처리되어 취할 동작이 결정된다.

이하 고수준 멀티미디어 제어 방식 생략 MCI API임

Chapter4. 오디오 파일의 종류와 형식

오디오 파일의 종류

AU

.au파일 형식은 원래 SUN에서 만든것으로 매우 간단한 오디오 형식이다. 그러나 UNIX가 아닌 다른 환경에서는 사용되지 않고 있다.
파일 형식은 헤드, 정보필드, 데이터 3부분으로 나뉘고 헤드는 채널수, 샘플링 주파수, 데이터 포맷과 같은 기본적인 정보를 가지고 있다. 가변 길이의 정보필드는 저작권 정보, 제작자 이름등과 같은 정보를 가진다.

AIFF(Audio Interface File Format)

헤드,common 청크, data 청크만드로 이루어져 있다.
단일 채널인 경우 AIFF파일 형식을 만드는 예를 통하여 파일 형식을 알아보자

헤드는 간단히 FORM이라는 문자로 이루어져 있고 파일의 나머지 총 바이트 크기 그리고 AIFF라는 문자가 뒤에 붙어 있다.
common청크는 COMM이라는 문자로 시작하고 뒤에 common청크의 나머지 크기인 18이 있ㄷ. common청크의 데이터는 채널의 수, 각 채널당 샘플의 수, 샘플당 비트의 크기, 그리고 샘플링률에 따라 다르다.
data청크는 SSND라는 문자로 시작하는데 이뒤에 데이터 청크의 나머지 크기가 바이트 단위로 기록된다. 사운드 데이터 청크의 처음 두 필드는 오프셋과 항상 0인 블록의 크기이다. 나머지는 실제 사운드 샘플로 이루어져 있다. 다중 채널일 경우에는 샘플들 사이사이에 번갈아 가면서 기록된다.

WAV 마이크로소프트 윈도우에서 기본적으로 사용되는 사운드 파일 형식으로 RIFF파일 형식에 속한다.
PCM방식과 같이 압축하지 않은 사운드나 ADPCM과 같은 압축 방식을 모두 지원하며 압축 방식에 따라 여러가지 포맷이 존재한다.

PCM 확장자가 .pcm인 파일로 헤드가 없이 데이터로만 이루어져 있다. 헤드 부분이 없으므로 미리 샘플링률, 샘플당 비트등을 사전에 알 경우에만 처리 가능하다.

리틀 엔디안 - 인텔의 데이터 자장 방식(Byte order)

조나단 스위프트의 걸리버 여행기(1726)에 처음 나오는 용어라고 함.

리틀 엔디안을 만든 이유는 수의 값을 증가시킬 때 수의 왼편에 자릿수를 추가해야할 필요가 있을지 모른다는 것이다. 지수가 아닌 경우에 더 큰 숫자는 더 많은 자릿수를 갖는다.
빅엔디안의 경우 정렬되어 저장되어 있는 숫자는 두 숫자를 더한 결과를 저장하기 위해 모든 자릿수를 오른쪽으로 옮겨야하는 데 최소 바이트가 원래 있던 자리에 그대로 머물 수 있으며 새로운 자리수는 최대 수가 있는 주소의 오른쪽에 추가될 수 있으므로 좀더 효율적인 방법으로 가능하다.

RIFF(Resource Interchange File Format) 파일 형식

음성이나 영상과 같이 용량이 큰 데이터는 많은 용량을 한꺼번에 저장하게 되면 로드하기 힘들 뿐 아니라 로드하는데 시간이 많이 걸리기 때문에 저장 시에 블록 단위로 저장한다.
즉, 파일의 앞부분에 뒷부분에 따라올 데이터들의 정보를 가지고 있는 헤드라는 것은 붙이게 된다. 이렇게 데이터와 그 정보를 가진 헤드를 묶어서 청크(Chunk)라고 한다.
청크는 상위 청크(Riff Chunk)와 하위 청크(Format Chunk)로 나뉘는 데 상위 청크에는 전체 데이터에 대한 정보만을 가지고 세부적인 블록 단위의 데이터에 대한 정보는 하위 청크에 기록하고 이어서 데이터 청크를 두어 나뉜 데이터를 이곳에 저장하는 방식이다.

결국, 하위 청크와 데이터 청크가 하나의 쌍을 이루게 되는 것이다.

이와 같은 방식으로 데이터를 저장하는 방식을 RIFF방식이라고 하고, 위와 같은 구성으로 저장된 데이터를 RIFF파일이라고 한다. 대표적인 것은 WAVE파일이나 AVI파일이다.

WAVE 파일 구조

Endian File Offset 필드 이름 필드 크기
big 0 ChunKID(RIFF) 4
little 4 ChunkSize? 4
big 8 Format(WAVE) 4
RIFF 청크 식별자
Format이 WAVE이면 두 개의 하위 청크를 가진다.

Endian File Offset 필드 이름 필드 크기
big 12 Subchunk1 ID(fmt) 4
little 16 Subchunk1 Size 4
little 20 Audio Format 2
little 22 Num Channels 2
little 24 SampleRate? 4
little 28 ByteRate? 4
little 32 BlockAlign? 2
little 34 BitPerSample? 2
fmt 하위 청크
date 하위 청크에 있는 데이터 정보의 형식을 서술한다.

Endian File Offset 필드 이름 필드 크기
big 36 Subchunk2 ID(data) 4
little 40 Subchunk2 Size 4
little 44 data Subchunk2 Size
data 하위 청크
사운드 정보의 크기를 알려주고 실제 사운드 데이터를 포함한다.

BlockAlign?(샘플당 할당되는 데이터 바이트 크기) = Num Channels * BitPerSample? / 8
SampleRate?(Sample Per Second)(초당 샘플의 개수) = BitPerSecond? * BlockAlign?

웨이브 파일의 내부 보기

덤프(Dump)란 프로그램이란 파일이나 메모리에 저장되어 있는 내용을 화면에 보여주는 프로그램이다.

간단한 웨이브 파일 분석

52 49 46 46 06 7B 00 00 57 41 56 45 66 6D 74 20
"RIFF" ChunkSize? "WAVE" "fmt&space"
10 00 00 00 01 00 01 00 80 3E 00 00 00 7D 00 00
Subchunk1 Size(16) AudioFormat?(1=PCM) Num Channels (1) SamepleRate?(160000
02 00 10 00 64 61 74 61 E2 7A 00 00 08 00 F4 FF
BitAlign?(2) BitPerSample?(16) "data" Subchunk2 Size(31458) 샘플1 샘플2
EC FF 02 00 ...
샘플3 샘플4 ...

RIFF 이용 함수들

RIFF파일을 이용하기 위한 RIFF파일 입출력 함수는 mmio계열의 함수를 사용한다.
함수 설명
mmioOpen() RIFF파일을 연다.
mmioClose() RIFF파일을 닫는다.
mmioSeek() RIFF파일의 특정위치를 찾는다.
mmioRead() RIFF파일에서 데이터를 읽는다.
mmioWrite() RIFF파일에서 데이터를 쓴다.
mmioDecent() 현재 위치에서 하위 청크로 내려간다.
mmioAscent() 현재 위치에서 상위 청크로 올라간다.
mmioCreateChunk?() 새로운 청크를 만든다.
mmioFOURCC() 청크 이름을 등록한다.
mmioStringTo?FOURCC() 문자열을 청크 이름으로 등록시킨다.

Part 2. 실제편

Chapter 5. 저수준 멀티미디어 API함수의 이해

저수준 오디오 함수들의 이름은 접두사-동사-명사의 형식으로 함수명이 이루어져 있다.
디지털 웨이브 파일 형식의 데이터를 입출력하는 waveaudio장치와 보조 오디오 관련된 함수들을 중심으로 알아본다.
접두사 의미
waveIn- 사운드 녹음
waveOut- 사운드 출력
midiIn- 미디 신호의 입력
midiOut- 미디 신호의 출력
aux- 보조 오디오 장치
mixer- 믹서
AVI- 동영상 입출력
joy- 조이스틱 입력
mmio- 멀티미디어 파일 처리
time- 멀티미디어 타이머 관련

접미사 의미
-GetNumDevs? 장치 개수를 획득
-GetDevCaps? 장치 정보를 획득
-Open 장치를 연다.
-Close 장치를 닫는다.
-PrepareHeader? 입출력용 버퍼 준비
-UnprepareHeader? 입출력용 버퍼 후처리
-AddBuffer? 입력용 버퍼 추가
-GetErrorText? 에러값을 문자열로 변환

728x90
728x90

영상은 현실세계(3차원) 공간상에 발생하는 사건 및 2차평면상에 그려진 이미지 등을
Vision화면(브라운관, CRT, LCD등..)에 Mapping한 것으로 볼 수 있다.

이들은 모두 2차원 평면이고, 이미지나 동영상등은 모두 어떠한 시간에 보여지는 것이므로
2차원 평면상의 특정 시간에 대하여 표현을 할 수가 있게 되며,
우리가 흔히 접하는 신호의 표현은 모두 시간축에 따른 신호의 세기의 2차원 표현 방식이다.
즉, 우리는 시간에 따른 신호의 변화를 직관적으로 알 수 있다.

푸리에 변환(Fourier Transform)  (신호의 표현, 변환)

- 개념

대개 우리는 임의의 Signal Wave(이하 신호)를 표현하고자 할 때 시간의 축에서 표현을 한다고 했다.
허나 시간의 축이 아닌 주파수 축에서 보더라도 Target이 되는 신호는 같은 신호일 것이므로,
주파수 축의 관점에서 재 해석 해보자는 것이 푸리에의 이론이다.

그 중 푸리에의 변환은 시간과 주파수 신호를 서로간의 Domain으로 변환이 가능하도록 해주는
변환이다. 이러한 변환이 가능하도록 해주는 이론은,
하나의 신호는 정현파(Sine Wave)들의 합으로 표현이 가능하다는 푸리에 급수에 기인하고 있으며,
더 나아가 주기를 무한대로 확장하여 Exponential form으로 변환, 주기의 특성을 없애줌으로
비주기적 신호의 함수를 나타낼 수 있게 되며, 모든 함수를 기저 함수의 조합들로 나타낼 수 있다.

우선 연속적인 1차원 신호에 대해서 먼저 살펴보면,

사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지




기저 함수는 sin(t),cos(t)로 주기와 주파수를 연관짓고,
각 항의 계수를 해당 주파수대에서의 신호의 크기와 연관 지을 수 있다.

허나 연속 푸리에 변환은 컴퓨터에서는 사용을 할 수 없다. 컴퓨터는 디지털이므로..
그로 인해 이산(불연속) 푸리에 변환이 나오게 되었고, 이를 사용한다.

따라서 이를 이산적인 신호에 적용하기 위해서는 먼저 연속된 신호를 시간축에 대해
Sampling할 필요가 있으며, 각 시간상에서의 신호의 크기도 컴퓨터 상에서 사용할 수 있게
일정한 값을 가지도록 Quantization되어야 한다.
두 과정을 통해 이산적인 신호로의 변경을 수행 할 수 있다.
여기에 DFT(Discrete Fourier Transform, 이산 푸리에 변환)을 이용, 신호의 주파수 영역에서의
특성을 알아 낼 수 있다.

N개의 시간축 상에서 Sampling한 이산 신호값이 있다 가정할 때 DFT를 적용하면 다음 식과 같다.

사용자 삽입 이미지









이 식의 역을 구하면, 반대로 주파수 영역에서 시간 영역으로의 변환을 할 수 있다.

사용자 삽입 이미지









- Postulation

a. 푸리에 변환은 선형적인 특성을 갖으며, 정역변환이 가능하다.
b. 미분형태의 고유함수가 Exponential Basis Function이다.

- 푸리에 변환(FT)의 사용 이유

a. Signal Wave의 Time-Domain으로 부터 Frequency-Domain으로의 변환 및 역변환
b. Spectral Density(스펙트럼의 밀도)를 구할 수 있다.

푸리에 변환을 사용하면
- 주기함수의 경우, Harmonic의 특성이 나타남으로, Discrete하게 분포되어 있는
  Line의 형태가 나타날 것이다.
- 비주기함수의 경우, 주파수 성분의 크기 분포를 보여주게 될 것이다.
한 예로서 Histogram(히스토그램)과 연관지어 생각해보면 떠오를 듯 싶다.
728x90

728x90

5. 고속 푸리에 변환 (FFT: Fast Fourier Transform)
    1965년 Cooley와 Tuley에 의해 이산 푸리에 변환(DFT)을 효과적으로 계산할 수
    있는 알고리듬이 개발되었으며 DFT 계산시의 반복계산을 제거하여 고속으로
    계산할 수 있다.

    표. 필요한 복소수 연산 회수 비교

 데이터 수

 ()

 DFT

 FFT

 곱셈 ()

 덧셈 ()

 곱셈 ()

 덧셈 ()

    32   (r=5)

     1,024

        992

     80

    160

    64   (6)

     4,096

      4,032

    192

    384

   128   (7)

    16,384

     16,256

    448

    896

   256   (8)

    65,536

     65,280

  1,024

  2,048

   512   (9)

   262,144

    261,632

  2,304

  4,608

 1024  (10)

 1,048,576

 1,047,552

  5,120

 10,240

 2048  (11)

 4,194,304

 4,192,256

 11,264

 22,528

 

5.1 시간 솎음 알고리듬

     - x(n)의 N-pt(point) DFT를 구할 때, x(n)을 n이 홀수일 때와 짝수일 때의
        2개의 부펄스열(subsequence)로 나누고, 각각에 대해 N/2-pt DFT를
        구하는 방법을 decimation-in-time DFT라고 한다.

     - N/2-pt DFT는 또 다시 계속 분해하여 2-pt DFT가 될 때까지 분해한다.
        이 때 2-pt  DFT를 butterfly 연산이라 한다.

    DFT

  FFT (시간 솎음 알고리듬 사용)

 
   
    , N은 2의 배수


           

 


Decimation-in-time FFT algorithm


       
           

           

       
       

       
       

       다시 로 놓으면

       
       
       
       

       
       

예 1: 4-pt decimation-in-time FFT의 계산

Input sequence: x(n)={x(0) x(1) x(2) x(3) }
DFT:




DFT 계산시의 문제점은 많은 양의 twiddle factor를 계산하는 것이다.
twiddle factor는 주기함수 이므로 실제로는 모든 twiddle factor를 다 계산할 필요가 없다.

x(n)에서 짝수시간(n=0,2)과 홀수시간(n=1,3)의 시퀀스를 나누어
시간 솎음 알고리듬을 적용하면,

       
           
       
       

       
     

       
               

       
       
       
       

         
               

       
       
       
       

       
   


 
 
       
       

해석: 4-pt DFT는 2개의 2-pt DFT로 분해 되었으며, twiddle factor는
        1개()만 구하면 된다.
        이것을 신호 흐름 선도로 표시하면 다음 그림과 같다.

예 2: 8-pt decimation-in-time FFT의 계산
DFT:




 
 
 
 

x(n)에서 짝수시간(n=0,2,4,...)과 홀수시간(n=1,3,5...)의 시퀀스를 나누어
시간 솎음 알고리듬을 적용하면,


       
           
       
       

       
     
     
     
       
               

       
       
       
       
       
       
       
       

         
               

       
       
       
       
       
       
       
       

     
       

       다시 로 놓으면
       
       
       
       

       
       

       
       
       

       
       
       

       
       
       
       


5.2 주파수 솎음 알고리듬

     - x(n)의 N-pt(point) DFT를 구할 때, X(k)를 k가 홀수일 때와 짝수일 때의
        2가지 경우로 나누어 결국 N/2-pt DFT로 분할하여 구하는 방법을
        decimation-in-frequency DFT라고 한다.

     - N/2-pt DFT는 또 다시 계속 분해하여 2-pt DFT가 될 때까지 분해한다.
        이 때 2-pt  DFT를 butterfly 연산이라 한다.

    DFT

  FFT (주파수 솎음 알고리듬 사용)

 
   

    , N은 2의 배수


       
           


Decimation-in-frequency FFT algorithm ,  
       
       

 
 
          ,
          ,   로 놓으면
 
  가 되어

각각은 N/2-pt DFT로 간략화 된다. 이를 계속 분해하여 2-pt DFT가 되게 하면
butterfly 연산만으로 DFT를 구할 수 있게 되어 고속 계산이 가능해 진다.
 

728x90

+ Recent posts