안녕하세요? 착한이입니다.
오디오 플레이어에서 mp3 파일 재생 시에, 화려함을 보여주는 것이 Spectrum 입니다.
요즘은 플레이어 뿐만 아니라 클럽이나 공연에서는 노래에 따라서 조명을 제어하는데
사용하기도 합니다.
카페에서도 Spectrum으로 흘러나오는 노래에 따라서 다양한 움직임과 조명으로 분위기를
꾸미곤 합니다.
그럼 Spectrum(스펙트럼)은 어떻게 만들어지는 것일까요?
다소 복잡하고 전문용어가 나올 수 있지만 알아 두시면 도움이 될 것입니다.
우리가 듣는 노래는 PCM이라는 Digital 오디오 신호를 Audio Codec IC를 통해서
Analog 신호로 변환시킨 후 스피커를 통해서 나오는 소리를 듣는 것입니다.
PCM(Pulse Code Modulation) 신호는 압축하지 않은 Digital 신호라고 생각하시면 됩니다.
이 PCM 신호가 Spectrum을 얻기 위한 입력이라고 생각하시면 됩니다.
Audio Codec IC로 입력되는 PCM 신호를 캡쳐해서 FFT(Fast Fourier Transform)을
하게 되면 오디오 신호의 주파수 도메인의 데이터 값을 얻을 수 있습니다.
이 값을 통해 어떤 주파수에서 얼마만큼의 크기(에너지)의 신호가 포함되어 있는지 알 수 있습니다.
여성과 남성의 목소리를 비교해 보면 여성의 경우가 높은 주파수의 에너지가 높다는 것을 알 수 있습니다.
피아노 한 음을 분석해 보면 2개의 주파수에 해당한 신호가 합쳐져 있다는 것을 알 수 있습니다.
이를 반대로 이용하면 피아노 음을 찾아 내는데도 사용할 수 있습니다.
왜 FFT를 해서 주파수 도메인의 신호로 처리하는 것일까요?
그냥 PCM 신호에서 만들어 내면 안되는 것일까요?
PCM 신호로도 화려한 Visualization을 구현할 수 있습니다. 하지만 FFT를 해서 주파수 대역의 신호로
변환하게 되면 고음의 변화나 저음의 변화를 쉽게 판단할 수 있어서 좀더 화려한 Visualization을
구현할 수 있습니다. 소프라노의 고음을 강조할 수 있으며, 드럼의 비트에 따른 변화도 쉽게 표현할 수 있습니다.
본론으로 돌아가서, FFT를 통해서 얻은 주파수 도메인의 신호를 특정 대역별(주파수 범위)로
묶어서 에너지의 합을 구합니다. 보통 특정 대역을 Band 라고 합니다.
우리가 자주 듣는 MP3의 경우 sampling frequency 가 44.1kHz 입니다.
이론상으로 22.1kHz까지의 신호과 포함되어 있습니다.
예를들어 128 Band로 나눴다고 하면 22.1kHz 주파수 범위를 128개의 대역으로 나눴다고 생각하시면 됩니다.
단순히 같은 범위로 나눌 수도 있고 특정 공식에 의해서 비선형으로 나눌 수도 있습니다.
이렇게 나눠진 Band 별로 에너지의 합을 구한 후에 다시 몇 번의 변환을 거치면 Spectrum이 만들어지게 됩니다.
위에서 설명드린 과정을 노래 재생에 싱크 맞추어 수행한 후에
화면에 그려 주면 Real Time Spectrum이 만들어 그려지게 됩니다.
사실 여기까지는 Spectrum을 만드는 것을 설명드린 것입니다.
MP3와 같은 오디오 파일 재생 시, PCM 데이터를 가지고 오는 것을 구현해야 Spectrum을 만들 수 있습니다.
Real Time(실시간) 처리를 위해서는 오디오 파일 재생을 위한 Framework을 알아야 합니다.
Framework은 플랫폼마다 다릅니다. 그만큼 공부해야 할 것이 많다는 뜻일 것입니다.
Windows 운영체제는 Directshow, Media Foundaiton 와 같이 Microsoft 사에서 만든 것이
있고 VLC와 같이 다른 업체나 단체에서 만든 것이 있습니다.
Linux 운영체제는 GStreamer, Android 운영체제는 Mediacodec 라는 것이 있습니다.
Windows CE 계열인 Windows Embedded Compact 2013과 Windows Embedded Compact 7은 Directshow 를 이용합니다.
Directshow 기반으로 오디오 파일을 재생하는 경우에는 PCM 신호를 캡쳐하기 위해서 Filter를 만들어서 추가 해 주시면 됩니다.
Filter를 개발하는 것은 차후에 다시 강좌로 올려 드리겠습니다.
이렇게 캡쳐된 PCM 데이터를 받아서 일정 길이 만큼 자르게 됩니다. 이를 Window 처리한다고 합니다.
대부분 512개의 PCM 데이터로 잘라서 FFT를 수행하게 됩니다.
위 과정을 반복하게 되면 MP3 재생에 맞게 Spectrum이 얻어 지게 됩니다.
Real Time Spectrum을 구현 하는 것은 쉬운 일은 아닙니다.
하지만 하드웨어 성능이 개선되고 DSP 부분도 발전하고 있어서 더 쉽게 구현할 수 있게 된 것은 사실입니다.
특히나 Spectrum을 화면에 출력하기 위해서는 빠른 Draw 속도가 필요한데
Directdraw 와 같은 기술을 이용할 수 있고 하드웨어 발전으로 GDI로도 충분히 출력할 수 있게 되었습니다.
게다가 OpenGL ES 를 임베디드 환경에서도 사용할 수 있어 좀 더 화려한 Visualization 도 구현이 가능하게 되었습니다.
여기까지 간단히 Spectrum을 만드는 방법에 대해서 설명 드렸습니다.
구현하는 것이 쉽지는 않지만 FFT 관련 Open Source도 많이 있으니 한번 도전해 보시는 것도 좋을 듯합니다.
Real Time Spectrum 하면 생각나는 프로그램은 WinAmp 입니다.
Visualization 플러그인이 화려하고 다양해서 많은 사용자들이 이용했었습니다.
저도 개인적으로 WinAmp 플러그인을 사용하면서 Spectrum을 만들어 보게 되었습니다.
Windows CE 5.0부터 Spectrum을 만들어 Directdraw로 화면에 출력시켜 보았습니다.
Windows CE 6.0 기반의 다양한 ARM CPU에서 구현해서 사용해 보았는데 만족스러웠습니다.
하지만 하드웨어 성능 상, 1920x1080(Full HD) 해상도에서는 실시간으로 출력하는 것이 어려웠었는데
i.MX6 CPU에서는 실제 사용할 수 있을 정도로 가볍게 실행되는 것을 확인 하였습니다.
오디오 플레이어에 추가해 보고 OpenGL ES 2.0으로 좀 더 화려한 Visualization 도 만들어 봐야 겠습니다.
여러분들도 Spectrum 을 이용한 Visualization을 한번 만들어 보시길 바랍니다.
다음은 WAD-MX6 보드에서 128 Band Spectrum을 1920x1080 해상도에 출력하는 영상입니다.
GDI만을 이용하여 Draw 하고 있는데도 깔끔하게 그려지는 듯 합니다.
만들고 나서 보니 GDI (Bitblt) Draw 속도 테스트용으로 사용해도 괜찮을 듯 합니다.
Spectrum 이나 Directshow 코덱 관련 문의 사항이 있으시면
http://www.wearedev.net/?mod=contactus 또는 help@wearedev.net 으로
연락 주시면 답변 드리겠습니다.
즐거운 개발 하시길 바랍니다.