Beispiel #1
0
                public static void OptimizeIIR(Complex[] Spectrum, int Filter_Order, int Sample_Freq, out Complex[] a, out Complex[] b)
                {
                    IIR_Spectrum_Objective obj = new IIR_Spectrum_Objective(Filter_Order, Spectrum, Sample_Freq);

                    //LibOptimization.Optimization.clsOptRealGAREX SA = new LibOptimization.Optimization.clsOptRealGAREX(obj);
                    LibOptimization.Optimization.clsOptRealGABLX SA = new LibOptimization.Optimization.clsOptRealGABLX(obj);
                    //SA.UseEliteStrategy(10);
                    //SA.PARAM_PopulationSize = Filter_Order * 50;

                    SA.PARAM_InitRange    = 1;
                    SA.PARAM_ChildrenSize = 20;
                    //SA.PARAM_MAX_ITERATION = 1000;
                    SA.Init();
                    SA.DoIteration();

                    Filter_Order = obj.pzct;

                    //Complex[] p = new Complex[(int)Math.Floor((double)SA.Result.Count / 4)];
                    //Complex[] z = new Complex[(int)Math.Ceiling((double)SA.Result.Count / 4)];
                    Complex[] p = new Complex[Filter_Order];
                    Complex[] z = new Complex[Filter_Order];

                    int pzct           = Filter_Order;
                    int pno_conj       = (int)Math.Floor((double)pzct / 2);
                    int pno_conj_phase = pno_conj - obj.pole_phase.Length;
                    int pno_real       = pzct % 2;
                    int zno_real       = pzct;

                    for (int i = 0; i < obj.pole_phase.Length; i++)
                    {
                        p[2 * i]     = Complex.FromPolarCoordinates(SA.Result[i], obj.pole_phase[i]);
                        p[2 * i + 1] = Complex.Conjugate(p[2 * i]);
                    }
                    for (int i = 0; i < pno_conj_phase; i++)
                    {
                        p[2 * i + obj.pole_phase.Length]     = Complex.FromPolarCoordinates(SA.Result[obj.pole_phase.Length + 2 * i], SA.Result[obj.pole_phase.Length + 2 * i + 1] * Math.PI * 2);
                        p[2 * i + obj.pole_phase.Length + 1] = Complex.Conjugate(p[i]);
                    }
                    for (int i = 0; i < pno_real; i++)
                    {
                        p[i + pno_conj] = SA.Result[pno_conj + pno_conj_phase + i];
                    }

                    for (int i = 0; i < zno_real; i++)
                    {
                        z[i] = SA.Result[pno_conj + pno_conj_phase + pno_real + i];
                    }

                    //for (int i = 0; i < p.Length; i++) p[i] = Complex.FromPolarCoordinates(SA.Result[2 * i], SA.Result[2 * i + 1] * Math.PI * 2);
                    //for (int i = p.Length; i < 2 * p.Length; i++) z[i-p.Length] = Complex.FromPolarCoordinates(SA.Result[2 * i], SA.Result[2 * i + 1] * Math.PI * 2);
                    PZ2AB(p, z, 1, out a, out b);

                    //Normalize
                    //Complex[] spec = SpectrumFromIIR(a, b, Sample_Freq, Spectrum.Length);
                    //double ms = 0;
                    //foreach (Complex s in spec) ms = ((ms > s.Magnitude) ? ms : s.Magnitude);
                    //double mb = 0;
                    //foreach (Complex s in Spectrum) mb = ((mb > s.Magnitude) ? mb : s.Magnitude);

                    //b[0] *= mb / ms;
                }
                public static void OptimizeIIR(Complex[] Spectrum, int Filter_Order, int Sample_Freq, out Complex[] a, out Complex[] b)
                {
                    IIR_Spectrum_Objective obj = new IIR_Spectrum_Objective(Filter_Order, Spectrum, Sample_Freq);
                    //LibOptimization.Optimization.clsOptRealGAREX SA = new LibOptimization.Optimization.clsOptRealGAREX(obj);
                    LibOptimization.Optimization.clsOptRealGABLX SA = new LibOptimization.Optimization.clsOptRealGABLX(obj);
                    //SA.UseEliteStrategy(10);
                    //SA.PARAM_PopulationSize = Filter_Order * 50;

                    SA.PARAM_InitRange = 1;
                    SA.PARAM_ChildrenSize = 20;
                    //SA.PARAM_MAX_ITERATION = 1000;
                    SA.Init();
                    SA.DoIteration();

                    Filter_Order = obj.pzct;

                    //Complex[] p = new Complex[(int)Math.Floor((double)SA.Result.Count / 4)];
                    //Complex[] z = new Complex[(int)Math.Ceiling((double)SA.Result.Count / 4)];
                    Complex[] p = new Complex[Filter_Order];
                    Complex[] z = new Complex[Filter_Order];

                    int pzct = Filter_Order;
                    int pno_conj = (int)Math.Floor((double)pzct / 2);
                    int pno_conj_phase = pno_conj - obj.pole_phase.Length;
                    int pno_real = pzct % 2;
                    int zno_real = pzct;

                    for (int i = 0; i < obj.pole_phase.Length; i++)
                    {
                        p[2 * i] = Complex.FromPolarCoordinates(SA.Result[i], obj.pole_phase[i]);
                        p[2 * i + 1] = Complex.Conjugate(p[2*i]);
                    }
                    for (int i = 0; i < pno_conj_phase; i++)
                    {
                        p[2 * i + obj.pole_phase.Length] = Complex.FromPolarCoordinates(SA.Result[obj.pole_phase.Length + 2 * i], SA.Result[obj.pole_phase.Length + 2 * i + 1] * Math.PI * 2);
                        p[2 * i + obj.pole_phase.Length + 1] = Complex.Conjugate(p[i]);
                    }
                    for (int i = 0; i < pno_real; i++)
                    {
                        p[i + pno_conj] = SA.Result[pno_conj + pno_conj_phase + i];
                    }

                    for (int i = 0; i < zno_real; i++)
                    {
                        z[i] = SA.Result[pno_conj + pno_conj_phase + pno_real + i];
                    }
                    
                    //for (int i = 0; i < p.Length; i++) p[i] = Complex.FromPolarCoordinates(SA.Result[2 * i], SA.Result[2 * i + 1] * Math.PI * 2);
                    //for (int i = p.Length; i < 2 * p.Length; i++) z[i-p.Length] = Complex.FromPolarCoordinates(SA.Result[2 * i], SA.Result[2 * i + 1] * Math.PI * 2);
                    PZ2AB(p, z, 1, out a, out b);

                    //Normalize
                    //Complex[] spec = SpectrumFromIIR(a, b, Sample_Freq, Spectrum.Length);
                    //double ms = 0;
                    //foreach (Complex s in spec) ms = ((ms > s.Magnitude) ? ms : s.Magnitude);
                    //double mb = 0;
                    //foreach (Complex s in Spectrum) mb = ((mb > s.Magnitude) ? mb : s.Magnitude);

                    //b[0] *= mb / ms;
                }