¿Cómo realizar una FFT 2D en el lugar dada una array 2D compleja en Java?

Una transformada rápida de Fourier (FFT) es un algoritmo para calcular la transformada discreta de Fourier (DFT) y su inversa. El análisis de Fourier convierte el tiempo (o el espacio) a la frecuencia y viceversa. FFT reduce el tiempo de cálculo requerido para calcular una transformada de Fourier discreta y mejora el rendimiento en un factor de 100 o más sobre la evaluación directa de DFT. FFT calcula tales transformaciones al factorizar la array DFT en un producto de dispersión.

Aquí usamos una array 2D que nos ayudará a encontrar la transformada rápida de Fourier. Este algoritmo es útil en el reconocimiento de patrones.

Ejemplos

Aporte:

Introduzca el tamaño:  

2

Introduce los elementos:  

2 3

4 2

Producción:

2,5 + 0,0 yo

5,5 + 0,0 yo

-0.5 + -1.8369701987210297E-16 yo

0.5 + -3.0616169978683826E-16 yo

2,5 + 0,0 yo

-0.5 + -3.6739403974420594E-16 yo

-0.5 + -1.8369701987210297E-16 yo

-1.5 + -1.8369701987210297E-16 yo

Aporte:

Introduzca el tamaño:  

2

Introduce los elementos:

5 1

2 1

Producción:

3,0 + 0,0 yo

4,5 + 0,0 yo

2.0 + -6.123233995736766E-17 i

2.5 + -1.2246467991473532E-16 i

3,0 + 0,0 yo

1.5 + -1.8369701987210297E-16 i

2.0 + -6.123233995736766E-17 i

1.5 + -6.123233995736765E-17 yo

Acercarse:

  • Introduzca el tamaño de la array.
  • Tomaremos 4 arreglos de tipo de datos con doble nombre input, realOut, imaginary.
  • Dé la entrada de la array 2D.
  • Ahora llamemos a una función dft , que nos ayudará a calcular
  • Ahora, calcularemos la altura y el ancho de los datos de entrada.
  • Ahora, iteremos la altura y el ancho del ciclo,
  • Ahora, para calcular la DFT , la obtendríamos en términos exponenciales, que se pueden convertir en términos de coseno y seno, que se etiquetan como partes reales e imaginarias. Estos se pueden calcular utilizando estas fórmulas.
  • Iterándolo con alto y ancho calculamos realOut , usando la fórmula:

realOut[y][x]+=(entrada[y1][x1]*Math.cos(2*Math.PI*((1.0*x*x1/ancho)+(1.0*y*y1/alto))) )/Math.sqrt(ancho*alto);

  • De manera similar, obtendremos la salida imaginaria usando esta fórmula:

imagOut[y][x]-=(entrada[y1][x1]*Math.sin(2*Math.PI*((1.0*x*x1/ancho)+(1.0*y*y1/alto))) )/Math.sqrt(ancho*alto);

  • Ahora, imprimiríamos estos valores en forma de   a+ib .

Ejemplo:

Java

// Java program to perform  a 2D FFT Inplace Given a Complex
// 2D Array
 
// Declare the needed libraries
import java.io.*;
import java.util.Scanner;
 
public class GFG {
    public static void main(String[] args)
    {
        // enter the size of the matrix
        System.out.println("Enter the size:");
 
        // declaring the scan element
        Scanner sc = new Scanner(System.in);
        // scan the size of the matrix
        int n = sc.nextInt();
 
        // Declaring the matrices in double datatype
        // Declaring the input variable where we take in the
        // input
        double[][] input = new double[n][n];
 
        // Taking the matrices for real value
        double[][] realOut = new double[n][n];
 
        // Taking the matrices for imaginary output
        double[][] imagOut = new double[n][n];
 
        // Enter the values of elements of the DFT Matrix
        System.out.println("Enter the elements:");
 
        // Taking the input of the array
        // By iterating the two loops
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                input[i][j] = sc.nextDouble();
            }
        }
 
        // Calling the function discrete
        discrete(input, realOut, imagOut);
 
        // Closing  the function scanner
        sc.close();
    }
 
    // Now by taking the discrete function
    // This is the declaration of the function
    // This function includes 4 parameters
    // The parameters are the 4 matrices.
    static void discrete(double[][] input,
                         double[][] realOut,
                         double[][] imagOut)
    {
 
        // Height is the variable of data type int
        // the length of the input variable is stored in
        // variable height
        int height = input.length;
 
        // The input of the first index length is stored in
        // variable width
        int width = input[0].length;
 
        // Iterating the input till height stored in
        // variable y
        for (int y = 0; y < height; y++) {
 
            // Taking the input iterating till width in
            // variable x
            for (int x = 0; x < width; x++) {
 
                // Taking another variable y1 which will be
                // the continuation of
                // the variable y
                // This y1 will be iterating till height
                // This index of the variable starts at 0
                for (int y1 = 0; y1 < height; y1++) {
 
                    // This index x1 iterates till width
                    // This x1 is continuation of x
                    // The variables y1 and x1 are the
                    // continuation of summable of x and y
                    for (int x1 = 0; x1 < width; x1++) {
 
                        // realOut is the variable which
                        // lets us know the real output as
                        // we do te summation of exponential
                        // signal
                        // we get cos as real term and sin
                        // as imaginary term
                        // so taking the consideration of
                        // above properties we write the
                        // formula of real as
                        // summing till x and y and
                        // multiplying it with cos2pie
                        // and then dividing it with width
                        // *height gives us the real term
                        realOut[y][x]
                            += (input[y1][x1]
                                * Math.cos(
                                    2 * Math.PI
                                    * ((1.0 * x * x1
                                        / width)
                                       + (1.0 * y * y1
                                          / height))))
                               / Math.sqrt(width * height);
 
                        // Now imagOut is the imaginary term
                        // That is the sine term
                        // This sine term can be obtained
                        // using sin2pie and then we divide
                        // it using width*height The
                        // formulae is same as real
 
                        imagOut[y][x]
                            -= (input[y1][x1]
                                * Math.sin(
                                    2 * Math.PI
                                    * ((1.0 * x * x1
                                        / width)
                                       + (1.0 * y * y1
                                          / height))))
                               / Math.sqrt(width * height);
                    }
 
                    // Now we will print the value of
                    // realOut and imaginary outputn The
                    // ppoutput of imaginary output will end
                    // with value 'i'.
                    System.out.println(realOut[y][x] + " +"
                                       + imagOut[y][x]
                                       + "i");
                }
            }
        }
    }
}

Producción:
 

Output of 2D FFT Inplace Given a Complex 2D Array

Publicación traducida automáticamente

Artículo escrito por saransh9342 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *