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:
Publicación traducida automáticamente
Artículo escrito por saransh9342 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA