/// <summary> /// 更新インテンシティデータをエディタ上でも反映させていくようにする /// </summary> /// <param name="reCalcDataPackage">更新データ</param> /// <returns></returns> private IEnumerator UpdateEditor(ReCalcTransientDataPackage reCalcTransientDataPackage) { int frame = reCalcTransientDataPackage.iintensityList.Count / reCalcTransientDataPackage.storageNum; for (int i = 0; i < reCalcTransientDataPackage.storageNum; i++) { if (intensities.ContainsKey(reCalcTransientDataPackage.sendNums[i])) { var pushObj = intensities[reCalcTransientDataPackage.sendNums[i]]; //色変更を行う pushObj.transform.localRotation = Quaternion.LookRotation(10000000000 * reCalcTransientDataPackage.intensities[i]); var lv = AcousticMathNew.CalcuIntensityLevel(reCalcTransientDataPackage.intensities[i]); pushObj.transform.GetComponent<Renderer>().material.color = ColorBar.DefineColor(MeasurementParameter.colormapID, lv, MeasurementParameter.MinIntensity, MeasurementParameter.MaxIntensity); //瞬時音響インテンシティの変更 var intensityDirection = new Vector3[frame]; float[] intensityLv = new float[frame]; for (int j = 0; j < frame; j++) { intensityDirection[j] = reCalcTransientDataPackage.iintensityList[i * frame + j]; intensityLv[j] = MathFFTW.CalcuIntensityLevel(intensityDirection[j]); } var parameter = pushObj.GetComponent<ParameterStorage>(); parameter.PutIntensity(intensityDirection, intensityLv); yield return null; } } yield return null; }
private void IfftTest() { ifft = new double[sampleLength]; // サンプル数の2の乗数を計算 int length_bit = (int)(Mathf.Log(sampleLength, 2f)); System.Numerics.Complex[] temp = new System.Numerics.Complex[sampleLength]; System.Numerics.Complex[] fft = new System.Numerics.Complex[sampleLength]; //複素数に変更 for (int i = 0; i < sampleLength; i++) { temp[i] = new System.Numerics.Complex((double)signal[0][i], 0); } //FFT AcousticMathNew.FFT(length_bit, temp, out fft); //iFFT AcousticMathNew.IFFT(length_bit, fft, out ifft); for (int j = 0; j < sampleLength; j++) { var dif = ifft[j] - signal[0][j]; Debug.Log("diff" + dif.ToString()); } RecordManager.Dump2File(ifft); }
// Update is called once per frame void Update() { if (Input.GetKey(KeyCode.O)) { ParameterChange(); CallIntensity(); } if (Input.GetKey(KeyCode.P)) { ParameterChange(); CallIntensityBack(); } if (Input.GetKeyDown(KeyCode.I)) { Vector3 sum = Vector3.zero; for (int count = 0; count < soundIntensity.Length; count++) { sum += soundIntensity[count]; } var sumLevel = AcousticMathNew.CalcuIntensityLevel(sum); Debug.Log("Sound intensity of average is " + sumLevel); transform.localRotation = Quaternion.LookRotation(sum * 10000000000); transform.localScale = new Vector3(MeasurementParameter.objSize, MeasurementParameter.objSize, MeasurementParameter.objSize * 4); Color vecObjColor = ColorBar.DefineColor(1, sumLevel, MeasurementParameter.lvMin, MeasurementParameter.lvMax); gameObject.GetComponent <Renderer>().material.color = vecObjColor; i = 0; } }
IEnumerator UpdateData() { yield return(new WaitForSeconds(1f)); Writelog("Start record"); while (beMeasure) { soundSignals = AsioManager.GetAsioSoundSignals(sampleLength); Vector3 IntensityDirection = AcousticMathNew.CrossSpectrumMethod(soundSignals, sampleRate, length_bit, freq_range_min, freq_range_max, atmDensity, interval); float intensityLevel_dB = AcousticMathNew.CalcuIntensityLevel(IntensityDirection); // Debug.Log(soundSignals[0][i]); // Debug.Log(soundSignals[1][i]); // Debug.Log(soundSignals[2][i]); // Debug.Log(soundSignals[3][i]); Debug.Log(intensityLevel_dB); Debug.Log(IntensityDirection.x); Debug.Log(IntensityDirection.y); Debug.Log(IntensityDirection.z); WriteConsole(IntensityDirection.x, IntensityDirection.y, IntensityDirection.z, intensityLevel_dB); client.Send("", IntensityDirection.x, IntensityDirection.y, IntensityDirection.z, intensityLevel_dB); yield return(new WaitForSeconds(measureSpan)); } }
private IEnumerator RecordSignal(Vector3 sendPos, Quaternion sendRot) { //音声再生 //AsioManager.startSound(); //録音のlengthbit分待つ yield return(new WaitForSeconds(4096f / 44100f)); //録音開始 soundSignals = AsioManager.GetAsioSoundSignals(isampleLength); //瞬時音響インテンシティ計算 var intensityDirection = AcousticSI.DirectMethod(soundSignals, SettingManager.AtmDensity, SettingManager.micInterval); //直接法計算 var sumIntensity = AcousticSI.SumIntensity(intensityDirection); sintensities.Add(AcousticMathNew.CalcuIntensityLevel(sumIntensity)); //データ送信 client.Send("ResultSend", sendPos.x, sendPos.y, sendPos.z, sendRot.x, sendRot.y, sendRot.z, sendRot.w, sumIntensity.x, sumIntensity.y, sumIntensity.z, Num); yield return(null); //PCがわ表示 float[] intensityLv = new float[intensityDirection.Length]; for (int i = 0; i < intensityDirection.Length; i++) { intensityLv[i] = AcousticMathNew.CalcuIntensityLevel(intensityDirection[i]); } Color color = ColorBar.DefineColor(SettingManager.colormapID, AcousticMathNew.CalcuIntensityLevel(sumIntensity), SettingManager.lvMin, SettingManager.lvMax); GameObject instant = CreateInstantObj(Num, sendPos, sendRot, sumIntensity, color, intensityDirection, intensityLv); DataStorage data = new DataStorage(Num, sendPos, sendRot, soundSignals, sumIntensity); dataStorages.Add(data); Num++; yield return(null); }
public Vector3[] MakeIntensity(double[][] noise) { double[][] resizeNoise = new double[4][]; resizeNoise[0] = new double[4096]; resizeNoise[1] = new double[4096]; resizeNoise[2] = new double[4096]; resizeNoise[3] = new double[4096]; List <Vector3> intensities = new List <Vector3>(); int i = 0; Debug.Log(noise[0].Length); while (i + 4096 < noise[0].Length) { for (int j = 0; j < 4096; j++) { resizeNoise[0][j] = noise[0][i + j]; resizeNoise[1][j] = noise[1][i + j]; resizeNoise[2][j] = noise[2][i + j]; resizeNoise[3][j] = noise[3][i + j]; } Vector3 intensity = AcousticMathNew.CrossSpectrumMethod(resizeNoise, 44100, 12, freq_range_min, freq_range_max, atmDensity, micInterval); intensities.Add(intensity); i += 4096; } return(intensities.ToArray()); }
async Task AsyncLoadBin() { if (initialLoad) { //録音&マイク位置バイナリファイル保存 for (int dataIndex = 0; dataIndex < MeasurementParameter.plotNumber; dataIndex++) { string pathName = MeasurementParameter.SaveDir + @"\measurepoint_" + dataIndex.ToString() + ".bytes"; DataStorage data = new DataStorage(); if (File.Exists(pathName)) { await Task.Run(() => { using (BinaryReader br = new BinaryReader(File.Open(pathName, FileMode.Open))) { data.soundSignal = new double[4][]; for (int micID = 0; micID < 4; micID++) { data.soundSignal[micID] = new double[MeasurementParameter.SampleNum]; for (int sample = 0; sample < MeasurementParameter.SampleNum; sample++) { data.soundSignal[micID][sample] = br.ReadDouble(); } } float vx = (float)br.ReadDouble(); float vy = (float)br.ReadDouble(); float vz = (float)br.ReadDouble(); data.micLocalPos = new Vector3(vx, vy, vz); float rx = (float)br.ReadDouble(); float ry = (float)br.ReadDouble(); float rz = (float)br.ReadDouble(); float rw = (float)br.ReadDouble(); data.micLocalRot = new Quaternion(rx, ry, rz, rw); br.Close(); } data.measureNo = dataIndex; data.intensityDir = AcousticMathNew.CrossSpectrumMethod(data.soundSignal, MeasurementParameter.Fs, length_bit, MeasurementParameter.FreqMin, MeasurementParameter.FreqMax, MeasurementParameter.AtmDensity, MeasurementParameter.MInterval); var level = AcousticMathNew.CalcuIntensityLevel(data.intensityDir); dataStorages.Add(data); logQueue.Enqueue($"loading num is {data.measureNo}"); }); } } logQueue.Enqueue("Data Loading is finished!"); initialLoad = false; SettingSender ud_setting = new SettingSender("NewSetting", MeasurementParameter.colormapID, MeasurementParameter.MaxIntensity, MeasurementParameter.MinIntensity, MeasurementParameter.objSize); //更新データをHololensに送信 string json = transferData.SerializeJson <SettingSender>(ud_setting); tServer.SendAllClient(json); } else { logQueue.Enqueue("already read data"); } }
public void WriteConsole(int num, Vector3 sendPos, Vector3 intensity) { var intensityLevel = AcousticMathNew.CalcuIntensityLevel(intensity); logIntensity.text = "Send Position is x:" + sendPos.x.ToString("f2") + " y:" + sendPos.y.ToString("f2") + " z:" + sendPos.z.ToString("f2") + "\n Intensity Data (" + num.ToString() + "is \n x: " + intensity.x.ToString("F12") + "\n y: " + intensity.y.ToString("F12") + "\n z: " + intensity.z.ToString("F12") + "\n Intensity level: " + intensityLevel.ToString("f6") + "[dB]"; }
private void FilterTest() { TextAsset asset1 = Resources.Load("TestData/whitenoiseTest", typeof(TextAsset)) as TextAsset; double[] white = new double[asset1.bytes.Length / 8]; white = readArray.bytes2array(asset1, asset1.bytes.Length / 8); //バンドパスフィルタ double[] BPwhite; AcousticMathNew.BPFilter(white, out BPwhite, sampleLength); RecordManager.Dump2File(BPwhite); Debug.Log("Filter Fin!"); }
/// <summary> /// Asioから音圧信号(IntPtr型)を取得してdouble配列に変換して返す /// こっちを使用 /// </summary> /// <param name="sampleLength">サンプル長</param> /// <returns>音圧信号のジャグ配列 hoge["マイクのID番号"]["サンプル"]</returns> public static double[][] GetAsioSoundSignals(int sampleLength) { // サンプル数の2の乗数を計算 length_bit = (int)(Mathf.Log(sampleLength, 2f)); startSound(); //Asioから取得してくるIntPtr型の音圧信号配列 IntPtr[] ptrSoundSignals = new IntPtr[4]; for (int micID = 0; micID < 4; micID++) { ptrSoundSignals[micID] = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * sampleLength); } //AsioからIntPtr型を取得 GetFourSoundSignal(ptrSoundSignals[0], ptrSoundSignals[1], ptrSoundSignals[2], ptrSoundSignals[3]); //一時的に保管するint型の音圧信号配列 int[][] tempSoundSignals = new int[4][]; //出力するdouble型の音圧信号配列 double[][] outSoundSignals = new double[4][]; System.Numerics.Complex[] temp = new System.Numerics.Complex[sampleLength]; System.Numerics.Complex[] calib = new System.Numerics.Complex[sampleLength]; double[] outIFFT = new double[sampleLength]; for (int micID = 0; micID < 4; micID++) { tempSoundSignals[micID] = new int[sampleLength]; outSoundSignals[micID] = new double[sampleLength]; //IntPtr -> int Marshal.Copy(ptrSoundSignals[micID], tempSoundSignals[micID], 0, sampleLength); for (int sample = 0; sample < sampleLength; sample++) { outIFFT[sample] = (double)tempSoundSignals[micID][sample] / (double)Mathf.Pow(10, 8) / simpleCal[micID]; //temp[sample] = new System.Numerics.Complex((double)tempSoundSignals[micID][sample] / (double)Mathf.Pow(10, 8), 0); } //キャリブレーション /*AcousticMathNew.FFT(length_bit, temp, out calib); * for (int sample = 0; sample < sampleLength; sample++) * { * //キャリブレーション * temp[sample] = System.Numerics.Complex.Divide(calib[sample], calibdata[micID][sample]); * //バンドパスフィルタ * } * //出力信号に戻す * AcousticMathNew.IFFT(length_bit, temp, out outIFFT);*/ //バンドパスフィルタ AcousticMathNew.BPFilter(outIFFT, out outSoundSignals[micID], sampleLength); } return(outSoundSignals); }
private ReCalcDataPackage AsyncReCalc() { //送信データの作成 ReCalcDataPackage data = new ReCalcDataPackage(dataStorages.Count); foreach (DataStorage dataStorage in dataStorages) { Vector3 intensity = AcousticMathNew.CrossSpectrumMethod(dataStorage.soundSignal, MeasurementParameter.Fs, length_bit, MeasurementParameter.FreqMin, MeasurementParameter.FreqMax, MeasurementParameter.AtmDensity, MeasurementParameter.MInterval); data.intensities.Add(intensity); data.sendNums.Add(dataStorage.measureNo); } return(data); }
// Use this for initialization void Start() { soundSignals = ReadNoise(); atmDensity = CalculateAtmDensity(atm, temp); intensities = MakeIntensity(soundSignals); OutputObj = GameObject.Instantiate(prefab) as GameObject; OutputObj.transform.localPosition = Vector3.zero; OutputObj.transform.localRotation = Quaternion.LookRotation(10000000000 * intensities[0]); OutputObj.transform.localScale = new Vector3(1, 1, 4); float intensityLevel = AcousticMathNew.CalcuIntensityLevel(intensities[0]); Color vecColor = ColorBar.DefineColor(1, intensityLevel, lv_min, lv_max); OutputObj.transform.GetComponent <Renderer>().material.color = vecColor; OutputObj.name = "VectorObject"; }
/// <summary> /// 更新インテンシティデータをエディタ上でも反映させていくようにする /// </summary> /// <param name="reCalcDataPackage">更新データ</param> /// <returns></returns> private IEnumerator UpdateEditor(ReCalcDataPackage reCalcDataPackage) { for (int i = 0; i < reCalcDataPackage.storageNum; i++) { if (intensities.ContainsKey(reCalcDataPackage.sendNums[i])) { var pushObj = intensities[reCalcDataPackage.sendNums[i]]; //色変更を行う pushObj.transform.localRotation = Quaternion.LookRotation(10000000000 * reCalcDataPackage.intensities[i]); var lv = AcousticMathNew.CalcuIntensityLevel(reCalcDataPackage.intensities[i]); pushObj.transform.GetComponent <Renderer>().material.color = ColorBar.DefineColor(MeasurementParameter.colormapID, lv, MeasurementParameter.MinIntensity, MeasurementParameter.MaxIntensity); yield return(null); } } yield return(null); }
void RecordIntensity() { var soundSignal = AsioManager.GetAsioSoundSignals(sampleLength); var intensityDirection = AcousticSI.DirectMethod(soundSignal, atmDensity, micInterval); float[] intensityLv = new float[intensityDirection.Length]; for (int i = 0; i < intensityDirection.Length; i++) { intensityLv[i] = AcousticMathNew.CalcuIntensityLevel(intensityDirection[i]); } var intensityObj = Instantiate(prefab);; var parameter = intensityObj.AddComponent <ParameterStorage>(); parameter.PutIntensity(intensityDirection, intensityLv); }
// Use this for initialization void Start() { //データの読み込み ReadTestData(); //瞬時音響インテンシティ計算 var intensityDirection = AcousticSI.DirectMethod(signal, atmD, micD); //直接法計算 var sumIntensity = AcousticSI.SumIntensity(intensityDirection); float[] intensityLv = new float[intensityDirection.Length]; for (int i = 0; i < intensityDirection.Length; i++) { intensityLv[i] = AcousticMathNew.CalcuIntensityLevel(intensityDirection[i]); } Color color = ColorBar.DefineColor(2, AcousticMathNew.CalcuIntensityLevel(sumIntensity), 65, 105); GameObject instant = CreateInstantObj(sumIntensity, color, intensityDirection, intensityLv); }
// Update is called once per frame void Update() { if (Input.GetKey(KeyCode.L)) { n++; if (n == intensities.Length) { n = 0; } OutputObj.transform.localRotation = Quaternion.LookRotation(10000000000 * intensities[n]); float intensityLevel = AcousticMathNew.CalcuIntensityLevel(intensities[n]); Color vecColor = ColorBar.DefineColor(1, intensityLevel, lv_min, lv_max); OutputObj.transform.GetComponent <Renderer>().material.color = vecColor; Debug.Log(intensities[n].x + "," + intensities[n].y + "," + intensities[n].z); Debug.Log(intensityLevel); Debug.Log("Display No." + n); } }
public IntensityPackage MicPosReceived(SendPosition sendPosition) { if (CheckPlotDistance(sendPosition.sendPos)) { GameObject micPoint = new GameObject("measurementPoint" + Num); micPoint.transform.parent = copyStandard.transform; micPoint.transform.localPosition = sendPosition.sendPos; micPoint.transform.localRotation = sendPosition.sendRot; // 音声取得 var soundSignals = asiocsharpdll.GetAsioSoundSignals(MeasurementParameter.SampleNum, MeasurementParameter.CalibValue); //intensity計算 var intensityDir = AcousticMathNew.CrossSpectrumMethod(soundSignals, MeasurementParameter.Fs, length_bit, MeasurementParameter.FreqMin, MeasurementParameter.FreqMax, MeasurementParameter.AtmDensity, MeasurementParameter.MInterval); float intensityLv_dB = AcousticMathNew.CalcuIntensityLevel(intensityDir); //オブジェクト作成 var vectorObj = Instantiate(Cone) as GameObject; vectorObj.transform.localScale = new Vector3(MeasurementParameter.objSize, MeasurementParameter.objSize, MeasurementParameter.objSize * 4); vectorObj.transform.parent = micPoint.transform; vectorObj.transform.localPosition = Vector3.zero; vectorObj.transform.localRotation = Quaternion.LookRotation(10000000000 * intensityDir); var vecColor = ColorBar.DefineColor(MeasurementParameter.colormapID, intensityLv_dB, MeasurementParameter.MinIntensity, MeasurementParameter.MaxIntensity); vectorObj.transform.GetComponent <Renderer>().material.color = vecColor; vectorObj.name = "IntensityObj"; intensities.Add(Num, vectorObj); //データそのものを保管 DataStorage data = new DataStorage(Num, sendPosition.sendPos, sendPosition.sendRot, soundSignals, intensityDir); dataStorages.Add(Num, data); //送信データを作成 var sendData = new IntensityPackage(sendPosition, intensityDir, Num); Num++; return(sendData); } else { return(new IntensityPackage()); } }
void Update() { if (Input.GetKeyDown(recButton)) { soundSignals = AsioManager.GetAsioSoundSignals(sampleLength); Vector3 IntensityDirection = AcousticMathNew.CrossSpectrumMethod(soundSignals, sampleRate, 12, 353f, 707f, 1000.4f, 0.05f); float intensityLevel_dB = AcousticMathNew.CalcuIntensityLevel(IntensityDirection); Debug.Log(intensityLevel_dB); //} for (int micID = 0; micID < 4; micID++) { //グラフ書く // DrowLineGraph(soundSignals[micID], lines[micID]); //音圧レベルを出す recSP[micID] = GetSoundPressure(soundSignals[micID]); recSPL[micID] = GetSoundPressureLevel(recSP[micID]); // recTexts[micID].text = string.Format("SP: {0}\nSPL: {1}", recSP[micID], recSPL[micID]); Debug.Log(string.Format("SP: {0}\nSPL: {1}", recSP[micID], recSPL[micID])); } } //recSPLをメモ for (int micId = 0; micId < 4; micId++) { if (Input.GetKeyDown(noteButton[micId])) { SetRecSPSPL(micId); } } // バイナリ保存 if (Input.GetKeyDown(saveBytesButton)) { Debug.Log("Save Bytes Data"); SaveBinaryData(soundSignals, @"C:\Users\acoust\Desktop"); } }