Java jtransforms做简单fft变换

it2026-09-03  1

问题:

最近项目上有个需求,需要使用java来做FFT变换,考虑到自己编写FFT函数容易出错,在Maven里面找到了一个FFT框架,在此对其用法做简单的介绍,并使用matlab做简单的对比测试。

Jtransform依赖: <dependency> <groupId>com.github.rwl</groupId> <artifactId>jtransforms</artifactId> <version>2.4.0</version> </dependency> Jtransform 在线API http://wendykierp.github.io/JTransforms/apidocs/ 有问题查API,不过API写得不是非常清楚Java代码 import edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D; //apidoc //http://wendykierp.github.io/JTransforms/apidocs/ public class Main { public static void main(String[] args) { System.out.println("FFTW"); //要变换的长度,传入的参数为后面传入数组a长度的一半 DoubleFFT_1D fft = new DoubleFFT_1D(10); //变换的数,结果也是存在这个里面分别是虚数和实数 double[] a = new double[20]; int num = 1; for(int i = 0; i < a.length; i += 2){ a[i] = num; num++; } System.out.println(); System.out.println("Before fftw"); for(int i = 0; i < a.length; i++){ System.out.print(a[i] + " "); } fft.complexForward(a); System.out.println("After fftw"); for(int i = 0; i < a.length; i++){ System.out.print(a[i] + " "); } } } Java运行结果 Matlab对比

同样,给出二维FFT的代码和验证

public static void testFFT_2D(){ System.out.println("FFT2D"); //row和后面的数组长度一样 columns为传入数组长度的一半 DoubleFFT_2D fft = new DoubleFFT_2D(10, 10); double[][] a = new double[10][20]; for(int i = 0; i < a.length; i++){ int cnt = 1; for(int j = 0; j < a[0].length; j+=2){ a[i][j] = cnt; cnt++; } } for(int i = 0; i < a.length; i++){ for(int j = 0; j < a[0].length; j++){ System.out.print(a[i][j] + " "); } System.out.println(); } fft.complexForward(a); for(int i = 0; i < a.length; i++){ for(int j = 0; j < a[0].length; j++){ System.out.print(a[i][j] + " "); } System.out.println(); } }

输出如下:

matlab命令行如下: 结果如下: 可以看到,后面在Matlab的结果里面都是0,Java的FFT里面到了10e-15这个数量级,也是吻合的。

最新回复(0)