Вы переопределяете 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();
}