Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions DIRECTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,7 @@
* [CeilTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CeilTest.java)
* [CollatzConjectureTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java)
* [CombinationsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CombinationsTest.java)
* [ConvolutionFFTTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ConvolutionFFTTest.java)
* [CrossCorrelationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CrossCorrelationTest.java)
* [DeterminantOfMatrixTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DeterminantOfMatrixTest.java)
* [DigitalRootTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/DigitalRootTest.java)
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/thealgorithms/maths/FFT.java
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,14 @@ public Complex divide(double n) {
temp.img = this.img / n;
return temp;
}

public double real() {
return real;
}

public double imaginary() {
return img;
}
}

/**
Expand Down
98 changes: 98 additions & 0 deletions src/test/java/com/thealgorithms/maths/ConvolutionFFTTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package com.thealgorithms.maths;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.ArrayList;
import org.junit.jupiter.api.Test;

public class ConvolutionFFTTest {

/**
* Helper method to create a complex signal from an array of doubles.
*/
private ArrayList<FFT.Complex> createComplexSignal(double[] values) {
ArrayList<FFT.Complex> signal = new ArrayList<>();
for (double value : values) {
signal.add(new FFT.Complex(value, 0));
}
return signal;
}

/**
* Helper method to compare two complex signals for equality within a small margin of error.
*/
private void assertComplexArrayEquals(ArrayList<FFT.Complex> expected, ArrayList<FFT.Complex> result, double delta) {
assertEquals(expected.size(), result.size(), "Signal lengths are not equal.");
for (int i = 0; i < expected.size(); i++) {
FFT.Complex expectedValue = expected.get(i);
FFT.Complex resultValue = result.get(i);
assertEquals(expectedValue.real(), resultValue.real(), delta, "Real part mismatch at index " + i);
assertEquals(expectedValue.imaginary(), resultValue.imaginary(), delta, "Imaginary part mismatch at index " + i);
}
}

@Test
public void testConvolutionFFTBasic() {
double[] a = {1, 2, 3};
double[] b = {4, 5, 6};
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
ArrayList<FFT.Complex> signalB = createComplexSignal(b);

ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {4, 13, 28, 27, 18}); // Expected output
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);

assertComplexArrayEquals(expected, result, 1e-9); // Allow small margin of error
}

@Test
public void testConvolutionFFTWithZeroElements() {
double[] a = {0, 0, 0};
double[] b = {1, 2, 3};
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
ArrayList<FFT.Complex> signalB = createComplexSignal(b);

ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {0, 0, 0, 0, 0}); // All values should be zero
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);

assertComplexArrayEquals(expected, result, 1e-9);
}

@Test
public void testConvolutionFFTWithDifferentSizes() {
double[] a = {1, 2};
double[] b = {3, 4, 5};
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
ArrayList<FFT.Complex> signalB = createComplexSignal(b);

ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {3, 10, 13, 10});
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);

assertComplexArrayEquals(expected, result, 1e-9);
}

@Test
public void testConvolutionFFTWithSingleElement() {
double[] a = {5};
double[] b = {2};
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
ArrayList<FFT.Complex> signalB = createComplexSignal(b);

ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {10});
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);

assertComplexArrayEquals(expected, result, 1e-9);
}

@Test
public void testConvolutionFFTWithNegativeValues() {
double[] a = {1, -2, 3};
double[] b = {-1, 2, -3};
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
ArrayList<FFT.Complex> signalB = createComplexSignal(b);

ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {-1, 4, -10, 12, -9});
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);

assertComplexArrayEquals(expected, result, 1e-9);
}
}