forked from fair-acc/chart-fx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
IIRFilterSample.java
148 lines (130 loc) · 5.71 KB
/
IIRFilterSample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package de.gsi.math.samples;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.zip.ZipInputStream;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.layout.VBox;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.gsi.dataset.DataSet;
import de.gsi.dataset.spi.DoubleDataSet;
import de.gsi.math.DataSetMath;
import de.gsi.math.filter.iir.Butterworth;
import de.gsi.math.samples.utils.AbstractDemoApplication;
import de.gsi.math.samples.utils.DemoChart;
/**
* Reads schottky measurement data and downmixes it with the following algorithm: * apply band-pass arround the relevant
* band * multiply with 28 MHz sine signal * low-pass filter * downsampling Then applies different IIR Filters to the
* signal
*
* @author rstein
*/
public class IIRFilterSample extends AbstractDemoApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(IIRFilterSample.class);
private static final int ORDER = 32; // Order of filters
private final double sampling = 100e6; // Sampling Rate: 100 MS/s
private final double center = 28e6; // Center Frequency: 28 MHz
private final double width = 0.5e6; // Signal Bandwidth: 0.5 MHz
private final int decimationFactor = 100;
private DataSet fraw;
private DataSet fraw1;
private DataSet fraw2;
private DataSet fspectra;
private DataSet fspectra1;
private DataSet fspectra2;
@Override
public Node getContent() {
initData();
final DemoChart chart1 = new DemoChart();
chart1.getXAxis().setName("time");
chart1.getXAxis().setUnit("s");
chart1.getYAxis().setName("magnitude");
chart1.getYAxis().setUnit("a.u.");
chart1.getDatasets().addAll(fraw1, fraw2);
final DemoChart chart2 = new DemoChart();
chart2.getXAxis().setName("frequency [fs]");
chart2.getXAxis().setUnit("fs");
// chart2.getXAxis().setAutoRanging(false);
// chart2.getXAxis().setUpperBound(28e6 + 1e6);
// chart2.getXAxis().setLowerBound(28e6 - 1e6);
chart2.getYAxis().setName("magnitude");
chart2.getYAxis().setUnit("a.u.");
chart2.getDatasets().addAll(fspectra, fspectra1, fspectra2);
return new VBox(chart1, chart2);
}
private void initData() {
final double fs = 100e6;
final int nBins = 4 * 8192;
fraw = readDemoData(27500, nBins);
if (fraw == null) {
throw new IllegalStateException("fraw is null");
}
fraw1 = readDemoData(27500 + (int) (0.5e-3 * fs), nBins);
if (fraw1 == null) {
throw new IllegalStateException("fraw1 is null");
}
fraw2 = readDemoData(27500 + (int) (1.5e-3 * fs), nBins);
if (fraw2 == null) {
throw new IllegalStateException("fraw2 is null");
}
LOGGER.atInfo().log("length 0 = " + fraw.getDataCount());
LOGGER.atInfo().log("length 1 = " + fraw1.getDataCount());
LOGGER.atInfo().log("length 2 = " + fraw2.getDataCount());
fspectra = DataSetMath.magnitudeSpectrumDecibel(fraw);
fspectra1 = DataSetMath.magnitudeSpectrumDecibel(fraw1);
fspectra2 = DataSetMath.magnitudeSpectrumDecibel(fraw2);
}
private DataSet readDemoData(final int offset, final int nSamples) {
// setup Bandpass to capture Signal
final Butterworth bandPass = new Butterworth();
bandPass.bandPass(ORDER, sampling, center, width);
// setup lowPass
final Butterworth lowPass = new Butterworth();
lowPass.lowPass(ORDER, sampling, width);
// initalise return data set
final DoubleDataSet ret = new DoubleDataSet("raw data@" + offset);
// read measurement data: 400 000 samples, 1MS/s
InputStream inputStream = IIRFilterSample.class.getResourceAsStream("./20190319_Schottky_SumX.csv.zip");
try (ZipInputStream zipStream = new ZipInputStream(inputStream)) {
while (zipStream.getNextEntry() != null) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(zipStream))) {
for (int i = 0; i < 2; i++) {
// skip header;
reader.readLine();
}
int count = 0;
int n = 0;
LOGGER.atInfo().log("start reading from " + offset);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
final String[] str = line.split(",");
final double s = Math.sin(2 * Math.PI * (sampling - width) * count);
final double y = lowPass.filter(s * bandPass.filter(Double.parseDouble(str[1])));
if (count >= offset && n < nSamples && count % decimationFactor == 0) {
// actual downsampling
ret.add(n / sampling, y);
n++;
}
count++;
}
LOGGER.atInfo().log("finished reading nSamples(total) = " + count);
return ret;
} catch (final Exception e) {
if (LOGGER.isErrorEnabled()) {
LOGGER.atError().setCause(e).log("read error");
}
}
zipStream.closeEntry();
}
} catch (final Exception e) {
if (LOGGER.isErrorEnabled()) {
LOGGER.atError().setCause(e).log("read error");
}
}
return null;
}
public static void main(final String[] args) {
Application.launch(args);
}
}