-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
AfskDemodulator.java
46 lines (37 loc) · 1.37 KB
/
AfskDemodulator.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
package ru.r2cloud.jradio.demod;
import java.io.IOException;
import ru.r2cloud.jradio.ByteInput;
import ru.r2cloud.jradio.Context;
import ru.r2cloud.jradio.FloatInput;
import ru.r2cloud.jradio.blocks.Firdes;
import ru.r2cloud.jradio.blocks.FloatToComplex;
import ru.r2cloud.jradio.blocks.FrequencyXlatingFIRFilter;
import ru.r2cloud.jradio.blocks.QuadratureDemodulation;
import ru.r2cloud.jradio.blocks.Window;
public class AfskDemodulator implements ByteInput {
private final ByteInput source;
public AfskDemodulator(FloatInput source, int baudRate, float deviation, float afCarrier, int decimation) {
FloatInput next = source;
if (next.getContext().getChannels() == 2) {
next = new QuadratureDemodulation(next, 1);
}
float filterCutoff = 2 * Math.abs(deviation);
float filterTransition = 0.1f * Math.abs(deviation);
float[] taps = Firdes.lowPass(1, next.getContext().getSampleRate(), filterCutoff, filterTransition, Window.WIN_HAMMING, 6.76);
next = new FloatToComplex(next);
next = new FrequencyXlatingFIRFilter(next, taps, decimation, afCarrier);
this.source = new FskDemodulator(next, baudRate, deviation, 1, 2000, false);
}
@Override
public byte readByte() throws IOException {
return source.readByte();
}
@Override
public void close() throws IOException {
source.close();
}
@Override
public Context getContext() {
return source.getContext();
}
}