コード例 #1
0
        /// <summary>
        /// BPF от реального массива по строкам
        /// </summary>
        /// <param name="zarray"></param>
        /// <param name="sdvig"></param>   Сдвиг
        /// <returns></returns>
        public static ZComplexDescriptor BPF_Real(ZArrayDescriptor zarray, int sdvig)
        {
            int nx = zarray.width;
            int ny = zarray.height;

            int m  = 1;
            int nn = 2;

            for (int i = 1; ; i++)
            {
                nn = nn * 2; if (nn > nx)
                {
                    m = i; break;
                }
            }
            int n = Convert.ToInt32(Math.Pow(2.0, m));                                  // N=2**m


            // MessageBox.Show("nx: " + nx  + "   m: " + m + "   n: " + n);

            //Complex[] array_exp = P_EXP(m + 1);                             // Экспонента для BPF
            //int[] array_inv = Invers(m, nx);                                // Инверсия элементов массива для БПФ

            Complex[] Array  = new Complex[n];                               // Выходной массив
            Complex[] ArrayX = new Complex[n];                               // Комплексный массив экспоненты сдвига

            for (int i = 0; i < n; i++)
            {
                double a = 2 * Math.PI * sdvig * i / n;
                ArrayX[i] = new Complex(Math.Cos(a), -Math.Sin(a));
            }

            ZComplexDescriptor resultArray = new ZComplexDescriptor(n, ny);  // Re=zArrayPicture Im=0

            for (int j = 0; j < ny; j++)
            {
                for (int i = 0; i < n; i++)
                {
                    Array[i] = new Complex(zarray.array[i, j], 0.0);
                }
                for (int i = 0; i < n; i++)
                {
                    Array[i] = Array[i] * ArrayX[i];
                }
                //Array = BPF_Q(Array, m, array_exp, array_inv);
                Array = Furie.GetFourierTransform(Array, m);
                for (int i = 0; i < n; i++)
                {
                    resultArray.array[i, j] = Array[i];
                }
            }

            return(resultArray);
        }
コード例 #2
0
        public static ZComplexDescriptor Inverse2_BPF(int sdvig, int DX)
        {
            //if (Form1.zComplex[k1] == null) { MessageBox.Show("FurieN zComplex[k2] == NULL"); return null; }


            //int nx = Form1.zArrayPicture.width;
            //if (nx % 2 != 0) nx = nx - 1;                            // n - должно быть четным
            //int ny = 50;
            //nx = 4874;

            int nx = 4096;
            int ny = 200;
            int m  = 1;
            int nn = 2;

            for (int i = 1; ; i++)
            {
                nn = nn * 2; if (nn > nx)
                {
                    m = i; break;
                }
            }
            int n = Convert.ToInt32(Math.Pow(2.0, m));                        // N=2**m

            Complex[] ArrayX = new Complex[nx];                               // Комплексный массив экспоненты сдвига
            Complex[] Array  = new Complex[nx];



            ZComplexDescriptor resultArray = new ZComplexDescriptor(nx, ny);  // Re=zArrayPicture Im=0

            // for (int i = 0; i < nx; i++)
            // {
            //     double a = 2 * Math.PI * sdvig * i / nx;
            //     ArrayX[i] = new Complex(Math.Cos(a), -Math.Sin(a));
            // }

            for (int j = 0; j < ny; j++)                                        // Преобразование Фурье
            {
                for (int i = 0; i < nx; i++)
                {
                    Array[i] = new Complex(Form1.zArrayPicture.array[i, j], 0.0);
                }
                //for (int i = 0; i < nx; i++) { Array[i] = Array[i] * ArrayX[i]; }
                Array = Furie.GetFourierTransform(Array, m);
                for (int i = 0; i < nx; i++)
                {
                    resultArray.array[i, j] = Array[i];
                }
            }

            Complex[] ArrayY = new Complex[nx];
            for (int i = sdvig, j = 0; i < sdvig + DX; i++, j++)
            {
                ArrayY[i] = new Complex(DX - j, DX - j);
            }
            for (int i = sdvig, j = 0; i > sdvig - DX; i--, j++)
            {
                ArrayY[i] = new Complex(DX - j, DX - j);
            }

            //for (int i = sdvig, j = 0; i < sdvig + DX; i++, j++) { ArrayY[nx-i] = new Complex(DX - j, DX - j); }
            //for (int i = sdvig, j = 0; i > sdvig - DX; i--, j++) { ArrayY[nx-i] = new Complex(DX - j, DX - j); }

            //for (int i = nx - DX, k = 0; i < nx; i++, k++) { ArrayY[i] = new Complex(k, 0); }
            //for (int i = 0; i < DX; i++) { ArrayY[i] = ArrayY[i] / DX; }
            //for (int i = nx - DX; i < nx; i++) { ArrayY[i] = ArrayY[i] / DX; }

            //for (int i = 4004; i < 4028; i++) { ArrayY[i] = new Complex(1, 0); }
            //for (int i = nx - DX; i < nx; i++) { Array[i] = new Complex(1, 0); }

            for (int j = 0; j < ny; j++)
            {
                for (int i = 0; i < nx; i++)
                {
                    Array[i] = resultArray.array[i, j] * ArrayY[i];
                }
                //for (int i = 0; i < nx; i++) { Array[i] = resultArray.array[i, j] ; }
                Array = Furie.GetInverseFourierTransform(Array, m);
                for (int i = 0; i < nx; i++)
                {
                    resultArray.array[i, j] = Array[i];
                }
            }

            return(resultArray);
        }