Максимальное значение входа микрофона в списке неверно c # - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь получить вход Mic и преобразовать его в число с плавающей точкой. Когда я печатаю Максимальное число с плавающей точкой в ​​списке, он печатает меня неограниченное количество раз одно и то же число (он печатает все время, нажимая «T»). Я просто хочу, чтобы это напечатало самый большой номер в списке микрофонного входа только один номер. Метод его расчета находится в методе Maximum_Level

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class MicInputs : MonoBehaviour
{
public enum micActivation
{
    HoldToSpeak,

}
public micActivation micControl;
private float sample_max = 0.0f;

public static float MicLoudFloat;
public List<float> recorded_values = new List<float>();
public List<float> final_values = new List<float>();
private string theMicroDevice;
AudioClip recordOfClips;
//microphone initialization
void MicroInitialization()
{
    if (theMicroDevice == null) theMicroDevice = 
Microphone.devices[0];
    recordOfClips = Microphone.Start(theMicroDevice, true, 999, 
44100);
}

void StopMicrophone()
{
    Microphone.End(theMicroDevice);
    Maximum_Level(); // Collect the final sample
    MicLoudFloat = sample_max;
    print(MicLoudFloat);

}

void Awake()
{
    recordOfClips = AudioClip.Create("nameOfClip", 128, 2, 1000, 
true);
}
//AudioClip clip = myRecordedOrOwnClip;
//reate(string name, int lengthSamples, int channels, int frequency, 
bool stream,
//_sampleWindow = clip.samples;
//AudioClip _clipRecord = new AudioClip();
//AudioClip _clipRecord = AudioClip.Create("nameOfClip", 128, 2, 1, 
true);
int samplesWindows = 128;



//=========THIS IS THE START OF THE METHOD========


// get data from microphone into audioclip
float Maximum_Level()
{

    float[] waveData = new float[samplesWindows];
    int micPosition = Microphone.GetPosition(null) - (samplesWindows 
+1); // null means the first microphone
    if (micPosition < 0) return 0;
    recordOfClips.GetData(waveData, micPosition);
    // Getting a peak on the last 128 samples
    for (int i = 0; i < samplesWindows; i++)
    {
        float wavePeak = waveData[i] * waveData[i];
        if (wavePeak > sample_max)
        {
            sample_max = wavePeak;
        }
    }
    return sample_max;
    //float maximum_level = 0;
    //float[] waveData = new float[samplesWindows];
    //int micPosition = Microphone.GetPosition(null) - 
(samplesWindows + 1); // null means the first microphone
    //if (micPosition < 0) return 0;
    //recordOfClips.GetData(waveData, micPosition);
    //// Getting a peak on the last 128 samples
    //for (int i = 0; i < samplesWindows; i++)
    //{
    //    float wavePeak = waveData[i] * waveData[i];
    //    if (maximum_level < wavePeak)
    //    {
    //        maximum_level = wavePeak;
    //        recorded_values.Add(maximum_level);
    //    }
    //}

    //float max = recorded_values.Max();
    ////print(max);
    //return max;


    //print(maximum_level);
    //return maximum_level;
}

//=========THIS IS THE END OF THE METHOD========



void Update()
{
    if (micControl == micActivation.HoldToSpeak)
    {
        if (Microphone.IsRecording(theMicroDevice) && 
Input.GetKey(KeyCode.T) == false)
            StopMicrophone();
        //
        if (Input.GetKeyDown(KeyCode.T)){ //Push to talk
            MicroInitialization();

        }
        //
        if (Input.GetKeyUp(KeyCode.T)){
            StopMicrophone();


        }

    }

Maximum_Level();
    // levelMax equals to the highest normalized value power 2, a 
small number because < 1
    // pass the value to a static var so we can access it from 
anywhere


    //print(MicLoudFloat);
}

bool isItInitialized;

// start mic when scene starts
void OnEnable()
{
    MicroInitialization();
    isItInitialized = true;
}

//stop mic when loading a new level or quit application
void OnDisable()
{
    StopMicrophone();
}

void OnDestroy()
{
    StopMicrophone();
}


// detects if the mic gets started & stopped when application gets 
focused
void OnApplicationFocus(bool focus)
{
    if (focus)
    {
        //Debug.Log("Focus");

        if (!isItInitialized)
        {
            //Debug.Log("Init Mic");
            MicroInitialization();
            isItInitialized = true;
        }
    }
    if (!focus)
    {
        //Debug.Log("Pause");
        StopMicrophone();
        //Debug.Log("Stop Mic");
        isItInitialized = false;

    }
}
}

1 Ответ

0 голосов
/ 10 ноября 2018

Вы переопределяете maximum_level каждый раз, когда вызываете функцию, поэтому в каждом кадре вы рассматриваете максимальный уровень как 0 для каждого samplesWindows. То есть каждый кадр, MicLoudFloat получит значение самого высокого уровня выборки этого кадра. MicLoudFloat будет выглядеть так в нескольких кадрах:

0, 0, 0.2, 1.5, 0.4, 0, 0

Если вы хотите узнать текущий максимум, вам нужно сравнить MicLoudFloat с результатами Maximum_Level(); и применить его к MicLoudFloat, только если он больше.

1012 * например *

float newValue = Maximum_Level();
MicLoudFloat = (newValue > MicLoudFloat) ? newValue : MicLoudFloat;
print(MicLoudFloat);
// 0, 0, 0.2, 1.5, 1.5, 1.5, 1.5

Альтернативно, если вы хотите печатать только после изменения MicLoudFloat, вы можете сделать что-то вроде:

float newValue = Maximum_Level();
if (newValue > MicLoudFloat)
{
    MicLoudFloat = newValue;
    print(MicLoudFloat); 
    // 0, 0.2, 1.5
}

EDIT ---

Если вам нужно только самое большое значение из всего набора, вам нужно подождать, пока вы не узнаете, что набор завершен, прежде чем назначать.

Этого можно достичь, выполнив

MicLoudFloat = recorded_values.Max();

Внутри StopMicrophone метода. Но вам нужно будет очищать список recorded_values каждый раз, когда вы снова запускаете микрофон.

Вы также можете покончить со всеми списками посредников и назначением следующим образом:

public static float MicLoudFloat;
private float sample_max = 0;

// ...
void StopMicrophone()
{
    Microphone.End(theMicroDevice);
    Maximum_Level(); // Collect the final sample
    MicLoudFloat = sample_max;
    print(MicLoudFloat);
    // 1.5
}

// ...

float Maximum_Level()
{
    float[] waveData = new float[samplesWindows];
    int micPosition = Microphone.GetPosition(null) - (samplesWindows + 
    1); // null means the first microphone
    if (micPosition < 0) return 0;
    recordOfClips.GetData(waveData, micPosition);
    // Getting a peak on the last 128 samples
    for (int i = 0; i < samplesWindows; i++)
    {
        float wavePeak = waveData[i] * waveData[i];
        if (wavePeak > sample_max)
        {
            sample_max= wavePeak
        }
    }
    return sample_max;
 }

// ...

void Update()
{
    // ...

    Maximum_Level();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...