블로그
openFrameworks 에서 소리신호를 받는 방법 본문
openframeworks에서 FFT를 통해 소리신호를 받을 수 있다.
FFT는 간단하게 말하자면 주파수 스팩트럼을 받는데, 다른 방식에 비해 매우 빠르다.
FFT는 주파수를 받을 때 301, 302, 303 이런 식의 세세한 주파수 범위를 받는 것이 아닌,
band를 정해놓고 그 밴드를 중심으로 특정 주파수를 받아내기 때문에 다른 방식보다 빠르다고 말할 수 있다.
예를 들어 301~325 사이가 밴드 범위라면, 310, 312 등의 진폭을 추정할 수 있다.
이제 openframeworks 에서 소리를 받는 예제를 살펴보면
우선 ofSoundPlayer 에서 사운드를 재생할 객체를 생성한다.
float *fft 는 소리가 나는 곳을 퓨리에 변환해주는 포인터 변수이다.
float *soundSpectrum 은 실질적으로 소리의 스펙트럼 데이터를 받는 변수인데, 함수 포인터로 받기 때문에 포인터 변수로 지정해준다.
마지막으로 int bands 는 앞서 말한 밴드를 지정해준다.
우선 setup을 살펴보면, 소리를 로딩하고 재생하는 함수를 실행시키며, fft에 44100의 크기의 배열을 할당시킨다.
44100은 샘플레이트를 의미하는데, 샘플 레이트는 밴드에서 받은 주파수를 더욱 세밀하게 표현하는 개념이다.
사실 44100이란 숫자는 의미가 없다. 오히려 메모리를 낭비하는 수치이지만, 오디오 스탠다드를 나타내 주었다.
(밴드 값 만큼만 지정해줘도 무관)
for 루프를 사용해 fft 배열의 값을 초기화시키고, band를 지정해준다.
update에서는 우선 ofSoundUpdate() 함수를 통해 소리를 실시간으로 받아준다.
그리고 soundSpectrum 에 ofSoundSpectrum(bands)를 해주는데, soundSpectrum은 ofSoundGetSpectrum 배열의
첫 주소값을 받아서 배열을 사용할 수 있게 해 준다.
다시 말해 매개변수로 지정한 밴드를 중심으로 각 주파수별 진폭 값을 배열에 저장한다.
for 루프를 통해 soundSpectrum에서 받은 소리를 fft에 저장한다.
bands 하나당 음악의 진폭량이 들어온다. 따라서 i<bands 로 나타내며, 높은 진폭이 들어오면 fft에 그 값을 저장하고 다시 높은 진폭이 들어오기 전까지 0.9를 곱하여 값을 상쇄시켜준다.
그로 인해 각 주파수별 진폭을 표현할 수 있다.
우선 j는 폴리 라인의 x축을 담당하며, 밴드의 수만큼 나열되어 일직선으로 표현된다.
i는 y축을 나타내며, 첫번째 for 루프에서 보다시피 +=16을 해주어 간격이 16픽셀인 폴리 라인을 생성해준다.
16/band(256)를 통해 총 16개의 폴리 라인이 만들어진다.
이렇게 생성된 폴리라인의 y축에 음악의 진폭 값을 - 해주는데, openframeworks에서의 좌표는 우리가 생각하는 좌표의 반대라서, 위로 올라가는 표현을 해주려면 -를 통해 표현할 수 있다.
따라서 y축에 fft[j]를 빼줘서 주파수 스펙트럼을 나타낼 수 있다.
'openFrameworks' 카테고리의 다른 글
of asciiVideoExample 분석 (0) | 2021.10.28 |
---|---|
"ofImage"에 대하여 (0) | 2021.10.20 |
OF MeshFromCamera 예제 분석 (update) (0) | 2021.10.04 |
OF MeshFromCamera 예제 분석 (setup) (0) | 2021.10.03 |
OF MeshFromCamera 예제 분석 (선언부) (0) | 2021.10.02 |