1 /* spkmodem-recv.c - decode spkmodem signals */
3 * Copyright (C) 2013 Vladimir 'phcoder' Serbinenko
5 * spkmodem-recv is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 2 of the License, or
8 * (at your option) any later version.
10 * spkmodem-recv is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
20 /* Compilation: gcc -o spkmodem-recv spkmodem-recv */
21 /* Usage: parecord --channels=1 --rate=48000 --format=s16le | ./spkmodem-recv */
23 #define SAMPLES_PER_TRAME 240
24 #define FREQ_SEP_MIN 5
25 #define FREQ_SEP_MAX 15
26 #define FREQ_DATA_MIN 15
27 #define FREQ_DATA_THRESHOLD 25
28 #define FREQ_DATA_MAX 60
32 #define FLUSH_TIMEOUT 1
34 static signed short trame
[2 * SAMPLES_PER_TRAME
];
35 static signed short pulse
[2 * SAMPLES_PER_TRAME
];
36 static int ringpos
= 0;
37 static int pos
, f1
, f2
;
38 static int amplitude
= 0;
44 amplitude
-= abs (trame
[ringpos
]);
46 f1
+= pulse
[(ringpos
+ SAMPLES_PER_TRAME
) % (2 * SAMPLES_PER_TRAME
)];
47 f2
-= pulse
[(ringpos
+ SAMPLES_PER_TRAME
) % (2 * SAMPLES_PER_TRAME
)];
48 fread (trame
+ ringpos
, 1, sizeof (trame
[0]), stdin
);
49 amplitude
+= abs (trame
[ringpos
]);
51 if (pos
? (trame
[ringpos
] < -THRESHOLD
)
52 : (trame
[ringpos
] > +THRESHOLD
))
61 ringpos
%= 2 * SAMPLES_PER_TRAME
;
74 if (lp
> 3 * SAMPLES_PER_TRAME
)
81 if (llp
== FLUSH_TIMEOUT
)
83 if (f2
> FREQ_SEP_MIN
&& f2
< FREQ_SEP_MAX
84 && f1
> FREQ_DATA_MIN
&& f1
< FREQ_DATA_MAX
)
87 printf ("%d %d %d @%d\n", f1
, f2
, FREQ_DATA_THRESHOLD
,
88 ftell (stdin
) - sizeof (trame
));
90 if (f1
< FREQ_DATA_THRESHOLD
)
96 printf ("<%c, %x>", c
, c
);
105 for (i
= 0; i
< SAMPLES_PER_TRAME
; i
++)