示例#1
0
        public void Create_Pressure()
        {
            P = new double[Receiver.Count][];
            Pdir = new double[Receiver.Count][][];
            double scale = Math.Sqrt(4096);

            for (int i = 0; i < Receiver.Count; i++)
            {
                double[][] ETC = new double[8][];

                for (int oct = 0; oct < 8; oct++) ETC[oct] = new double[Io[i][0].Length];

                for (int t = 0; t < ETC[0].Length; t++)
                {
                    for (int oct = 0; oct < 8; oct++) ETC[oct][t] = Math.Sqrt(Io[i][oct][t] * Rho_C[i]);
                }

                P[i] = new double[ETC[0].Length + 4096];
                Pdir[i] = new double[6][];
                for (int j = 0; j < 6; j++) Pdir[i][j] = new double[ETC[0].Length + 4096];
                for (int t = 0; t < ETC[0].Length; t++)
                {
                    Rhino.RhinoApp.CommandPrompt = string.Format("Creating direct sound pressure for receiver {0}. {1}% complete, ", i, Math.Round((double)t / ETC[0].Length * 100));
                    double[] Pmin = Audio.Pach_SP.Filter.Signal(new double[8] { ETC[0][0], ETC[1][0], ETC[2][0], ETC[3][0], ETC[4][0], ETC[5][0], ETC[6][0], ETC[7][0] }, 44100, 4096, 0);
                    //Audio.Pach_SP.Raised_Cosine_Window(ref Pmin);
                    for (int u = 0; u < Pmin.Length; u++)
                    {
                        P[i][t + u] += Pmin[u];// *scale;
                    }

                    double[][] dir_E = new double[6][];
                    for (int d = 0; d < 6; d++) dir_E[d] = new double[8];
                    //double[] totalprms = new double[6];
                    Vector vpos = new Vector(), vneg = new Vector();
                    for (int oct = 0; oct < 8; oct++)
                    {
                        vpos += new Vector(Math.Abs(Dir_Rec_Pos[i][oct][t][0]), Math.Abs(Dir_Rec_Pos[i][oct][t][1]), Math.Abs(Dir_Rec_Pos[i][oct][t][2]));
                        vneg += new Vector(Math.Abs(Dir_Rec_Neg[i][oct][t][0]), Math.Abs(Dir_Rec_Neg[i][oct][t][1]), Math.Abs(Dir_Rec_Neg[i][oct][t][2]));
                    }

                    //6th order normalization:
                    double length = Math.Sqrt(+vpos.x * vpos.x + vneg.x * vneg.x + vpos.y * vpos.y + vneg.y * vneg.y + vpos.z * vpos.z + vneg.z * vneg.z);
                    vpos /= length;
                    vneg /= length;

                    for (int j = 0; j < 3; j++)
                    {
                        for (int k = 0; k < 4096; k++)
                        {
                            int j2 = 2 * j;
                            Pdir[i][j2][t + k] += Pmin[k] * vpos.byint(j);//((double.IsNaN(hist_temp[j2][k])) ? 0: hist_temp[j2][k]);
                            Pdir[i][j2 + 1][t + k] += Pmin[k] * vneg.byint(j);//((double.IsNaN(hist_temp[j2 + 1][k])) ? 0 : hist_temp[j2 + 1][k]);
                        }
                    }
                }
            }
        }