Skip to content

Commit 2ac17fa

Browse files
committed
Add tests for ConvolutionFFT
1 parent 596c614 commit 2ac17fa

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

src/main/java/com/thealgorithms/maths/FFT.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,14 @@ public Complex divide(double n) {
164164
temp.img = this.img / n;
165165
return temp;
166166
}
167+
168+
public double real() {
169+
return real;
170+
}
171+
172+
public double imaginary() {
173+
return img;
174+
}
167175
}
168176

169177
/**
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.thealgorithms.maths;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import java.util.ArrayList;
7+
import org.junit.jupiter.api.Test;
8+
9+
public class ConvolutionFFTTest {
10+
11+
/**
12+
* Helper method to create a complex signal from an array of doubles.
13+
*/
14+
private ArrayList<FFT.Complex> createComplexSignal(double[] values) {
15+
ArrayList<FFT.Complex> signal = new ArrayList<>();
16+
for (double value : values) {
17+
signal.add(new FFT.Complex(value, 0)); // Real part only
18+
}
19+
return signal;
20+
}
21+
22+
/**
23+
* Helper method to compare two complex signals for equality within a small margin of error.
24+
*/
25+
private void assertComplexArrayEquals(ArrayList<FFT.Complex> expected, ArrayList<FFT.Complex> result, double delta) {
26+
assertEquals(expected.size(), result.size(), "Signal lengths are not equal.");
27+
for (int i = 0; i < expected.size(); i++) {
28+
FFT.Complex expectedValue = expected.get(i);
29+
FFT.Complex resultValue = result.get(i);
30+
assertEquals(expectedValue.real(), resultValue.real(), delta, "Real part mismatch at index " + i);
31+
assertEquals(expectedValue.imaginary(), resultValue.imaginary(), delta, "Imaginary part mismatch at index " + i);
32+
}
33+
}
34+
35+
@Test
36+
public void testConvolutionFFTBasic() {
37+
double[] a = {1, 2, 3};
38+
double[] b = {4, 5, 6};
39+
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
40+
ArrayList<FFT.Complex> signalB = createComplexSignal(b);
41+
42+
ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {4, 13, 28, 27, 18}); // Expected output
43+
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);
44+
45+
assertComplexArrayEquals(expected, result, 1e-9); // Allow small margin of error
46+
}
47+
48+
@Test
49+
public void testConvolutionFFTWithZeroElements() {
50+
double[] a = {0, 0, 0};
51+
double[] b = {1, 2, 3};
52+
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
53+
ArrayList<FFT.Complex> signalB = createComplexSignal(b);
54+
55+
ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {0, 0, 0, 0, 0}); // All values should be zero
56+
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);
57+
58+
assertComplexArrayEquals(expected, result, 1e-9);
59+
}
60+
61+
@Test
62+
public void testConvolutionFFTWithDifferentSizes() {
63+
double[] a = {1, 2};
64+
double[] b = {3, 4, 5};
65+
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
66+
ArrayList<FFT.Complex> signalB = createComplexSignal(b);
67+
68+
ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {3, 10, 13, 10});
69+
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);
70+
71+
assertComplexArrayEquals(expected, result, 1e-9);
72+
}
73+
74+
@Test
75+
public void testConvolutionFFTWithSingleElement() {
76+
double[] a = {5};
77+
double[] b = {2};
78+
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
79+
ArrayList<FFT.Complex> signalB = createComplexSignal(b);
80+
81+
ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {10});
82+
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);
83+
84+
assertComplexArrayEquals(expected, result, 1e-9);
85+
}
86+
87+
@Test
88+
public void testConvolutionFFTWithNegativeValues() {
89+
double[] a = {1, -2, 3};
90+
double[] b = {-1, 2, -3};
91+
ArrayList<FFT.Complex> signalA = createComplexSignal(a);
92+
ArrayList<FFT.Complex> signalB = createComplexSignal(b);
93+
94+
ArrayList<FFT.Complex> expected = createComplexSignal(new double[] {-1, 4, -10, 12, -9});
95+
ArrayList<FFT.Complex> result = ConvolutionFFT.convolutionFFT(signalA, signalB);
96+
97+
assertComplexArrayEquals(expected, result, 1e-9);
98+
}
99+
}

0 commit comments

Comments
 (0)