示例#1
0
        /// <summary>
        /// Process 16 bit sample
        /// </summary>
        /// <param name="wave"></param>
        public void Process(ref byte[] wave)
        {
            IsEventActive = false;
            _waveLeft = new double[wave.Length / 4];
            _waveRight = new double[wave.Length / 4];

            if (_isTest == false)
            {
                // Split out channels from sample
                int h = 0;
                for (int i = 0; i < wave.Length; i += 4)
                {
                    _waveLeft[h] = (double)BitConverter.ToInt16(wave, i);
                    if (IsDetectingEvents == true)
                        if (_waveLeft[h] > AmplitudeThreshold || _waveLeft[h] < -AmplitudeThreshold)
                            IsEventActive = true;
                    _waveRight[h] = (double)BitConverter.ToInt16(wave, i + 2);
                    if (IsDetectingEvents == true)
                        if (_waveLeft[h] > AmplitudeThreshold || _waveLeft[h] < -AmplitudeThreshold)
                            IsEventActive = true;
                    h++;
                }
            }
            else
            {
                // Generate artificial sample for testing
                _signalGenerator = new SignalGenerator();
                _signalGenerator.SetWaveform("Sine");
                _signalGenerator.SetSamplingRate(44100);
                _signalGenerator.SetSamples(8192);
                _signalGenerator.SetFrequency(4096);
                _signalGenerator.SetAmplitude(32768);
                _waveLeft = _signalGenerator.GenerateSignal();
                _waveRight = _signalGenerator.GenerateSignal();
            }

            // Generate frequency domain data in decibels
            _fftLeft = FourierTransform.FFT(ref _waveLeft);
            _fftLeftSpect.Add(_fftLeft);
            if (_fftLeftSpect.Count > _maxHeightLeftSpect)
                _fftLeftSpect.RemoveAt(0);
            _fftRight = FourierTransform.FFT(ref _waveRight);
            _fftRightSpect.Add(_fftRight);
            if (_fftRightSpect.Count > _maxHeightRightSpect)
                _fftRightSpect.RemoveAt(0);
        }
        /// <summary>
        /// Process 16 bit sample
        /// </summary>
        /// <param name="wave"></param>
        public void Process(ref byte[] wave)
        {
            _waveLeft = new double[wave.Length / 4];
            _waveRight = new double[wave.Length / 4];

            if (_isTest == false)
            {
                // Split out channels from sample
                int h = 0;
                for (int i = 0; i < wave.Length; i += 4)
                {
                    _waveLeft[h] = (double)BitConverter.ToInt16(wave, i);
                    if (IsDetectingEvents == true)
                        if (_waveLeft[h] > AmplitudeThreshold || _waveLeft[h] < -AmplitudeThreshold)
                            IsEventActive = true;
                    _waveRight[h] = (double)BitConverter.ToInt16(wave, i + 2);
                    if (IsDetectingEvents == true)
                        if (_waveLeft[h] > AmplitudeThreshold || _waveLeft[h] < -AmplitudeThreshold)
                            IsEventActive = true;
                    h++;
                }
            }
            else
            {
                // Generate artificial sample for testing
                _signalGenerator = new SignalGenerator();
                _signalGenerator.SetWaveform("Sine");
                _signalGenerator.SetSamplingRate(44100);
                _signalGenerator.SetSamples(8192);
                _signalGenerator.SetFrequency(4096);
                _signalGenerator.SetAmplitude(32768);
                _waveLeft = _signalGenerator.GenerateSignal();
                _waveRight = _signalGenerator.GenerateSignal();
            }

            if (takeSample)
            {

                DateTime currentTime = DateTime.Now;
                int difference = (currentTime - initialTime).Seconds;

                if (difference < sampleRecordDuration)
                {
                    try
                    {
                        double[] soundData = new double[_waveLeft.Length];
                        Array.Copy(_waveLeft, soundData, _waveLeft.Length);
                        Array.Sort(soundData);
                        double min = soundData[0];
                        double max = soundData[soundData.Length - 1];

                        if (min < minPerSecond)
                        {
                            minPerSecond = min;
                        }

                        if (max > maxPerSecond)
                        {
                            maxPerSecond = max;
                        }

                        minSumPerSecond += min;
                        maxSumPerSecond += max;

                        string data = Environment.NewLine + counter + "). " + "min = " +min + " max = " + max;

                        Byte[] text = new UTF8Encoding(true).GetBytes(data);
                        output.Write(text, 0, text.Length);
                        counter++;
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }

                else
                {
                    minAveragePerSecond = minSumPerSecond / counter;
                    maxAveragePerSecond = maxSumPerSecond / counter;

                    string data = Environment.NewLine + "min Per second = " + minPerSecond + Environment.NewLine + "max per second = " + maxPerSecond + Environment.NewLine + "min average = " + minAveragePerSecond + Environment.NewLine + "max average = " + maxAveragePerSecond;

                    Byte[] text = new UTF8Encoding(true).GetBytes(data);
                    output.Write(text, 0, text.Length);

                    counter = 0;

                    output.Flush();
                    output.Close();
                    takeSample = false;
                    sampleMessageTextLabel.Text = "Finished recording";

                    // reset variables
                    minPerSecond = 0;
                    maxPerSecond = 0;

                    minSumPerSecond = 0;
                    maxSumPerSecond = 0;

                    minAveragePerSecond= 0;
                    maxAveragePerSecond= 0;
                }

            }

            //--------Record Interaction-------------
            if (recordInteraction)
            {
                DateTime interactCurrentTime = DateTime.Now;
                int difference = (interactCurrentTime - interactInitialTime).Seconds;

                if (difference < interactRecordDuration)
                {
                    try
                    {
                        double[] soundData = new double[_waveLeft.Length];
                        Array.Copy(_waveLeft, soundData, _waveLeft.Length);
                        Array.Sort(soundData);
                        double min = soundData[0];
                        double max = soundData[soundData.Length - 1];

                        if (min < interactMinPerSecond)
                        {
                            interactMinPerSecond = min;
                        }

                        if (max > interactMaxPerSecond)
                        {
                            interactMaxPerSecond = max;
                        }

                        interactMinSumPerSecond += min;
                        interactMaxSumPerSecond += max;

                        interactCounter++;
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }

                else
                {
                    interactMinAveragePerSecond = interactMinSumPerSecond / interactCounter;
                    interactMaxAveragePerSecond = interactMaxSumPerSecond / interactCounter;

                    interactCounter = 0;
                    recordInteraction = false;
                    interactLabel.Text = "Interaction finished ";

                    double [] input = {interactMinPerSecond, interactMaxPerSecond, interactMinAveragePerSecond, interactMaxAveragePerSecond  };

                    String voiceTone = neuralNetwork.computeOutput(input);
                    neuralOutputLabel.Text = "Classification is: " + voiceTone;
                    Console.WriteLine("Min per second = " + interactMinPerSecond + " Max per second = " + interactMaxPerSecond + " Min average = " + interactMinAveragePerSecond + " Max average = " + interactMaxAveragePerSecond );

                    if (voiceTone != "Unrecognised")
                    {
                        robot.listen(voiceTone);
                    }

                    else
                    {
                        unrecognisedVoiceTone = true;
                    }

                    // reset variables
                    interactMinPerSecond = 0;
                    interactMaxPerSecond = 0;

                    interactMinSumPerSecond = 0;
                    interactMaxSumPerSecond = 0;

                    interactMinAveragePerSecond = 0;
                    interactMaxAveragePerSecond = 0;
                }

            }
        }