aboutsummaryrefslogtreecommitdiff
path: root/demo/freedv_datac0c1_rx.c
diff options
context:
space:
mode:
Diffstat (limited to 'demo/freedv_datac0c1_rx.c')
-rw-r--r--demo/freedv_datac0c1_rx.c138
1 files changed, 70 insertions, 68 deletions
diff --git a/demo/freedv_datac0c1_rx.c b/demo/freedv_datac0c1_rx.c
index cfbef14..fd3a335 100644
--- a/demo/freedv_datac0c1_rx.c
+++ b/demo/freedv_datac0c1_rx.c
@@ -9,16 +9,16 @@
DATAC0 or DATAC1 frames. Demonstrates a common use case for HF data
- the ability to receive signalling as well as payload data frames.
- usage:
+ usage:
cd codec2/build_linux
./demo/freedv_datacc01_tx | ./demo/freedv_datac0c1_rx
- Give it a hard time with some channel noise, frequency offset, and sample
+ Give it a hard time with some channel noise, frequency offset, and sample
clock offsets:
- ./demo/freedv_datac0c1_tx | ./src/cohpsk_ch - - -24 -f 20 --Fs 8000 |
- sox -t .s16 -c 1 -r 8000 - -t .s16 -c 1 -r 8008 - |
+ ./demo/freedv_datac0c1_tx | ./src/cohpsk_ch - - -24 -f 20 --Fs 8000 |
+ sox -t .s16 -c 1 -r 8000 - -t .s16 -c 1 -r 8008 - |
./demo/freedv_datac0c1_rx
Replace the final line with "aplay -f S16" to listen to the
@@ -44,85 +44,87 @@
*/
#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include "freedv_api.h"
#define NBUF 160
-int run_receiver(struct freedv *freedv, short buf[], short demod_in[], int *pn, uint8_t bytes_out[]);
+int run_receiver(struct freedv *freedv, short buf[], short demod_in[], int *pn,
+ uint8_t bytes_out[]);
int main(int argc, char *argv[]) {
-
- // set up DATAC0 Rx
- struct freedv *freedv_c0 = freedv_open(FREEDV_MODE_DATAC0);
- assert(freedv_c0 != NULL);
- freedv_set_frames_per_burst(freedv_c0, 1);
- freedv_set_verbose(freedv_c0, 0);
- int bytes_per_modem_frame_c0 = freedv_get_bits_per_modem_frame(freedv_c0)/8;
- uint8_t bytes_out_c0[bytes_per_modem_frame_c0];
- short demod_in_c0[freedv_get_n_max_modem_samples(freedv_c0)];
-
- // set up DATAC1 Rx
- struct freedv *freedv_c1 = freedv_open(FREEDV_MODE_DATAC1);
- assert(freedv_c1 != NULL);
- freedv_set_frames_per_burst(freedv_c1, 1);
- freedv_set_verbose(freedv_c1, 0);
- int bytes_per_modem_frame_c1 = freedv_get_bits_per_modem_frame(freedv_c1)/8;
- uint8_t bytes_out_c1[bytes_per_modem_frame_c1];
- short demod_in_c1[freedv_get_n_max_modem_samples(freedv_c1)];
-
- // number of samples in demod_in buffer for each Rx
- int n_c0 = 0;
- int n_c1 = 0;
- // number of frames received in each mode
- int c0_frames = 0;
- int c1_frames = 0;
-
- short buf[NBUF];
-
- // read a fixed buffer from stdin, use that to fill c0 and c1 demod_in buffers
- while(fread(buf, sizeof(short), NBUF, stdin) == NBUF) {
-
- if (run_receiver(freedv_c0, buf, demod_in_c0, &n_c0, bytes_out_c0)) {
- fprintf(stderr, "DATAC0 frame received!\n");
- c0_frames++;
- }
- if (run_receiver(freedv_c1, buf, demod_in_c1, &n_c1, bytes_out_c1)) {
- fprintf(stderr, "DATAC1 frame received!\n");
- c1_frames++;
- }
-
+ // set up DATAC0 Rx
+ struct freedv *freedv_c0 = freedv_open(FREEDV_MODE_DATAC0);
+ assert(freedv_c0 != NULL);
+ freedv_set_frames_per_burst(freedv_c0, 1);
+ freedv_set_verbose(freedv_c0, 0);
+ int bytes_per_modem_frame_c0 = freedv_get_bits_per_modem_frame(freedv_c0) / 8;
+ uint8_t bytes_out_c0[bytes_per_modem_frame_c0];
+ short demod_in_c0[freedv_get_n_max_modem_samples(freedv_c0)];
+
+ // set up DATAC1 Rx
+ struct freedv *freedv_c1 = freedv_open(FREEDV_MODE_DATAC1);
+ assert(freedv_c1 != NULL);
+ freedv_set_frames_per_burst(freedv_c1, 1);
+ freedv_set_verbose(freedv_c1, 0);
+ int bytes_per_modem_frame_c1 = freedv_get_bits_per_modem_frame(freedv_c1) / 8;
+ uint8_t bytes_out_c1[bytes_per_modem_frame_c1];
+ short demod_in_c1[freedv_get_n_max_modem_samples(freedv_c1)];
+
+ // number of samples in demod_in buffer for each Rx
+ int n_c0 = 0;
+ int n_c1 = 0;
+ // number of frames received in each mode
+ int c0_frames = 0;
+ int c1_frames = 0;
+
+ short buf[NBUF];
+
+ // read a fixed buffer from stdin, use that to fill c0 and c1 demod_in buffers
+ while (fread(buf, sizeof(short), NBUF, stdin) == NBUF) {
+ if (run_receiver(freedv_c0, buf, demod_in_c0, &n_c0, bytes_out_c0)) {
+ fprintf(stderr, "DATAC0 frame received!\n");
+ c0_frames++;
+ }
+ if (run_receiver(freedv_c1, buf, demod_in_c1, &n_c1, bytes_out_c1)) {
+ fprintf(stderr, "DATAC1 frame received!\n");
+ c1_frames++;
}
+ }
- fprintf(stderr, "DATAC0 Frames: %d DATAC1 Frames: %d\n", c0_frames, c1_frames);
+ fprintf(stderr, "DATAC0 Frames: %d DATAC1 Frames: %d\n", c0_frames,
+ c1_frames);
- freedv_close(freedv_c0);
- freedv_close(freedv_c1);
+ freedv_close(freedv_c0);
+ freedv_close(freedv_c1);
- return 0;
+ return 0;
}
-int run_receiver(struct freedv *freedv, short buf[], short demod_in[], int *pn, uint8_t bytes_out[]) {
- int n = *pn;
- int nbytes_out = 0;
- int nin;
-
- // NBUF new samples into DATAC1 Rx
- memcpy(&demod_in[n], buf, sizeof(short)*NBUF);
- n += NBUF; assert(n <= freedv_get_n_max_modem_samples(freedv));
+int run_receiver(struct freedv *freedv, short buf[], short demod_in[], int *pn,
+ uint8_t bytes_out[]) {
+ int n = *pn;
+ int nbytes_out = 0;
+ int nin;
+
+ // NBUF new samples into DATAC1 Rx
+ memcpy(&demod_in[n], buf, sizeof(short) * NBUF);
+ n += NBUF;
+ assert(n <= freedv_get_n_max_modem_samples(freedv));
+ nin = freedv_nin(freedv);
+ while (n > nin) {
+ nbytes_out = freedv_rawdatarx(freedv, bytes_out, demod_in);
+ // nin samples were read
+ n -= nin;
+ assert(n >= 0);
+ memmove(demod_in, &demod_in[nin], sizeof(short) * n);
nin = freedv_nin(freedv);
- while (n > nin) {
- nbytes_out = freedv_rawdatarx(freedv, bytes_out, demod_in);
- // nin samples were read
- n -= nin; assert(n >= 0);
- memmove(demod_in, &demod_in[nin], sizeof(short)*n);
- nin = freedv_nin(freedv);
- }
+ }
- *pn = n;
- return nbytes_out;
+ *pn = n;
+ return nbytes_out;
}