/// <summary> /// 近接センサ用音声データを送信する。 /// </summary> /// <param name="position">最新バッファ位置</param> private void SendFftData(int position) { try { int index = GetSendDataPosition(position); if (index == -1) { soundControl.SendAll( new SoundData(timeBuffer[position], new double[0], soundControl.ID)); } else { double[] fftData = UseFFT.GetPower(GetData(index, fftPacketCount)); soundControl.SendAll( new SoundData(timeBuffer[index], fftData, soundControl.ID)); } } catch (Exception e) { SoundControl.WriteErrorLog(e.ToString()); } }
/// <summary> /// 近接センサ用音声データを比較する。 /// </summary> /// <param name="soundData">受信した音声データ</param> /// <returns>比較結果(類似度)</returns> public double Compair(SoundData soundData) { try { if (soundData.Data.Length > 1) { // データ時刻が最も近いブロックを探す int index = SeekPosition(currentPosition, 100); while (index != currentPosition) { // 簡単に相手のデータ時刻を越えた瞬間とする if (timeBuffer[index] > soundData.Time) { break; } if (++index == RingBufferLength) { index = 0; } } // 対応する自分の音声バッファが有声区間であるか確認 bool[] localTalkingFlag = GetTalkFlags(index, fftPacketCount); if (CountBool(localTalkingFlag) > SilentDataThreshold) { // 音声データの比較 short[] data = GetData(index, fftPacketCount); double[] localFrequency = UseFFT.GetPower(data); return(UseFFT.Compair(localFrequency, soundData.Data)); } } } catch (Exception e) { SoundControl.WriteErrorLog(e.ToString()); } return(0); }