posted by bluelimn 2008.07.11 18:39

멀티미디어 사운드 프로그래밍(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? 에러값을 문자열로 변환

posted by bluelimn 2008.05.03 12:01

영상은 현실세계(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(히스토그램)과 연관지어 생각해보면 떠오를 듯 싶다.
2008.05.02 16:26

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

posted by bluelimn 2008.05.02 16:16

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를 구할 수 있게 되어 고속 계산이 가능해 진다.
 

posted by bluelimn 2008.05.02 16:13
푸리에 변환의 종류는 여러가지가 있으나 대충 크게 나누어 보면 2가지를 들 수 있다.

1. DFT(Discrete Fourier Transform, 이산(불연속) 푸리에 변환)
: 연속적인 신호를 시간에 따라 Sampling을 한 형태의 신호로 생각하여 푸리에 변환식을 그대로 계산

2. FFT(Fast Fourier Transform)
: DFT는 연산시 시간이 너무 오래 걸리기 때문에 실제 계산에서 나타나는 항의 주기성과 대칭성을
  이용하여, 신호의 전부의 변환이 아닌, 필요한 신호만을 골라내어 최소화하며 고속으로 푸리에 변
  환을 연산한다.
  예를 들어 총 8개의 DFT 신호가 있다 가정하면, 4개를 먼저 골라낸 후, 다시 4개의 신호를 단순히
  연결함으로서 제외된 신호들의 예상치를 적용하게 되는 방법.
  실제로 변환 시간의 분제로 인해, 실제적으로 거의 대부분 FFT를 사용하고 있으며, 빠르기는
  DFT에 비해 최고 약 1000배의 시간차이를 보여준다고 한다.

푸리에 변환은 보통 아날로그 신호를 받아서 처리하는 기술의 하나로 사용 되기 때문에 항상
"실시간"으로 진행되어야 한다. 따라서, 속도가 느리면 안되므로, 속도를 보다 빠르게 개선하기 위해
보통 고속 푸리에 변환(FFT)을 사용한다.

사용자 삽입 이미지
주어진 신호의 개수 N이 이를 따른다고 가정 할 때,
N의 갯수는 짝수이며, 반으로 나눌 수 있고, 이는 N=2C로 표현할 수 있다.

이산 푸리에 변환(DFT)에 이를 대입하면
사용자 삽입 이미지


와 같다. 여기서 보면 N개의 점에 대해서, 각각 짝수 번째와 홀수 번째의 그룹으로 나누어
계산 할 수 있다는 걸 알 수 있다. 또한, 각 항에 대해 정리를 하면,

사용자 삽입 이미지

처럼 되며, 이를 다시 원래의 식에 대입하여 나온 식을 구성하고 있는 두 항목 각각은
짝수와 홀수그룹으로 정의 할 수 있다.

사용자 삽입 이미지


     -->  짝수 그룹


     -->  홀수 그룹


각 항은 주어진 N개의 점들 중 각각 짝수 번째, 홀수 번째에 해당하는 점들 N/2개를 이용하여
계산한 값이다. 이를 다시 위의 식에 대입하면

사용자 삽입 이미지
와 같은 식을 얻을 수 있다. 이를 이용하여 N개의 점이 주어진 경우 각각 짝수, 홀수 번째 점들의
두 그룹으로 나누어 계산을 한 후 S(0),...,S(C-1)=(N/2-1)까지의 값을 구할 수 있다.

그리고 나머지 S(C)=S(N/2), S(L+1),...,S(N-1)의 값은

사용자 삽입 이미지


로 구할 수 있다. 나머지 절반에 대한 점들의 계산에 기존의 계산결과를 그대로 이용할 수 있음을
알 수 있으며, 이를 통해 고속 연산이 가능하게 된다.
현재 경우에는 N개의 신호점들을 N/2개의 그룹으로 나눈 것이지만, 동일하게 N/2의 각 그룹을
다시 N/4의 짝수 그룹과 홀수 그룹으로 나눌 수 있으며, 이것을 최종적으로 2개의 신호점으로
이루어진 그룹까지 들어간 후에, 위의 식들을 이용하여 계산을 수행하게 된다.

위에서 말한 8개의 점을 예를 들면

S(0)   S(1)   S(2)   S(3)   S(4)   S(5)   S(6)   S(7)

이 점들은 S(0) S(2) S(4) S(6)의 홀수번째 그룹과
              S(1) S(3) S(5) S(7)의 짝수번째 그룹으로 나뉘며,

이는 각각의 그룹에 대해 다시

 S(0) S(4)   S(2) S(6)       S(1) S(5)   S(3) S(7)
짝수의홀수 짝수의짝수     홀수의홀수 홀수의짝수

각각의 번째 그룹으로 다시 나뉘며, 이산 푸리에 변환의 연산時
각 점에 대해 단순한 계산을 하면 8 by 8 = 64 이지만,
각 점에 대해 고속 푸리에 계산은 8 by 3 = 24 로서 40회의 계산을 줄일 수 있다.

이러한 푸리에 변환을 영상에 적용하고자 하면, 정지영상 자체를 놓고 볼 때는 행과 열을 갖는
2차원 데이터이므로, 2차원 함수에 대한 이산 푸리에 변환 S(x,y) 을 이용해야 한다.

푸리에 변환은 잡음제거, 엠프기술, 음성 및 그림 압축 등등 수많은 곳에서 사용되는 기술이다.
이것이 가능한 이유는 각 주파수 별로 신호를 쪼개서 나누는 것이 가능하기 때문이다.
푸리에 변환 기술을 이용해서 각 주파수 별로 신호를 나누면 필요한 데이터와
쓸모없는 데이터(Garbage)를 구분해 내기 쉬워지겠다.
가령 잡음의 경우는 일정한 Pattern으로 나타나는 경우가 많으므로, 해당하는 Pattern의
주파수만 0으로 Clipping 시켜버리면 잡음은 제거된다.
또한 각 주파수중 특정 일부 주파수만 키우면 특정 악기의 소리를 키울 수 있거나, 특정 Pattern을
강조 할 수 있겠다.
또한 각 주파수중 잡음과 같이 특정 일부 주파수를 아예 지워버리고 저장하면 데이터의 양이
줄어들게 되므로 압축에도 사용 할 수 있겠다. (Ex : JPG, MP3, MPEG)
posted by bluelimn 2008.05.02 16:12

4.2 이산 시간 신호의 푸리에 변환 (DTFT: Discrete-Time Fourier Transform)

     - 연속시간 신호 x(t)를 표본화하여 이산시간 신호 x(nT)로 변환하여
        주파수 분포(스펙트럼)을 구한다.

     - 시간 영역에서는 discrete하나, 주파수 영역에서는 continuous 하다.
     - 일 때 의 푸리에 변환 이 존재하며,
        다음과 같이 정의 된다.

       

       

     

     

     

  이산 시간 신호의 푸리에 변환 쌍 (Discrete Time Fourier Transform Pair)


      -  의 푸리에 변환 은 복소수이며 다음과 같이 표시되고,

                

         이 때   를  의 진폭 스펙트럼(amplitude spectrum)이라 하며,

                   를 위상 스펙트럼(phase spectrum)이라 한다.


         예: 단위 임펄스 파형의 이산시간 푸리에 변환(DTFT)를 구하라

             
             

         예: 지연된 단위 임펄스 파형의 이산시간 푸리에 변환(DTFT)를 구하라

             
               

         예: 단위 계단 파형의 이산시간 푸리에 변환(DTFT)를 구하라

               
             

           예: 다음과 같은 비주기 펄스열의 DTFT를 구하고 진폭/위상 스펙트럼을 구하라

               

               

               

               

               

 4.3 이산 푸리에 변환 (DFT : Discrete Fourier Transform)

     - 완전한 디지털 신호처리를 위해서는 이산 주파수에 대한 값을 얻을 수
        있는 Fourier 변환이 필요하다.

     - 시간 영역에서도 discrete하고, 주파수 영역에서도 discrete 하다.
     - 일 때 의 푸리에 변환 이 존재하며,
        다음과 같이 정의 된다.

       

       

     

     

     

       회전인자(twiddlw factor):  

       

       

   이산 푸리에 변환 쌍 (Discrete Fourier Transform Pair)

         - N=8 인 경우의 회전 인자의 값 :  

             

       -  의 푸리에 변환 은 복소수이며 다음과 같이 표시되고,

                

         이 때   를  의 진폭 스펙트럼(amplitude spectrum)이라 하며,
                   를 위상 스펙트럼(phase spectrum)이라 한다.

      예:  다음과 같은 비주기 펄스열 x(n)의 DFT를 구하라

             

           

           

           

           
           
           
             

4.4 이산 푸리에 변환 (DFT)의 성질

 properties

 

 

선형성
(Linearity)

 

 

 주기성
(Periodicity)

 

 

 추이정리
(Shift Theorem)

  

 

 시간영역
 컨볼루션

   

 

 주파수영역
 컨볼루션

   

 

 대칭성
(Symmetry)

  

 

posted by bluelimn 2008.05.02 16:10

FFT는 이산 데이터 값들의 푸리에 변환 계산을 위한 알고리즘이다. FFT는 주어진 유한 데이터 점들의 세트, 즉 예를 들어 실세계 신호로부터 주기적으로 얻어지는 견본들을, 그 요소 주파수들의 형태로 표현한다. 이것은 또한 정확하게 반대인 주파수 데이터로부터 신호를 재구성하는 문제도 해결한다.

FFT는 수치해석의 가장 중요한 알고리즘이다. Gilbert Strang은 FFT를 가리켜, "우리 세대의 가장 중요한 알고리즘"이라고 말했다. FFT는 또한 두 개의 다항식을 곱하는데 있어 점근적으로 가장 빠르다고 알려진 알고리즘을 제공한다. C포트란으로 작성된 알고리즘 버전들을 온라인상에서 찾아볼 수 있다.

여기까지 출처 : 텀즈



  DFT는 시간 영역과 주파수 영역에서 모두 이산적 성질을 갖는 유일한 변환이고, 유한구간 신호에 대해서 정의된다. 비록 그것이 계산 가능한 변환이기는 하지만 식 (5.24)의 직접적인 계산은 매우 비효율적이고, 특히 신호의 길이 N이 클 때는 더욱 비효율적이다. 1965년에 Cooley와 Tukey [4] 는 DFT 연산 중에 수행할 계산의 양을 실질적으로 줄이는 과정을 보여주었다. 이로 인하여 디지털 신호 처리 분야를 포함한 여러 분야에서 DFT를 많이 사용하게 되었다. 게다가 다른 효율적인 알고리즘이 개발되는 계기가 되었다. 이러한 모든 효율적인 알고리즘들은 총체적으로 고속 푸리에 변환(fast Fourier transformation, FFT) 알고리즘으로 알려지게 되었다.
N=6-점 신호 x(n)을 생각해 보자. 식 (5.24)에 따르면 이 신호의 DFT는 다음과 같다.
 


여기서 이다. X(k)중에서 하나의 샘플을 얻으려면, N=6번의 복소수 곱셈과 (N=6-1)번의 복소수 덧셈이 필요하다. 그러므로 모든 DFT 계수의 집합을 얻으려면, N²번의 복소수 곱셈과 의 복소수 덧셈이 필요한 것이다. 또한 N²개의 복소수 계수들 를 저장해야만 한다. 즉, 내부적으로 추가적인 비용이 발생한다. 명백히 N=6-점 신호에 필요한 DFT 계산의 수는 N의 제곱에 비례하고, 다음과 같이 표시된다.
  


N이 큰 경우에 o(N²)은 실제적으로 사용할 수 없다. 일반적으로 덧셈의 처리 시간은 곱셈의 처리시간보다 훨씬 적다. 그러므로 지금부터는 그것 자체만으로 4번의 실수 곱셈과 2번의 실수 덧셈이 필요한 복소수 곱셈의 수에 초점을 맞출 것이다.
 

효율적 계산의 목표

효율적으로 설계된 알고리즘은 자료 샘플마다 계산의 수가 일정해야 하고, 총 계산의 수는 N에 대해 선형적으로 증가해야 한다.
N²에 비례하는 계산은, 계속해서 수행되는 대부분의 계산을 의 주기성
  


과 대칭성
 
  
을 이용하여 줄일 수 있다.
먼저 계산의 수를 줄이는데 있어서 대칭성과 주기성의 이점을 보여주는 예제로 시작해 보자. 그리고 나서의 계산을 필요로 하는 두 개의 특정한 FFT 알고리즘(시간 데시메이션 FFT 알고리즘과 주파수 데시메이션 FFT 알고리즘)을 분석해 보자.
예제 5.19 4점 DFT의 계산 방법에 대해 알아보고, 이 계산을 위한 효율적인 알고리즘을 만들어 보아라.
  


   
위 식은 행렬 형태로 계산할 수 있다.
  


이것은 16번의 복소수 곱셈이 필요하다.
효율적 방법 : 주기성을 사용하면,
  


위의 행렬 형태를 바꾸면 다음과 같다.
  


대칭성을 이용하면 다음의 식을 얻을 수 있다.
  


   
따라서 효율적인 알고리즘은 다음과 같아진다.
 
  


이것은 단지 2번의 복소수 곱셈만이 필요하다. 이렇게 간단한 예제에서도 계산의 수가 상당히 줄어든 것이다. 이 알고리즘의 신호 흐름도 구조는 그림 5.18과 같다.
그림 5.18 예제 5.20의 신호 흐름도
 
해석 : 식 (5.57)의 효율적인 알고리즘은 다르게 해석될 수 있다. 첫째로, 4점 신호 x(n)은 2개의 2점 신호로 나누어지고, 아래와 같이 열 벡터로 정리가 된다.
  


둘째로, 각 열에 대해 더 작은 2점 DFT가 행해진다.
  


그리고 나서, 결과 행렬의 각 성분에 
를 곱한다. 여기서 p는 행의 인덱스이고, q는 열의 인덱스이다. 즉 다음과 같은 점곱셈(성분끼리의 곱셈)이 수행된다.
  


마지막으로 행벡터에 대해 두 개의 더 작은 2점 DFT 연산이 수행된다.
  


비록 이 해석이 효율적인 알고리즘보다 더 많은 곱셈을 하는 것처럼 보이기는 하지만, 큰 DFT 연산을 더 작은 DFT 연산들로 계산하는 체계적인 접근 방법을 제시해 준다.                       ■
 

분할-조합 방법(divide-and-combine approach)

N²에 비례하는 DFT 계산을 줄이기 위해서 합성수인 을 선택해야 하는데, 그 이유는 다음과 같다.
  


이제 그 신호를 길이가 L인 M개의 작은 신호로 분할하고, M번의 작은 L점 DFT 연산을 수행한다. 그리고 나서 L번의 작은 M점 DFT 연산을 통해 더 큰 DFT로 조합한다. 이것이 분할-조합 방법의 핵심이다. N=LM이라 하면 식 (5.46)의 인덱스 n과 k는 다음과 같이 쓸 수 있다.
  


그리고 신호 x(n)과 X(k)를 각각 배열 x(l,m)과 X(p,q)로 나타낸다. 그러면 식 (5.46)을 다음과 같이 쓸 수 있다.


각각의 열 m=0,...M-1에 대해 L점 DFT 배열
  


를 계산한다.
2. 다른 배열을 얻기 F(p,m)위하여 을 바꾼다.
  


인수 은 회전 인수(twiddle factor)라고 불린다.
3. 각각의 행 p=0,...L-1에 대해 M점 DFT를 계산한다.
  


이러한 방법에 대한 복소수 곱셈의 총 수는 다음과 같이 주어진다.
  


만약 M 또는 L이 합성수라면 이 과정이 반복될 것이다. 명백히, N이 고차의 합성수, 즉 일 때 가장 효율적인 알고리즘이 얻어진다. 그러한 알고리즘은 R 진수 알고리즘이라 불린다. 만약 라면, 그러한 분해는 혼합 진수(mixed radix) FFT 알고리즘이라 불린다. 가장 인기있고 쉽게 사용할 수 있는 알고리즘은 2진 FFT 알고리즘이다.
 

2진 FFT 알고리즘(radix-2 FFT algorithm)

라고 하자. 그리고 나서 , M=2, L=n/2라하고, 식 (5.48)에 따라 x(n)을 두 개의 N/2점 신호로 분할하면

  


이 된다. 신호 은 x(n)의 짝수번 샘플을 가지고 있고, 신호 
은 x(n)의 홀수번 샘플을 가지고 있다. 와 를 각각 
과 의 N/2점 DFT라고 하자. 그러면 식 (5.59)는 다음과 같이 줄어든다.
  


이것을 병합 공식(merging formula)이라 하는데, 두 개의 N/2점 DFT를 하나의 N점 DFT로 조합하는 것이다. 복소수 곱셈의 총 수는 다음과 같이 줄어든다.
  


이 과정은 계속해서 반복될 수 있다. 각 단계에서 신호들은 데시메이션(decimation)되고, 더 작은 DFT들이 결합한다. 이 데시메이션(decimation)은 N개의 1-점 신호, 즉 1-점 DFT를 갖게되는 v단계 후에 끝난다. 이러한 과정을 시간 데시메이션 FFT(decimation-in-time FFT, DIT-FFT)라 한다. 복소수 곱셈의 총 수는 다음과 같다.
  


N이 클 경우 은 근사적으로 N에 선형이 된다. 이것이 효율적 알고리즘의 목적인 것이다. 추가적으로 대칭성을 사용하면 을 으로 줄일 수 있다. N=8인 경우의 이 알고리즘에 대한 신호 흐름도를 그림 5.19에 나타내었다.
그림 5.19 인 경우의 시간 데시메이션 FFT 구조
다른 방법으로 L=2, M=N/2이라 하고, 식 (5.59)에 있는 단계들을 따라가 보자. 초기의 DFT는 복소수 곱셈을 포함하지 않은 2점 DFT임을 명심하자. 식 (5.60)으로부터
  


그리고, 식 (5.61)로부터
  


0≤n≤N/2-1에 대해 , 
이라 하자(왜냐하면 그것들은 시간 영역에서의 신호로 생각할 수 있기 때문이다). 그러면 식 (5.62)로부터 다음 식을 얻게 된다.

이것은 DFT 값 X(k)를 데시메이션 방식으로 계산함을 의미한다. 그러므로 이러한 방법을 주파수 데시메이션 FFT(decimation-in-frequency FFT, DIF-FFT) 알고리즘이라 한다. 이것의 신호 흐름도는 DIT-FFT 구조를 전치시킨 형태이고, 계산의 복잡도는 과 같다.

 

고속 콘벌루션(fast convolution)

큰 값의 (>50)에 대해서는 FFT 알고리즘을 사용하여 콘벌루션을 빠르게 하는 것이 가능하다. 이러한 방법은 선형 콘벌루션을 구현하기 위해 순환 콘벌루션을 사용하고, 순환 콘벌루션을 구현하기 위해 FFT를 사용하는 것이다. 최종적인 알고리즘을 고속 콘벌루션 알고리즘(fast convolution algorithm)이라 한다. 만약  이어서 2진 FFT를 사용한다면, 그 알고리즘은 급속 콘벌루션(high-speed convolution)이라 한다. 을  N₁점 신호, 을  N₂점 신호라 하자. 그러면 급속 콘벌루션의 N은 다음과 같이 선택할 수 있다.
 


여기서 [x]은 x보다 큰 가장 작은 정수이다(또한 상한(ceiling) 함수라고도 불린다). 이제 선형 콘벌루션 *은 2개의 N점 FFT, 하나의 N점 IFFT, 그리고 하나의 N점 점곱셈을 통해 구현한다.

 

급속 블록 콘벌루션(block convolution)

앞에서 매우 큰 신호를 비교적 작은 신호로 나누어 콘벌루션을 수행하는 중첩-보류법(overlap and save method)과 중첩-가산법(overlap and add method)이라는 블록 콘벌루션에 대해서 논의했었다. 그 부분에서는 선형 콘벌루션을 구현하기 위해 DFT를 사용한다. 이제는 급속(high-speed) 중첩-보류법을 얻기 위하여 DFT를 2진 FFT 알고리즘으로 대체할 것이다. 한층 더 계산을 줄이기 위하여 더 짧은(고정된) 신호의 FFT는 단지 한번의 계산만으로 할 수 있다.


posted by bluelimn 2008.05.01 23:04
posted by bluelimn 2008.04.27 01:08
[함수]waveInOpen

more..


[구조체] WAVEHDR

more..


[함수] waveInPrepareHeader

more..


[함수] waveInAddBuffer

more..


[함수] waveInStart

more..


[함수] waveInStop

more..


[함수] waveInReset

more..


[함수] waveInReset

more..


[함수] waveInClose

more..


[MESSAGE] MM_WOM_DONE

more..


[MESSAGE] MM_WIM_DATA

more..


[함수] waveOutOpen

more..


[함수] waveOutPrepareHeader

more..


[함수] waveOutWrite

more..


[함수] waveOutPause

more..


[함수] waveOutRestart

more..


[함수] waveOutReset

more..


[함수] waveOutUnprepareHeader

more..



[함수] waveOutClose

more..



출처 : http://www.tipssoft.com
posted by bluelimn 2008.04.06 17:46
한창 작업하다가 다 날려버린 바람에 새로 오피스를 깔았다.
그동안 수집한 자료들 다 날리고 새로 시작해야 하는데
하루종일 걸려서 헤더부분 복구하는 것만 겨우 마쳤다. 아직 남아있는 문제는..
dataChunk에 있는 자료들이 끝나고 추가정보를 나중에 붙이는 경우가 있는데 그것은 포함시킬 것인지 아니면 잘라낼 것인지 결정해야 한다.
일단 내가 만들 시스템은 원본 파일을 복사할 필요가 없고 새로 악보로 편집해야 하므로 그냥 없에기로 했다.
도중에 알 수 없는 chunk가 있을 경우도 함께 포함 시키기로 했는데 역시 괜한 짓인가 싶다가도 혹시나 모르니 대비하는 자세가 좋겠다 싶어서 일단 byte list로 넣어버렸다.
이제 음원을 분석하는 것을 본격적으로 들어가야 하는데..
생각해보니 한국어 처리에 관한 프로젝트 소스도 다 날려버렸다. 순수 ruby로 다시 만들었는데..역시 철저한 백업의 필요성을 느끼게 되는 순간이다.
posted by bluelimn 2008.02.27 10:12
아직 프로젝트는 시작하지 않았고 사전 자료 수집과 준비작업 중이다.
아래는 보컬로이드라는 소프트웨어인데 설명에 나오는 것처럼 일본 애니애니메이션 음악 생성기란다.
오타구들을 15750엔이라는 부담스런 가격에도 일본아마존에서 판매 1위였다는 내용이 언뜻 보인다.

이 SW는 기본적으로 발음을 하나씩 입력해두는 방식을 채택하여 음성합성을 하고 있다.
이러한 방식은 우리나라에서도 음성안내 시스템에서 적용하고 있는 것으로 알고있다.
각 발음들을 독립적으로 녹음하여 그러한 발음들을 이어붙여서 말을 만들어내는 것이다.

거기에 음의 높낮이를 선택하여 노래를 만든다...
이러한 기술도 연재 대량생산용 가수들에게 많이 사용되고 있는 것으로 알고 있다. 불안정한 음을 기계적으로 맞추어 주는 기술이다.

결국 SW는 음이 변하지 않으면서 발음도 변하지 않는 것을 기준으로 나누어야 하고 발음이나 음의 높이중 하나라도 바뀌면 그곳을 기준으로 다시 나누어줘야 한다. 각 객체는 발음, 음의 높이, 길이를 속성으로 가지고 있으며 대부분은 그것을 사실감있게 재생하는 코드로 예상된다.

노래를 부르는 소프트웨어라... 꽤 효율적인걸..

=================================================================================================================

VOCALOID 2: The Japanese Anime Song Generator

otakusong.jpg

ThinkGarageband for otakus. This Japanese software suite lets you plug inlyrics and melody and generates an "authentic-sounding" song via itsmusic and vocal synthesizers. As you can see above, the softwarefeatures a 16-year- old "Virtual Singer," which croons out whateverdisgustingly sweet (or just disgusting) lyrics you enter in (Japaneseonly, we're assuming). It's so popular in Nippon that it's actually the#1 selling software on their Amazon. And for good reason—the songs theygenerate actually sound like it could have come from a generic teenagedanime. Hit the jump for two videos.

TAG
posted by bluelimn 2008.02.27 10:12

플렉스 센서와 3축 가속도 센서를 이용한 cyberglove를 만들고 그것을 demo할 software를 만들고자 했었다.
SW는 간단한 이미지 편집기..
하지만 무산됐다. 시작도 못했다.
두명의 팀원..
혼자서 시작은 했다. 간단히 메뉴를 나누고 UI를 디자인했다.
어설프지만 form을 만들어놓고 바쁘다는 팀원을 위해 기다렸다.
지난 주 월요일부터 박차를 가하려고 했으나 오늘까지 연락이 없어서 관두고 나중에 술이나 하자고 문자를 보냈다.
어차피 전화를 해도 잘 안받으니까..
답장도 없다.
정말 그럴듯한 아이디어도 아니고 다 해봐야 그냥 프로젝트 하나 해놔서 한학기 좀 편하게 지낼 정도의 수준밖에 되지 않는 프로젝트였다. 그런 프로젝트를 진행하면서 제발 좀 하자고 매달려서 애걸복걸하기 싫다. 지금 상태로는 끝날 때까지도 혼자서만 안달날것 같아서 일찍 포기했다.
어차피 이 프로젝트에 큰 애정이 없었다. 다만 사람에게 실망한 마음이 크다.
한사람 두사람.. 나에게 실망을 안겨주는 사람들.. 이젠 사람들 믿기가 어렵다.

이렇게 해서 첫번째 시스템개발 프로젝트는 무산되었다.
이제는 개별적으로 시스템개발 프로젝트를 진행하려고 한다. 1인 프로젝트..

TAG