aboutsummaryrefslogtreecommitdiff
path: root/unittest/tfreedv_800XA_rawdata.c
diff options
context:
space:
mode:
authorMarin Ivanov <[email protected]>2025-07-25 10:17:14 +0300
committerMarin Ivanov <[email protected]>2026-01-18 20:09:26 +0200
commit0168586485e6310c598713c911b1dec5618d61a1 (patch)
tree6aabc2a12ef8fef70683f5389bea00f948015f77 /unittest/tfreedv_800XA_rawdata.c
Initial commitHEADmaster
* codec2 cut-down version 1.2.0 * Remove codebook and generation of sources * remove c2dec c2enc binaries * prepare for emscripten
Diffstat (limited to 'unittest/tfreedv_800XA_rawdata.c')
-rw-r--r--unittest/tfreedv_800XA_rawdata.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/unittest/tfreedv_800XA_rawdata.c b/unittest/tfreedv_800XA_rawdata.c
new file mode 100644
index 0000000..2b34c41
--- /dev/null
+++ b/unittest/tfreedv_800XA_rawdata.c
@@ -0,0 +1,147 @@
+/*---------------------------------------------------------------------------*\
+
+ FILE........: tfreedv_800XA_rawdata.c
+ AUTHOR......: Jeroen Vreeken
+ DATE CREATED: 24 May 2020
+
+ FreeDV 800XA rawdata test.
+
+\*---------------------------------------------------------------------------*/
+
+/*
+ Copyright (C) 2020 Jeroen Vreeken <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+
+#include "assert.h"
+#include "freedv_api.h"
+
+int main(int argc, char **argv) {
+ struct freedv *f;
+ int i;
+
+ printf("freedv_api tests for mode 800XA\n");
+
+ printf("freedv_open(FREEDV_MODE_800XA) ");
+ f = freedv_open(FREEDV_MODE_800XA);
+ assert(f != NULL);
+ printf("Passed\n");
+
+ printf("freedv_get_mode() ");
+ int mode = freedv_get_mode(f);
+ assert(mode == FREEDV_MODE_800XA);
+ printf("Passed\n");
+
+ printf("freedv_get_n_max_modem_samples() ");
+ int max_samples = freedv_get_n_max_modem_samples(f);
+ assert(max_samples == 660);
+ printf("%d Passed\n", max_samples);
+
+ printf("freedv_get_n_nom_modem_samples() ");
+ int nom_samples = freedv_get_n_nom_modem_samples(f);
+ assert(nom_samples == 640);
+ printf("%d Passed\n", nom_samples);
+
+ printf("freedv_get_n_speech_samples() ");
+ int speech_samples = freedv_get_n_speech_samples(f);
+ assert(speech_samples == 640);
+ printf("%d Passed\n", speech_samples);
+
+ printf("freedv_get_n_bits_per_codec_frame() ");
+ int codec_bits = freedv_get_bits_per_codec_frame(f);
+ assert(codec_bits == 28);
+ printf("%d Passed\n", codec_bits);
+
+ printf("freedv_get_n_bits_per_modem_frame() ");
+ int frame_bits = freedv_get_bits_per_modem_frame(f);
+ assert(frame_bits == 56);
+ printf("%d Passed\n", frame_bits);
+
+ /* Note: A codec frame is only 3.5 bytes!
+ so the fourth and eight bytes will be half empty!
+ */
+ unsigned char payload[8] = {0x12, 0x34, 0x56, 0x70, 0x89, 0xab, 0xcd, 0xe0};
+ unsigned char payload_tx[7] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde};
+
+ printf("freedv_codec_frames_from_rawdata() ");
+ unsigned char codec_frames[8] = {0};
+ freedv_codec_frames_from_rawdata(f, codec_frames, payload_tx);
+ int fails = 0;
+ for (i = 0; i < 8; i++) {
+ if (codec_frames[i] != payload[i]) {
+ printf("byte %d: 0x%02x does not match expected 0x%02x\n", i,
+ codec_frames[i], payload[i]);
+ fails++;
+ }
+ }
+ if (fails) goto fail;
+ printf("Passed\n");
+
+ printf("freedv_rawdata_from_codec_frames() ");
+ unsigned char rawdata[7] = {0};
+ freedv_rawdata_from_codec_frames(f, rawdata, payload);
+ fails = 0;
+ for (i = 0; i < 7; i++) {
+ if (rawdata[i] != payload_tx[i]) {
+ printf("byte %d: 0x%02x does not match expected 0x%02x\n", i, rawdata[i],
+ payload_tx[i]);
+ fails++;
+ }
+ }
+ if (fails) goto fail;
+ printf("Passed\n");
+
+ printf("freedv_rawdatatx()/freedv_rawdatarx() ");
+ int frames = 0;
+ fails = 0;
+ {
+ short mod[nom_samples * 10];
+ for (i = 0; i < 10; i++) {
+ freedv_rawdatatx(f, mod + i * nom_samples, payload_tx);
+ }
+ int nin = 0;
+ for (i = 0; i < nom_samples * 9; i += nin) {
+ nin = freedv_nin(f);
+ unsigned char payload_rx[8] = {0};
+ int r = freedv_rawdatarx(f, payload_rx, mod + i);
+ if (r == 7) {
+ int b;
+ for (b = 0; b < 7; b++) {
+ if (payload_tx[b] != payload_rx[b]) {
+ printf("Received codec bits 0x%02x do not match expected 0x%02x\n",
+ payload_rx[b], payload_tx[b]);
+ fails++;
+ }
+ }
+ frames++;
+ }
+ }
+ }
+ if (!frames) {
+ printf("Did not decode any frames successfully\n");
+ goto fail;
+ }
+ if (fails) goto fail;
+ printf("Passed\n");
+
+ printf("Tests passed\n");
+ return 0;
+fail:
+ printf("Test failed\n");
+ return 1;
+}