/// <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);
        }
Ejemplo n.º 3
0
 // 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;
     }
 }
Ejemplo n.º 4
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());
    }
Ejemplo n.º 7
0
    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");
        }
    }
Ejemplo n.º 8
0
    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!");
        }
Ejemplo n.º 10
0
    /// <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);
    }
Ejemplo n.º 11
0
    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";
    }
Ejemplo n.º 13
0
 /// <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);
 }
Ejemplo n.º 14
0
        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);
        }
    }
Ejemplo n.º 17
0
    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());
        }
    }
Ejemplo n.º 18
0
    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");
        }
    }