1 /* spkmodem-recv.c - decode spkmodem signals */
3 * Copyright (C) 2013 Free Software Foundation, Inc.
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.
15 * You should have received a copy of the GNU General Public License
16 * along with spkmodem-recv. If not, see <http://www.gnu.org/licenses/>.
23 /* Compilation: gcc -o spkmodem-recv spkmodem-recv */
24 /* Usage: parecord --channels=1 --rate=48000 --format=s16le | ./spkmodem-recv */
26 #define SAMPLES_PER_TRAME 240
27 #define FREQ_SEP_MIN 5
28 #define FREQ_SEP_MAX 15
29 #define FREQ_DATA_MIN 15
30 #define FREQ_DATA_THRESHOLD 25
31 #define FREQ_DATA_MAX 60
35 #define FLUSH_TIMEOUT 1
37 static signed short trame
[2 * SAMPLES_PER_TRAME
];
38 static signed short pulse
[2 * SAMPLES_PER_TRAME
];
39 static int ringpos
= 0;
40 static int pos
, f1
, f2
;
41 static int amplitude
= 0;
47 amplitude
-= abs (trame
[ringpos
]);
49 f1
+= pulse
[(ringpos
+ SAMPLES_PER_TRAME
) % (2 * SAMPLES_PER_TRAME
)];
50 f2
-= pulse
[(ringpos
+ SAMPLES_PER_TRAME
) % (2 * SAMPLES_PER_TRAME
)];
51 fread (trame
+ ringpos
, 1, sizeof (trame
[0]), stdin
);
52 amplitude
+= abs (trame
[ringpos
]);
54 if (pos
? (trame
[ringpos
] < -THRESHOLD
)
55 : (trame
[ringpos
] > +THRESHOLD
))
64 ringpos
%= 2 * SAMPLES_PER_TRAME
;
77 if (lp
> 3 * SAMPLES_PER_TRAME
)
84 if (llp
== FLUSH_TIMEOUT
)
86 if (f2
> FREQ_SEP_MIN
&& f2
< FREQ_SEP_MAX
87 && f1
> FREQ_DATA_MIN
&& f1
< FREQ_DATA_MAX
)
90 printf ("%d %d %d @%d\n", f1
, f2
, FREQ_DATA_THRESHOLD
,
91 ftell (stdin
) - sizeof (trame
));
93 if (f1
< FREQ_DATA_THRESHOLD
)
99 printf ("<%c, %x>", c
, c
);
108 for (i
= 0; i
< SAMPLES_PER_TRAME
; i
++)