Esempio n. 1
0
        //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();
                    }
                }
            }
        }
Esempio n. 2
0
        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;
            }
        }