유니티 C# 마이크 데시벨 간단 구현 예시 코드 작성

반응형

유니티 C# 마이크 데시벨 간단 구현 예시 코드 작성

using UnityEngine;

public class MicrophoneDecibel : MonoBehaviour
{
    public AudioSource audioSource;   // AudioSource 컴포넌트
    private string microphoneDevice;  // 마이크 장치 이름
    private AudioClip microphoneClip; // 마이크에서 입력된 오디오 클립

    void Start()
    {
        // 사용 가능한 마이크 장치 가져오기
        microphoneDevice = Microphone.devices[0];  // 첫 번째 마이크 장치를 사용

        // 마이크에서 오디오 입력을 받아오기 시작
        microphoneClip = Microphone.Start(microphoneDevice, true, 10, 44100); // 10초 길이, 44100Hz
        audioSource.clip = microphoneClip;
        audioSource.loop = true;

        // 마이크 입력이 시작되면 오디오 재생 시작
        while (!(Microphone.GetPosition(microphoneDevice) > 0)) { }
        audioSource.Play();
    }

    void Update()
    {
        // 데시벨 값을 계산하여 출력
        float decibel = GetDecibel();
        Debug.Log("Current Decibel Level: " + decibel + " dB");
    }

    // 오디오 샘플을 받아서 RMS를 계산하고 이를 데시벨로 변환하는 함수
    float GetDecibel()
    {
        float[] data = new float[256]; // 오디오 데이터를 저장할 배열
        float sum = 0f;

        // 오디오 데이터를 가져오기 (현재 재생 위치에서 256 샘플)
        audioSource.GetOutputData(data, 0);

        // RMS 계산을 위한 제곱 합 구하기
        foreach (var sample in data)
        {
            sum += sample * sample;
        }

        // RMS 계산 (평균 제곱근)
        float rms = Mathf.Sqrt(sum / data.Length);

        // 데시벨로 변환 (데시벨은 RMS 값의 로그 스케일)
        float decibel = 20 * Mathf.Log10(rms / 0.1f);

        // 데시벨 값이 매우 작은 경우 처리
        if (decibel < -80) decibel = -80;

        return decibel;
    }
}
반응형