마이크 모듈로 주파수 측정하기
앞서 소리 감지 센서(마이크 모듈)에 대해 다룬적이 있습니다. 그런데 소리 감지 센서나 마이크 모듈은 주변에서 발생하는 음파에 반응하는 매우 단순한 구조와 해상도를 가지는 모듈이었습니다. 따라서 음성을 처리하거나 소리에서 주파수, 화음을 분리해내는 작업을 하기에는 무리였습니다.
이런 좀 더 고차원적인 작업을 원하시는 분을 위해 나온 고급진 모듈이 있어 소개합니다. 사실 생긴건 기존에 다뤘던 단순한 모듈들과 별 다를바가 없습니다.
Electret Microphone Amplifier – MAX4466 with Adjustable Gain
출처 : https://www.adafruit.com/products/1063
Maxim MAX4466 증폭 회로를 사용한 모듈로 전원에 의한 노이즈를 제거하는데 탁월해서 보다 선명한 소리를 만들어줍니다. 따라서 음성 변환, 오디오 녹음/샘플링, 소리 감응 프로젝트에 적합합니다.
아두이노에 연결해서 사용하기도 쉽습니다. 간단한 납땜으로 핀을 달아준 뒤 아두이노의 3.3V(안정된 전원 공급을 위해), GND, A0(아날로그 핀 아무거나) 에 연결해주면 됩니다. 그리고 추가로 3.3v 라인을 아두이노의 AREF 핀에도 넣어줍니다.
- 아두이노 –> 마이크 모듈
- 3.3V –> VCC
- GND –> GND
- A0 –> OUT
- AREF –> VCC
주변이 완벽히 조용한 상태라면 VCC 핀으로 입력한 전압의 절반에 해당하는 값이 A0 핀을 통해 읽힙니다. 그리고 주변 음파의 변화에 따라 이 값이 흔들리면서 나타날겁니다.
아두이노의 아날로그 핀은 0V 부터 특정 전압까지의 단계를 1024 단계로(10비트 해상도) 나눠서 현재 입력된 전압을 측정해줍니다. 그런데 마이크 모듈에 공급된 전압이 3.3V 입니다. 따라서 아날로그 핀은 아두이노의 동작 전압(5V)을 기준하는게 아니라 마이크 모듈에 공급된 전압(3.3V)에 기준해야 합니다. 이런 역할을 하는 것이 AREF 핀입니다. 아두이노는 AREF 핀으로 입력된 전압을 기준으로 해서 ADC(analog to digital converter)를 동작합니다.
이 점만 주의하면 아날로그 핀을 통해 데이터를 읽는 것 자체는 무척 쉽습니다. analogRead() 함수만 사용하면 되니까요.
만약 확성기처럼 이 모듈을 이용해서 수집한 음파를 그대로 스피커로 출력하고 싶다면, 아래 모듈이 추가로 필요합니다. 그리고 커패시터 등을 추가해서 연결해줘야 합니다.
https://www.adafruit.com/products/987
마이크 모듈을 이용해 만든 프로젝트를 한번 구경하시고, 관련된 소스코드도 얻으세요.
Picolo project : https://learn.adafruit.com/piccolo
Electret Microphone Amplifier – MAX9814 with Auto Gain Control
입력되는 오디오의 크기를 예측할 수 없는 상황에서 쓰기 좋도록 설계된 MAX9814 amplifier 칩을 탑재했습니다. 모듈에 장착된 핀을 통해 Max gain(최대 입력 레벨), Attack/Release ratio 등을 조절할 수 있습니다. 때문에 핀이 5개 입니다.
VDD, GND, OUT 핀을 MAX4466 모듈에서와 같이 연결해주고 Gain, AR 핀을 VDD 또는 GND로 연결해 설정을 변경할 수 있습니다. 좀 더 상세한 연결 방법은 아래 링크를 참고하세요.
https://learn.adafruit.com/adafruit-agc-electret-microphone-amplifier-max9814/wiring-and-test
이 모듈은 OUT 핀을 통해 다음과 같은 출력을 준다고 합니다 : 2Vpp max on a 1.25V DC bias
정확치는 않지만 1.25V 기준으로 최대 +-2V 까지 값이 변화하는 것 같습니다. 따라서 일반적인 3.3V 동작전압에서 이상없이 동작합니다.
예제코드는 아래 링크를 참고하세요.
https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/measuring-sound-levels
주파수 추출과 FFT
주의하실 점이 하나 있습니다. 마이크 모듈을 통해 입력받는 값은 시간에 따라 변화하는 소리의 세기입니다. 이것만으로도 의미있는 작업들을 할 수 있지만, 대부분의 경우 주파수 형태로 분석된 정보가 훨씬 더 유용합니다. 따라서 시간에 따라 변화하는 소리의 세기에서 주파수 대역별로 분리된 정보를 추출해내는 작업이 필요합니다.
이걸 해주는 알고리즘이 FFT(Fast Fourier Transform) 입니다. 일정 시간동안 모인 음파의 변화를(샘플링) 분석해서 각 주파수 별 세기를 측정해 내는 과정 정도로 보시면 됩니다.
공식 한번 본다고 쉽게 이해되는 알고리즘이 아닙니다만… 다행히 이걸 해주는 라이브러리가 아두이노에도 있습니다.
- FFT 라이브러리 : ELM-ChaN ffft library (정석적인 라이브러리, 아두이노에 최적화 되진 않았음, 무거움)
- ArduinoFTT : http://wiki.openmusiclabs.com/wiki/ArduinoFFT (FFT를 아두이노에 사용하기 편하게 수정한 버전)
- ArduinoFHT (light version) : http://wiki.openmusiclabs.com/wiki/ArduinoFHT (일반적인 용도로 쓰기 좋게 수정한 가벼운 버전)
이제 아두이노 아날로그 핀으로 들어온 마이크 측정 값을 일정시간 모아서 FFT 라이브러리에 적용하면 주파수 정보를 얻을 수 있습니다. 이렇게 분석된 데이터를 원하는 용도로 활용하면 됩니다.
참고자료 모음
일반 마이크 모듈 관련자료
- 일반적인 electret microphone 구조와 동작 원리
- http://www.openmusiclabs.com/learning/sensors/electret-microphones/
- 제품 : https://www.adafruit.com/products/1064
노이즈 제거, 증폭 회로가 장착된 모듈
- MAX9812 : http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20151123234725&SearchText=microphone+module
- MAX9814 고급형 Auto Gain Control : https://www.adafruit.com/products/1713
- ==> 연결방법
- MAX4466 Adjustable Gain : https://www.adafruit.com/products/1063
연결방법
- https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/assembly-and-wiring
사운드 레벨 측정 기본 코드
- https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/measuring-sound-levels
- Piccolo 예제 라이브러리 : https://github.com/adafruit/piccolo
사운드 시각화 예제
- https://learn.adafruit.com/piccolo/overview
사운드 –> 주파수 변환 예제 및 라이브러리
- 예제 : https://learn.adafruit.com/adafruit-microphone-amplifier-breakout/overview
- FFT 라이브러리 : ELM-ChaN ffft library
- ELM-ChaN FFT library
- ArduinoFTT : http://wiki.openmusiclabs.com/wiki/ArduinoFFT
- ArduinoFHT (light version) : http://wiki.openmusiclabs.com/wiki/ArduinoFHT
오디오 출력 모듈
- https://www.adafruit.com/products/987