Java 实现 傅立叶变换
时间: 2023-11-14 21:07:48 浏览: 36
以下是 Java 中实现离散傅里叶变换(DFT)的示例代码:
```java
public class FourierTransform {
public static Complex[] dft(double[] x) {
int n = x.length;
Complex[] X = new Complex[n];
for (int k = 0; k < n; k++) {
X[k] = new Complex(0, 0);
for (int i = 0; i < n; i++) {
double angle = 2 * Math.PI * i * k / n;
X[k] = X[k].plus(new Complex(x[i] * Math.cos(angle), -x[i] * Math.sin(angle)));
}
}
return X;
}
}
class Complex {
private final double re;
private final double im;
public Complex(double real, double imag) {
re = real;
im = imag;
}
public Complex plus(Complex b) {
double real = re + b.re;
double imag = im + b.im;
return new Complex(real, imag);
}
}
```
在这个示例中,我们首先定义了一个 `dft` 方法,该方法接受一个 `double` 数组 `x` 作为输入,并返回一个 `Complex` 数组 `X`。该方法使用双重循环来计算每个频率的离散傅里叶变换,并将结果存储在 `X` 数组中。
我们还定义了一个 `Complex` 类,用于表示复数。该类具有两个成员变量,`re` 表示实部,`im` 表示虚部。我们还定义了一个 `plus` 方法,该方法将两个复数相加,并返回一个新的 `Complex` 实例。
要使用这个示例代码进行傅里叶变换,您可以按照以下步骤操作:
1. 创建一个 `double` 数组 `x`,该数组包含要进行傅里叶变换的数据。
2. 调用 `dft` 方法,将 `x` 数组作为输入,返回一个 `Complex` 数组 `X`。
3. `X` 数组的每个元素表示一个频率。您可以使用 `re` 和 `im` 方法获取每个频率的实部和虚部。
以下是一个简单的示例,演示如何使用这个示例代码计算傅里叶变换:
```java
public class Main {
public static void main(String[] args) {
double[] x = {1, 2, 3, 4};
Complex[] X = FourierTransform.dft(x);
for (int k = 0; k < X.length; k++) {
System.out.println("X[" + k + "] = " + X[k].re + " + " + X[k].im + "i");
}
}
}
```
在这个示例中,我们创建了一个 `double` 数组 `x`,其中包含四个数据点。我们使用 `dft` 方法计算 `x` 的离散傅里叶变换,并将结果存储在 `X` 数组中。我们使用一个循环遍历 `X` 数组中的每个元素,并使用 `re` 和 `im` 方法打印每个频率的实部和虚部。
输出应该如下所示:
```
X[0] = 10.0 + 0.0i
X[1] = -2.0 + 2.0i
X[2] = 0.0 + 0.0i
X[3] = -2.0 - 2.0i
```
这意味着,对于这个示例中的四个数据点,其离散傅里叶变换包含四个频率,分别是 0Hz、0.25Hz、0.5Hz 和 0.75Hz。第一个频率的幅度为 10,其余三个频率的幅度为 2。第二个和第四个频率的相位差为 90 度,表示它们是正弦波和余弦波。