//private static void Reader_FrameArrived(object sender, AudioBeamFrameArrivedEventArgs e) { //} private static void UpdateAudio() { audioFrameAvailable = false; if (audioReader != null) { IList <AudioBeamFrame> frames = audioReader.AcquireLatestBeamFrames(); for (int i = 0; i < frames.Count; i++) { AudioBeamFrame frame = frames[i]; if (frame != null) { audioFrameAvailable = true; IList <AudioBeamSubFrame> subframes = frame.SubFrames; for (int j = 0; j < subframes.Count; j++) { AudioBeamSubFrame subframe = subframes[j]; if (subframe != null) { beamAngle = subframe.BeamAngle; ProcessAudio(subframe); subframe.Dispose(); } } frame.Dispose(); } } } }
private static void ProcessAudio(AudioBeamSubFrame subFrame) { // Process audio buffer subFrame.CopyFrameDataToArray(audioBuffer); for (int i = 0; i < audioBuffer.Length; i += BytesPerSample) { // Extract the 32-bit IEEE float sample from the byte array float audioSample = BitConverter.ToSingle(audioBuffer, i); accumulatedSquareSum += audioSample * audioSample; ++accumulatedSampleCount; if (accumulatedSampleCount < SamplesPerColumn) { continue; } float meanSquare = accumulatedSquareSum / SamplesPerColumn; if (meanSquare > 1.0f) { // A loud audio source right next to the sensor may result in mean square values // greater than 1.0. Cap it at 1.0f for display purposes. meanSquare = 1.0f; } // Calculate energy in dB, in the range [MinEnergy, 0], where MinEnergy < 0 energyAmount = MinEnergy; if (meanSquare > 0) { energyAmount = (float)(10.0 * Math.Log10(meanSquare)); } lock (energyLock) { // Normalize values to the range [0, 1] for display energy[energyIndex] = (MinEnergy - energyAmount) / MinEnergy; energyIndex = (energyIndex + 1) % energy.Length; ++newEnergyAvailable; } accumulatedSquareSum = 0; accumulatedSampleCount = 0; } }