Skip to content

Commit ecee4aa

Browse files
committed
CON-618 #time 4h first commit of new unit test for filters
1 parent aa2ad16 commit ecee4aa

1 file changed

Lines changed: 227 additions & 0 deletions

File tree

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
package com.shimmerresearch.algorithms;
2+
3+
import static org.junit.Assert.assertTrue;
4+
5+
import java.io.BufferedReader;
6+
import java.io.BufferedWriter;
7+
import java.io.FileInputStream;
8+
import java.io.FileWriter;
9+
import java.io.IOException;
10+
import java.io.InputStreamReader;
11+
12+
import org.junit.FixMethodOrder;
13+
import org.junit.Test;
14+
import org.junit.runners.MethodSorters;
15+
16+
/**
17+
* @author Mark Nolan, Ruaidhri Molloy
18+
*
19+
*/
20+
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
21+
public class API_00002_Filters {
22+
23+
private static final boolean REPLACE_REFERENCE_CSVS = false;
24+
25+
/**
26+
* Passes invalid configuration into the filter initialisation in order to throw an error.
27+
*/
28+
@Test
29+
public void Test_001_InvalidFilterConfig() {
30+
try {
31+
Filter filter = new Filter(Filter.LOW_PASS, 50.0, new double[]{75});
32+
assertTrue("Shouldn't get to this line", false);
33+
} catch (Exception e) {
34+
System.out.println("Test correctly threw an error");
35+
}
36+
}
37+
38+
/**
39+
* Basic low-pass filter test
40+
*/
41+
@Test
42+
public void Test_002_LowPass() {
43+
String testId = "Test_002";
44+
int filterType = Filter.LOW_PASS;
45+
double samplingRate = 1024.0;
46+
double[] cornerFrequency = { 10 };
47+
int nTaps = 200;
48+
49+
String sourceCsv = "S:/Applications Team/Resources/Data Repository/JUnitTests/Shimmer-Java-Android-API/API_00002_Filters/WhiteNoise_001.csv";
50+
String referenceCsv = "S:/Applications Team/Resources/Data Repository/JUnitTests/Shimmer-Java-Android-API/API_00002_Filters/Reference/" + testId + ".csv";
51+
52+
runTestCommon(testId, sourceCsv, referenceCsv, filterType, samplingRate, cornerFrequency, nTaps);
53+
}
54+
55+
/**
56+
* Basic high-pass filter test
57+
*/
58+
@Test
59+
public void Test_003_HighPass() {
60+
String testId = "Test_003";
61+
int filterType = Filter.HIGH_PASS;
62+
double samplingRate = 1024.0;
63+
double[] cornerFrequency = { 400 };
64+
int nTaps = 200;
65+
66+
String sourceCsv = "S:/Applications Team/Resources/Data Repository/JUnitTests/Shimmer-Java-Android-API/API_00002_Filters/WhiteNoise_001.csv";
67+
String referenceCsv = "S:/Applications Team/Resources/Data Repository/JUnitTests/Shimmer-Java-Android-API/API_00002_Filters/Reference/" + testId + ".csv";
68+
69+
runTestCommon(testId, sourceCsv, referenceCsv, filterType, samplingRate, cornerFrequency, nTaps);
70+
}
71+
72+
private void runTestCommon(String testId, String sourceCsv, String referenceCsv, int filterType, double samplingRate, double[] cornerFrequency, int nTaps) {
73+
System.out.println("\n ------------------- " + testId + " start -------------------\n");
74+
75+
printTestDetails(filterType, samplingRate, cornerFrequency, nTaps);
76+
77+
System.out.println("Test steps:");
78+
try {
79+
System.out.println("\t1) Loading source CSV");
80+
double[][] sourceCsvArray = csvToDoubleArray(sourceCsv, 0);
81+
if(sourceCsvArray==null) {
82+
assertTrue("dataArray is null", false);
83+
}
84+
double[] sourceSignal = sourceCsvArray[0];
85+
86+
System.out.println("\t2) Initialising the filter");
87+
Filter filter = new Filter(filterType, samplingRate, cornerFrequency, nTaps);
88+
89+
System.out.println("\t3) Filtering the data");
90+
double[] filteredSignal = filter.filterData(sourceSignal);
91+
92+
if(REPLACE_REFERENCE_CSVS) {
93+
System.out.println("\tReplacing the reference CSV");
94+
saveReferenceCsv(referenceCsv, filteredSignal);
95+
}
96+
97+
System.out.println("\t4) Loading reference CSV");
98+
double[][] referenceCsvArray = csvToDoubleArray(referenceCsv, 0);
99+
double[] referenceSignal = referenceCsvArray[0];
100+
101+
System.out.println("\t5) Comparing the filtered array vs. the reference array");
102+
compareDoubleArrays(filteredSignal, referenceSignal);
103+
} catch (Exception e) {
104+
e.printStackTrace();
105+
assertTrue("Error parsing the source CSV", false);
106+
}
107+
108+
System.out.println("\n ------------------- " + testId + " end -------------------\n");
109+
}
110+
111+
112+
private void printTestDetails(int filterType, double samplingRate, double[] cornerFrequency, int nTaps) {
113+
String filterTypeStr = "";
114+
if(filterType==Filter.LOW_PASS) {
115+
filterTypeStr = "Low-pass";
116+
} else if(filterType==Filter.HIGH_PASS) {
117+
filterTypeStr = "High-pass";
118+
} else if(filterType==Filter.BAND_PASS) {
119+
filterTypeStr = "Band-pass";
120+
} else if(filterType==Filter.BAND_STOP) {
121+
filterTypeStr = "Band-stop";
122+
}
123+
124+
String cornerFreqs = "{";
125+
for(int i=0;i<cornerFrequency.length;i++) {
126+
cornerFreqs += String.valueOf(cornerFrequency[i]);
127+
if(i<cornerFrequency.length-1) {
128+
cornerFreqs += ", ";
129+
}
130+
}
131+
cornerFreqs += "}";
132+
133+
System.out.println("Filter Type = " + filterTypeStr
134+
+ "\nSampling Rate = " + samplingRate
135+
+ "\nCorner Freq(s) = " + cornerFreqs
136+
+ "\nOrder = " + nTaps);
137+
}
138+
139+
private void compareDoubleArrays(double[] filteredSignal, double[] referenceSignal) {
140+
if(filteredSignal==null || referenceSignal==null) {
141+
assertTrue("An array is null", false);
142+
}
143+
if(filteredSignal.length!=referenceSignal.length) {
144+
assertTrue("Array lengths are not equal", false);
145+
}
146+
147+
for(int i=0;i<referenceSignal.length;i++) {
148+
assertTrue("Arrays are not equal at index:" + i, filteredSignal[i]==referenceSignal[i]);
149+
}
150+
}
151+
152+
private void saveReferenceCsv(String referenceCsv, double[] filteredSignal) {
153+
FileWriter fw = null;
154+
try {
155+
fw = new FileWriter(referenceCsv, false);
156+
} catch (IOException ioe) {
157+
ioe.printStackTrace();
158+
}
159+
160+
BufferedWriter bw = new BufferedWriter(fw);
161+
String tempStr = "";
162+
try {
163+
for (double d:filteredSignal) {
164+
tempStr = String.valueOf(d);
165+
bw.write(tempStr);
166+
bw.newLine();
167+
}
168+
bw.close();
169+
} catch (IOException ioe) {
170+
ioe.printStackTrace();
171+
}
172+
}
173+
174+
private double[][] csvToDoubleArray(String csvFile, int qtyHeaderLines) throws Exception {
175+
double[][] dataArray = null;
176+
177+
BufferedReader br = null;
178+
try {
179+
FileInputStream fIn = new FileInputStream(csvFile);
180+
br = new BufferedReader(new InputStreamReader(fIn));
181+
String line = "";
182+
183+
int lineCount = 0;
184+
int colCount = 0;
185+
//count Lines
186+
while ((line = br.readLine()) != null) {
187+
lineCount++;
188+
//Pick a line after the header lines to detect the number of channels
189+
if(lineCount==qtyHeaderLines+1) {
190+
String[] data = line.split(",");
191+
colCount = data.length;
192+
}
193+
}
194+
195+
lineCount-=qtyHeaderLines;
196+
197+
// "reset" to beginning of file (discard old buffered reader)
198+
fIn.getChannel().position(0);
199+
br = new BufferedReader(new InputStreamReader(fIn));
200+
201+
dataArray = new double[colCount][lineCount];
202+
203+
lineCount = 0;
204+
while ((line = br.readLine()) != null) {
205+
if(lineCount>=qtyHeaderLines) {
206+
String[] data = line.split(",");
207+
for(int i=0;i<data.length;i++) {
208+
String d = data[i];
209+
dataArray[i][lineCount-qtyHeaderLines] = Double.parseDouble(d);
210+
}
211+
}
212+
lineCount++;
213+
214+
}
215+
} catch (Exception e) {
216+
e.printStackTrace();
217+
throw(e);
218+
} finally {
219+
if(br!=null) {
220+
br.close();
221+
}
222+
}
223+
224+
return dataArray;
225+
}
226+
227+
}

0 commit comments

Comments
 (0)