c# - 读取麦克风分贝和音调/频率

标签 c# unity3d audio triggers microphone

我正在尝试制作一款游戏,当麦克风发出足够响亮的声音时,我的角色会射击(在 Unity 中)。但是我不知道如何开始。

感谢您的帮助!

最佳答案

您可以通过使用 AudioSource.GetOutputData 检索当前播放的麦克风输出数据 block 来获取麦克风的分贝数功能。要从此数据中获取 dB,您需要对数据样本求和,然后计算 RMS。这是 RMS 值,您可以使用 20 * Mathf.Log10 (RMS/refVal) 计算 dB。

Unity's post 上有关于此的完整示例.您可以阅读它以获取更多信息,下面的代码基于此:

public float rmsVal;
public float dbVal;
public float pitchVal;

private const int QSamples = 1024;
private const float RefValue = 0.1f;
private const float Threshold = 0.02f;

float[] _samples;
private float[] _spectrum;
private float _fSample;

void Start()
{
    _samples = new float[QSamples];
    _spectrum = new float[QSamples];
    _fSample = AudioSettings.outputSampleRate;
}

void Update()
{
    AnalyzeSound();

    Debug.Log("RMS: " + rmsVal.ToString("F2"));
    Debug.Log(dbVal.ToString("F1") + " dB");
    Debug.Log(pitchVal.ToString("F0") + " Hz");
}

void AnalyzeSound()
{
    GetComponent<AudioSource>().GetOutputData(_samples, 0); // fill array with samples
    int i;
    float sum = 0;
    for (i = 0; i < QSamples; i++)
    {
        sum += _samples[i] * _samples[i]; // sum squared samples
    }
    rmsVal = Mathf.Sqrt(sum / QSamples); // rms = square root of average
    dbVal = 20 * Mathf.Log10(rmsVal / RefValue); // calculate dB
    if (dbVal < -160) dbVal = -160; // clamp it to -160dB min
                                    // get sound spectrum
    GetComponent<AudioSource>().GetSpectrumData(_spectrum, 0, FFTWindow.BlackmanHarris);
    float maxV = 0;
    var maxN = 0;
    for (i = 0; i < QSamples; i++)
    { // find max 
        if (!(_spectrum[i] > maxV) || !(_spectrum[i] > Threshold))
            continue;

        maxV = _spectrum[i];
        maxN = i; // maxN is the index of max
    }
    float freqN = maxN; // pass the index to a float variable
    if (maxN > 0 && maxN < QSamples - 1)
    { // interpolate index using neighbours
        var dL = _spectrum[maxN - 1] / _spectrum[maxN];
        var dR = _spectrum[maxN + 1] / _spectrum[maxN];
        freqN += 0.5f * (dR * dR - dL * dL);
    }
    pitchVal = freqN * (_fSample / 2) / QSamples; // convert index to frequency
}

关于c# - 读取麦克风分贝和音调/频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53030560/

相关文章:

c# - xUnit 进行 Json 文件读写测试

c# - 如何声明弱委托(delegate)(C#)?

c# - 无法将类型 `Steamworks.CSteamID' 隐式转换为 `float'

audio - FFmpeg 串联,最终输出中没有音频

c# - 将没有空格的摩尔斯解码为文本

c# - 使用 C# 连接到 Firefox

c# - Photon Server新手问题

c# - 如何防止刚体穿过其他碰撞体

java - Swing 中的音频波形选择

c# - 如何在 C# 中剪切、编辑和合并 OGG 文件?