public Smart_Material(List<AbsorptionModels.ABS_Layer> Layers, int Samplefreq, double Air_Density, double SoundSpeed, Finite_Field_Impedance Zr, double step, int Averaging_Choice, int Zf_incorp_Choice) { Buildup = Layers; Fs = Samplefreq; rho = Air_Density; c = SoundSpeed; int min_freq = Samplefreq / 4096; if (Layers.Count < 1) return; //the current version... Z = AbsorptionModels.Operations.Recursive_Transfer_Matrix(false, 10000, 343, Layers, ref frequency, ref Angles); //the goal... //Z = AbsorptionModels.Operations.Transfer_Matrix_Explicit_Alpha(false, true, 44100, 343, Layers, ref frequency, ref Angles); //////////////////Radiation Impedance/////////////////////// double[] a_real = new double[Angles.Length]; //prop; for (int i = 0; i < Angles.Length; i++) a_real[i] = Angles[i].Real; double[][] Angular_Absorption; System.Numerics.Complex [][] Zr_interp = Zr.Interpolate(frequency); if (Zf_incorp_Choice == 0) { Reflection_Coefficient = Pachyderm_Acoustic.AbsorptionModels.Operations.Reflection_Coef(Z, Air_Density, SoundSpeed); //No defined way to build a complex finite reflection coefficient. Angular_Absorption = Pachyderm_Acoustic.AbsorptionModels.Operations.Finite_Unit_Absorption_Coefficient(Zr_interp, Z, a_real, rho, 343); } else if (Zf_incorp_Choice == 1) { Reflection_Coefficient = Pachyderm_Acoustic.AbsorptionModels.Operations.Reflection_Coef(Z, Zr_interp, Air_Density, SoundSpeed); //No defined way to build a complex finite reflection coefficient. Angular_Absorption = Pachyderm_Acoustic.AbsorptionModels.Operations.Absorption_Coef(Reflection_Coefficient); } else throw new Exception("Field Impedance Incorporation choice not valid or not implemented..."); Transfer_FunctionR = new MathNet.Numerics.Interpolation.CubicSpline[Angles.Length / 2]; Transfer_FunctionI = new MathNet.Numerics.Interpolation.CubicSpline[Angles.Length / 2]; for( int i = 0; i < Reflection_Coefficient.Length / 2; i++) { List<double> real = new List<double>(), imag = new List<double>(); for(int j = 0; j < Reflection_Coefficient[i].Length; j++) { real.Add(Reflection_Coefficient[i][j].Real); imag.Add(Reflection_Coefficient[i][j].Imaginary); } Transfer_FunctionR[Angles.Length/2 - i - 1] = MathNet.Numerics.Interpolation.CubicSpline.InterpolateAkima(frequency, real); Transfer_FunctionI[Angles.Length/2 - i - 1] = MathNet.Numerics.Interpolation.CubicSpline.InterpolateAkima(frequency, imag); } double[] RI_Averages; if (Averaging_Choice == 0) if (Zf_incorp_Choice == 0) RI_Averages = AbsorptionModels.Operations.Random_Incidence_Paris(Angular_Absorption, Zr_interp, SoundSpeed*Air_Density); else RI_Averages = AbsorptionModels.Operations.Random_Incidence_Paris_Finite(Angular_Absorption); else if(Averaging_Choice == 1) if (Zf_incorp_Choice == 0) RI_Averages = AbsorptionModels.Operations.Random_Incidence_0_78(Angular_Absorption, Zr_interp, SoundSpeed * Air_Density); else RI_Averages = AbsorptionModels.Operations.Random_Incidence_0_78(Angular_Absorption); else if (Averaging_Choice == 2) if (Zf_incorp_Choice == 0) RI_Averages = AbsorptionModels.Operations.Random_Incidence_NoWeights(Angular_Absorption, Zr_interp, SoundSpeed * Air_Density); else RI_Averages = AbsorptionModels.Operations.Random_Incidence_NoWeights(Angular_Absorption); else throw new Exception("Averaging choice not valid or not implemented..."); NI_Coef = Angular_Absorption[18]; Ang_Coef_Oct = new double[8][]; //5 degree increments, in radians... angle_incr = 5 * Math.PI / 180; double root2 = Math.Sqrt(2); int f = -1; for (int oct = 0; oct < 8; oct++) { double f_center = 62.5 * Math.Pow(2, oct); double f_lower = (int)((Math.Floor(f_center / root2)));// - min_freq)/df); double f_upper = (int)((Math.Floor(f_center * root2)));// - min_freq)/df); int f_id_l = 0;//(int)Math.Floor((double)((f_lower) / 5)); for(int i = 0; i < frequency.Length; i++) { if (frequency[i] < f_lower) f_id_l = i; else break; } int f_id_u;//(int)Math.Floor((double)((f_upper) / 5)); for (f_id_u = f_id_l; f_id_u < frequency.Length; f_id_u++) { if (frequency[f_id_u] > f_upper) break; } int count = 0; int RI_count = 0; Ang_Coef_Oct[oct] = new double[Angles.Length]; int[] fct = new int[Angular_Absorption.Length]; do { f++; RI_count++; if (f < f_id_l) { f++; continue; } if (f >= frequency.Length) break; RI_Coef[oct] += RI_Averages[f]; for (int a = 0; a < 19; a++) { if (double.IsNaN(Angular_Absorption[a][f])) continue; fct[a]++; count++; Ang_Coef_Oct[oct][a] += Angular_Absorption[a][f]; } for (int a = 19; a < Angles.Length; a++) { if (double.IsNaN(Angular_Absorption[35 - a][f])) continue; fct[a]++; count++; Ang_Coef_Oct[oct][a] += Angular_Absorption[35 - a][f]; } } while (frequency[f] < f_upper); for (int a = 0; a < Angles.Length; a++) Ang_Coef_Oct[oct][a] /= fct[a]; RI_Coef[oct] /=RI_count; } }
public Smart_Material(bool Trans, List <AbsorptionModels.ABS_Layer> Layers, int Samplefreq, double Air_Density, double SoundSpeed, Finite_Field_Impedance Zr, double step, int Averaging_Choice, int Zf_incorp_Choice) { Buildup = Layers; Fs = Samplefreq; rho = Air_Density; c = SoundSpeed; int min_freq = Samplefreq / 4096; if (Layers.Count < 1) { return; } //the current version... //Z = AbsorptionModels.Operations.Recursive_Transfer_Matrix(false, 10000, 343, Layers, ref frequency, ref Angles); //the goal... if (Trans) { Z = AbsorptionModels.Operations.Transfer_Matrix_Explicit_Tau(false, 44100, 343, Layers, ref frequency, ref Angles, ref Trans_Loss, ref Reflection_Coefficient); Trans_Coefficient = new System.Numerics.Complex[Trans_Loss.Length][]; for (int i = 0; i < Trans_Loss.Length; i++) { Trans_Coefficient[i] = new System.Numerics.Complex[Trans_Loss[i].Length]; for (int j = 0; j < Trans_Coefficient[i].Length; j++) { Trans_Coefficient[i][j] = Trans_Loss[i][j] * Trans_Loss[i][j]; } } } else { Z = AbsorptionModels.Operations.Transfer_Matrix_Explicit_Z(false, 44100, 343, Layers, ref frequency, ref Angles); } //////////////////Radiation Impedance/////////////////////// double[] a_real = new double[Angles.Length]; //prop; for (int i = 0; i < Angles.Length; i++) { a_real[i] = Angles[i].Real; } double[][] Angular_Absorption; System.Numerics.Complex [][] Zr_interp = Zr.Interpolate(frequency); if (Zf_incorp_Choice == 0) { Reflection_Coefficient = Pachyderm_Acoustic.AbsorptionModels.Operations.Reflection_Coef(Z, Air_Density, SoundSpeed); //No defined way to build a complex finite reflection coefficient. Angular_Absorption = Pachyderm_Acoustic.AbsorptionModels.Operations.Finite_Unit_Absorption_Coefficient(Zr_interp, Z, a_real, rho, 343); } else if (Zf_incorp_Choice == 1) { Reflection_Coefficient = Pachyderm_Acoustic.AbsorptionModels.Operations.Reflection_Coef(Z, Zr_interp, Air_Density, SoundSpeed); //No defined way to build a complex finite reflection coefficient. Angular_Absorption = Pachyderm_Acoustic.AbsorptionModels.Operations.Absorption_Coef(Reflection_Coefficient); } else { throw new Exception("Field Impedance Incorporation choice not valid or not implemented..."); } Transfer_FunctionR = new MathNet.Numerics.Interpolation.CubicSpline[Angles.Length / 2]; Transfer_FunctionI = new MathNet.Numerics.Interpolation.CubicSpline[Angles.Length / 2]; for (int i = 0; i < Reflection_Coefficient.Length / 2; i++) { List <double> real = new List <double>(), imag = new List <double>(); for (int j = 0; j < Reflection_Coefficient[i].Length; j++) { real.Add(Reflection_Coefficient[i][j].Real); imag.Add(Reflection_Coefficient[i][j].Imaginary); } Transfer_FunctionR[Angles.Length / 2 - i - 1] = MathNet.Numerics.Interpolation.CubicSpline.InterpolateAkima(frequency, real); Transfer_FunctionI[Angles.Length / 2 - i - 1] = MathNet.Numerics.Interpolation.CubicSpline.InterpolateAkima(frequency, imag); } double[] RI_Averages; if (Averaging_Choice == 0) { if (Zf_incorp_Choice == 0) { RI_Averages = AbsorptionModels.Operations.Random_Incidence_Paris(Angular_Absorption, Zr_interp, SoundSpeed * Air_Density); } else { RI_Averages = AbsorptionModels.Operations.Random_Incidence_Paris_Finite(Angular_Absorption); } } else if (Averaging_Choice == 1) { if (Zf_incorp_Choice == 0) { RI_Averages = AbsorptionModels.Operations.Random_Incidence_0_78(Angular_Absorption, Zr_interp, SoundSpeed * Air_Density); } else { RI_Averages = AbsorptionModels.Operations.Random_Incidence_0_78(Angular_Absorption); } } else if (Averaging_Choice == 2) { if (Zf_incorp_Choice == 0) { RI_Averages = AbsorptionModels.Operations.Random_Incidence_NoWeights(Angular_Absorption, Zr_interp, SoundSpeed * Air_Density); } else { RI_Averages = AbsorptionModels.Operations.Random_Incidence_NoWeights(Angular_Absorption); } } else { throw new Exception("Averaging choice not valid or not implemented..."); } NI_Coef = Angular_Absorption[18]; Ang_Coef_Oct = new double[8][]; //5 degree increments, in radians... angle_incr = 5 * Math.PI / 180; double root2 = Math.Sqrt(2); int f = -1; for (int oct = 0; oct < 8; oct++) { double f_center = 62.5 * Math.Pow(2, oct); double f_lower = (int)((Math.Floor(f_center / root2))); // - min_freq)/df); double f_upper = (int)((Math.Floor(f_center * root2))); // - min_freq)/df); int f_id_l = 0; //(int)Math.Floor((double)((f_lower) / 5)); for (int i = 0; i < frequency.Length; i++) { if (frequency[i] < f_lower) { f_id_l = i; } else { break; } } int f_id_u;//(int)Math.Floor((double)((f_upper) / 5)); for (f_id_u = f_id_l; f_id_u < frequency.Length; f_id_u++) { if (frequency[f_id_u] > f_upper) { break; } } int count = 0; int RI_count = 0; Ang_Coef_Oct[oct] = new double[Angles.Length]; int[] fct = new int[Angular_Absorption.Length]; do { f++; RI_count++; if (f < f_id_l) { f++; continue; } if (f >= frequency.Length) { break; } RI_Coef[oct] += RI_Averages[f]; for (int a = 0; a < 19; a++) { if (double.IsNaN(Angular_Absorption[a][f])) { continue; } fct[a]++; count++; Ang_Coef_Oct[oct][a] += Angular_Absorption[a][f]; } for (int a = 19; a < Angles.Length; a++) { if (double.IsNaN(Angular_Absorption[35 - a][f])) { continue; } fct[a]++; count++; Ang_Coef_Oct[oct][a] += Angular_Absorption[35 - a][f]; } } while (frequency[f] < f_upper); for (int a = 0; a < Angles.Length; a++) { Ang_Coef_Oct[oct][a] /= fct[a]; } RI_Coef[oct] /= RI_count; } }