From 406e722150d196d7880f39998ce598f894ccbebe Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 01:30:42 -0800 Subject: [PATCH 01/20] Use four samples at a time for estimating corr. --- src/ofdm.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/ofdm.c b/src/ofdm.c index 41e3d1548..a1b93776c 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -1127,6 +1127,23 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { /* Joint estimation of timing and freq used for burst data acquisition */ +/* Determine if we can use vector ops below. */ +#if __GNUC__ > 4 || \ + (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ + (__GNUC_MINOR__ == 6 && \ + __GNUC_PATCHLEVEL__ > 0))) +#define USE_VECTOR_OPS 1 +#elif __clang_major__ > 3 || \ + (__clang_minor__ == 3 && (__clang_minor__ > 7 || \ + (__clang_minor__ == 7 && \ + __clang_patchlevel__ > 0))) +#define USE_VECTOR_OPS 1 +#endif + +#if USE_VECTOR_OPS +typedef float float8 __attribute__ ((vector_size (32))); +#endif /* USE_VECTOR_OPS */ + static float est_timing_and_freq(struct OFDM *ofdm, int *t_est, float *foff_est, complex float *rx, int Nrx, @@ -1140,12 +1157,32 @@ static float est_timing_and_freq(struct OFDM *ofdm, complex float mvec[Npsam]; for(int i=0; i max_corr) { max_corr = cabsf(corr); *t_est = t; From 12b526b22ddd89ea5b86da4a057d9e873fff5b2f Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 01:56:57 -0800 Subject: [PATCH 02/20] Handle case where Npsam isn't divisible by 4. --- src/ofdm.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ofdm.c b/src/ofdm.c index a1b93776c..22ea36afd 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -1164,7 +1164,8 @@ static float est_timing_and_freq(struct OFDM *ofdm, float *rxPtr = (float*)&rx[t]; float *vecPtr = (float*)mvec; float corrR = 0, corrI = 0; - for (int i = 0; i < Npsam; i++) + int numBlocks = Npsam >> 2; + for (int i = 0; i < numBlocks; i++) { float8 vec1 = { rxPtr[0], rxPtr[1], rxPtr[1], rxPtr[0], rxPtr[2], rxPtr[3], rxPtr[3], rxPtr[2] }; float8 vec2 = { vecPtr[0], vecPtr[1], vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3], vecPtr[2], vecPtr[3] }; @@ -1176,6 +1177,12 @@ static float est_timing_and_freq(struct OFDM *ofdm, corrI += vec3[2] + vec3[3] + vec3[6] + vec3[7]; } complex float corr = corrR + I * corrI; + + /* Add remaining values to corr that couldn't be vectorized above. */ + for (int i = numBlocks << 2; i < Npsam; i++) + { + corr += rx[i + t] * mvec[i]; + } #else complex float corr = 0; for (int i = 0; i < Npsam; i++) From 49a23986f440104a9971293e48bb7790b08d6cab Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 01:57:13 -0800 Subject: [PATCH 03/20] ofdm_destroy() should be done after we're finished with the ofdm object. --- src/ofdm_demod.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ofdm_demod.c b/src/ofdm_demod.c index 05e575a69..11e40e6f2 100644 --- a/src/ofdm_demod.c +++ b/src/ofdm_demod.c @@ -641,8 +641,6 @@ int main(int argc, char *argv[]) { f++; } - ofdm_destroy(ofdm); - if (input_specified == true) fclose(fin); @@ -702,5 +700,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Npre.....: %6d Npost: %5d uw_fails: %2d\n", ofdm->pre, ofdm->post, ofdm->uw_fails); } + ofdm_destroy(ofdm); + return ret; } From fa7f28c5b71b2de1428638ceec5eff201625bbeb Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 02:55:51 -0800 Subject: [PATCH 04/20] We're actually only dealing with two samples, not four. --- src/ofdm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ofdm.c b/src/ofdm.c index 22ea36afd..0c248ce90 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -1164,7 +1164,7 @@ static float est_timing_and_freq(struct OFDM *ofdm, float *rxPtr = (float*)&rx[t]; float *vecPtr = (float*)mvec; float corrR = 0, corrI = 0; - int numBlocks = Npsam >> 2; + int numBlocks = Npsam >> 1; for (int i = 0; i < numBlocks; i++) { float8 vec1 = { rxPtr[0], rxPtr[1], rxPtr[1], rxPtr[0], rxPtr[2], rxPtr[3], rxPtr[3], rxPtr[2] }; @@ -1179,7 +1179,7 @@ static float est_timing_and_freq(struct OFDM *ofdm, complex float corr = corrR + I * corrI; /* Add remaining values to corr that couldn't be vectorized above. */ - for (int i = numBlocks << 2; i < Npsam; i++) + for (int i = numBlocks << 1; i < Npsam; i++) { corr += rx[i + t] * mvec[i]; } From 89569c175ba29917c7125480d45f10839c9ddb18 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 12:56:33 -0800 Subject: [PATCH 05/20] Use double vectors instead of float for vector operations. --- src/ofdm.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/ofdm.c b/src/ofdm.c index 0c248ce90..ef8679f71 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -1127,7 +1127,10 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { /* Joint estimation of timing and freq used for burst data acquisition */ -/* Determine if we can use vector ops below. */ +/* Determine if we can use vector ops below. Only for non-embedded platforms + as double can be significantly slower on those. */ +#ifndef __EMBEDDED__ + #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ (__GNUC_MINOR__ == 6 && \ @@ -1141,9 +1144,11 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { #endif #if USE_VECTOR_OPS -typedef float float8 __attribute__ ((vector_size (32))); +typedef double double4 __attribute__ ((vector_size (32))); #endif /* USE_VECTOR_OPS */ +#endif /* __EMBEDDED__ */ + static float est_timing_and_freq(struct OFDM *ofdm, int *t_est, float *foff_est, complex float *rx, int Nrx, @@ -1165,17 +1170,31 @@ static float est_timing_and_freq(struct OFDM *ofdm, float *vecPtr = (float*)mvec; float corrR = 0, corrI = 0; int numBlocks = Npsam >> 1; + double4 accum = { 0, 0, 0, 0 }; + double4 accum2 = { 0, 0, 0, 0 }; for (int i = 0; i < numBlocks; i++) { - float8 vec1 = { rxPtr[0], rxPtr[1], rxPtr[1], rxPtr[0], rxPtr[2], rxPtr[3], rxPtr[3], rxPtr[2] }; - float8 vec2 = { vecPtr[0], vecPtr[1], vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3], vecPtr[2], vecPtr[3] }; - float8 vec3 = vec1 * vec2; - rxPtr += 4; vecPtr += 4; + /* Lay out vectors as follows: + vec1 = rx[0].a, rx[0].b, rx[1].a, rx[1].b, ... + vec2 = mvec[0].c, mvec[0].d, mvec[1].c, mvec1[1].d, ... */ + double4 vec1 = { rxPtr[0], rxPtr[1], rxPtr[2], rxPtr[3] }; + double4 vec2 = { vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3] }; - /* dot product: (a + bi)(c + di) = (ac - bd) + i(bc + ad) */ - corrR += vec3[0] - vec3[1] + vec3[4] - vec3[5]; - corrI += vec3[2] + vec3[3] + vec3[6] + vec3[7]; + /* Lay out vec3 as { rx[0].b, rx[0].a, rx[1].b, rx[0].b, ... }. + Multiply vec3 by vec2 to get us bc, ad, bc, ad + and add to second accumulator. */ + double4 vec3 = { rxPtr[1], rxPtr[0], rxPtr[3], rxPtr[2] }; + + accum += vec1 * vec2; + accum2 += vec3 * vec2; + + /* Shift pointers forward by 4 (2 complex floats). */ + rxPtr += 4; vecPtr += 4; } + + /* dot product: (a + bi)(c + di) = (ac - bd) + i(bc + ad) */ + corrR = (accum[0] + accum[2]) - (accum[1] + accum[3]); + corrI = (accum2[0] + accum2[1]) + (accum2[2] + accum2[3]); complex float corr = corrR + I * corrI; /* Add remaining values to corr that couldn't be vectorized above. */ @@ -1190,6 +1209,7 @@ static float est_timing_and_freq(struct OFDM *ofdm, corr += rx[i + t] * mvec[i]; } #endif /* USE_VECTOR_OPS */ + if (cabsf(corr) > max_corr) { max_corr = cabsf(corr); *t_est = t; From 9b5643e80471890cf8d2dca81867c0d147d5c5c2 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 13:28:36 -0800 Subject: [PATCH 06/20] Test: go back to only using floats. --- src/ofdm.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/ofdm.c b/src/ofdm.c index ef8679f71..4f4642aa2 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -1127,10 +1127,7 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { /* Joint estimation of timing and freq used for burst data acquisition */ -/* Determine if we can use vector ops below. Only for non-embedded platforms - as double can be significantly slower on those. */ -#ifndef __EMBEDDED__ - +/* Determine if we can use vector ops below. */ #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ (__GNUC_MINOR__ == 6 && \ @@ -1144,11 +1141,10 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { #endif #if USE_VECTOR_OPS -typedef double double4 __attribute__ ((vector_size (32))); +typedef float float4 __attribute__ ((vector_size (16))); +typedef float float2 __attribute__ ((vector_size (8))); #endif /* USE_VECTOR_OPS */ -#endif /* __EMBEDDED__ */ - static float est_timing_and_freq(struct OFDM *ofdm, int *t_est, float *foff_est, complex float *rx, int Nrx, @@ -1168,34 +1164,38 @@ static float est_timing_and_freq(struct OFDM *ofdm, #if USE_VECTOR_OPS float *rxPtr = (float*)&rx[t]; float *vecPtr = (float*)mvec; + float2 accum = { 0, 0 }; float corrR = 0, corrI = 0; int numBlocks = Npsam >> 1; - double4 accum = { 0, 0, 0, 0 }; - double4 accum2 = { 0, 0, 0, 0 }; for (int i = 0; i < numBlocks; i++) { /* Lay out vectors as follows: vec1 = rx[0].a, rx[0].b, rx[1].a, rx[1].b, ... vec2 = mvec[0].c, mvec[0].d, mvec[1].c, mvec1[1].d, ... */ - double4 vec1 = { rxPtr[0], rxPtr[1], rxPtr[2], rxPtr[3] }; - double4 vec2 = { vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3] }; + float4 vec1 = { rxPtr[0], rxPtr[1], rxPtr[2], rxPtr[3] }; + float4 vec2 = { vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3] }; /* Lay out vec3 as { rx[0].b, rx[0].a, rx[1].b, rx[0].b, ... }. Multiply vec3 by vec2 to get us bc, ad, bc, ad and add to second accumulator. */ - double4 vec3 = { rxPtr[1], rxPtr[0], rxPtr[3], rxPtr[2] }; + float4 vec3 = { rxPtr[1], rxPtr[0], rxPtr[3], rxPtr[2] }; + + float4 res1 = vec1 * vec2; + float4 res2 = vec3 * vec2; + + float2 res = { + res1[0] - res1[1] + res1[2] - res1[3], + res2[0] + res2[1] + res2[2] + res2[3] + }; - accum += vec1 * vec2; - accum2 += vec3 * vec2; + accum += res; /* Shift pointers forward by 4 (2 complex floats). */ rxPtr += 4; vecPtr += 4; } /* dot product: (a + bi)(c + di) = (ac - bd) + i(bc + ad) */ - corrR = (accum[0] + accum[2]) - (accum[1] + accum[3]); - corrI = (accum2[0] + accum2[1]) + (accum2[2] + accum2[3]); - complex float corr = corrR + I * corrI; + complex float corr = accum[0] + I * accum[1]; /* Add remaining values to corr that couldn't be vectorized above. */ for (int i = numBlocks << 1; i < Npsam; i++) From 5c864814b07d01fb0e8965eb55df25d12fc08d70 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 13:29:54 -0800 Subject: [PATCH 07/20] Revert "Test: go back to only using floats." This reverts commit 9b5643e80471890cf8d2dca81867c0d147d5c5c2. --- src/ofdm.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/ofdm.c b/src/ofdm.c index 4f4642aa2..ef8679f71 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -1127,7 +1127,10 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { /* Joint estimation of timing and freq used for burst data acquisition */ -/* Determine if we can use vector ops below. */ +/* Determine if we can use vector ops below. Only for non-embedded platforms + as double can be significantly slower on those. */ +#ifndef __EMBEDDED__ + #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ (__GNUC_MINOR__ == 6 && \ @@ -1141,10 +1144,11 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { #endif #if USE_VECTOR_OPS -typedef float float4 __attribute__ ((vector_size (16))); -typedef float float2 __attribute__ ((vector_size (8))); +typedef double double4 __attribute__ ((vector_size (32))); #endif /* USE_VECTOR_OPS */ +#endif /* __EMBEDDED__ */ + static float est_timing_and_freq(struct OFDM *ofdm, int *t_est, float *foff_est, complex float *rx, int Nrx, @@ -1164,38 +1168,34 @@ static float est_timing_and_freq(struct OFDM *ofdm, #if USE_VECTOR_OPS float *rxPtr = (float*)&rx[t]; float *vecPtr = (float*)mvec; - float2 accum = { 0, 0 }; float corrR = 0, corrI = 0; int numBlocks = Npsam >> 1; + double4 accum = { 0, 0, 0, 0 }; + double4 accum2 = { 0, 0, 0, 0 }; for (int i = 0; i < numBlocks; i++) { /* Lay out vectors as follows: vec1 = rx[0].a, rx[0].b, rx[1].a, rx[1].b, ... vec2 = mvec[0].c, mvec[0].d, mvec[1].c, mvec1[1].d, ... */ - float4 vec1 = { rxPtr[0], rxPtr[1], rxPtr[2], rxPtr[3] }; - float4 vec2 = { vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3] }; + double4 vec1 = { rxPtr[0], rxPtr[1], rxPtr[2], rxPtr[3] }; + double4 vec2 = { vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3] }; /* Lay out vec3 as { rx[0].b, rx[0].a, rx[1].b, rx[0].b, ... }. Multiply vec3 by vec2 to get us bc, ad, bc, ad and add to second accumulator. */ - float4 vec3 = { rxPtr[1], rxPtr[0], rxPtr[3], rxPtr[2] }; - - float4 res1 = vec1 * vec2; - float4 res2 = vec3 * vec2; - - float2 res = { - res1[0] - res1[1] + res1[2] - res1[3], - res2[0] + res2[1] + res2[2] + res2[3] - }; + double4 vec3 = { rxPtr[1], rxPtr[0], rxPtr[3], rxPtr[2] }; - accum += res; + accum += vec1 * vec2; + accum2 += vec3 * vec2; /* Shift pointers forward by 4 (2 complex floats). */ rxPtr += 4; vecPtr += 4; } /* dot product: (a + bi)(c + di) = (ac - bd) + i(bc + ad) */ - complex float corr = accum[0] + I * accum[1]; + corrR = (accum[0] + accum[2]) - (accum[1] + accum[3]); + corrI = (accum2[0] + accum2[1]) + (accum2[2] + accum2[3]); + complex float corr = corrR + I * corrI; /* Add remaining values to corr that couldn't be vectorized above. */ for (int i = numBlocks << 1; i < Npsam; i++) From 9353b242f8b95cbe7b5656848e800cab5d9070eb Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 14:00:40 -0800 Subject: [PATCH 08/20] Accumulate positive as well as negative real values. --- src/ofdm.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/ofdm.c b/src/ofdm.c index ef8679f71..1f8a01a01 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -1129,8 +1129,6 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { /* Determine if we can use vector ops below. Only for non-embedded platforms as double can be significantly slower on those. */ -#ifndef __EMBEDDED__ - #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ (__GNUC_MINOR__ == 6 && \ @@ -1144,11 +1142,9 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { #endif #if USE_VECTOR_OPS -typedef double double4 __attribute__ ((vector_size (32))); +typedef float float4 __attribute__ ((vector_size (16))); #endif /* USE_VECTOR_OPS */ -#endif /* __EMBEDDED__ */ - static float est_timing_and_freq(struct OFDM *ofdm, int *t_est, float *foff_est, complex float *rx, int Nrx, @@ -1168,33 +1164,35 @@ static float est_timing_and_freq(struct OFDM *ofdm, #if USE_VECTOR_OPS float *rxPtr = (float*)&rx[t]; float *vecPtr = (float*)mvec; + float4 accumPos = { 0, 0, 0, 0 }; + float4 accumNeg = { 0, 0, 0, 0 }; + float4 accumImag = { 0, 0, 0, 0 }; float corrR = 0, corrI = 0; int numBlocks = Npsam >> 1; - double4 accum = { 0, 0, 0, 0 }; - double4 accum2 = { 0, 0, 0, 0 }; for (int i = 0; i < numBlocks; i++) { /* Lay out vectors as follows: vec1 = rx[0].a, rx[0].b, rx[1].a, rx[1].b, ... vec2 = mvec[0].c, mvec[0].d, mvec[1].c, mvec1[1].d, ... */ - double4 vec1 = { rxPtr[0], rxPtr[1], rxPtr[2], rxPtr[3] }; - double4 vec2 = { vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3] }; + float4 vec1 = { rxPtr[0], rxPtr[1], rxPtr[2], rxPtr[3] }; + float4 vec2 = { vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3] }; + + accumPos += vec1 * vec2; + accumNeg -= vec1 * vec2; /* Lay out vec3 as { rx[0].b, rx[0].a, rx[1].b, rx[0].b, ... }. Multiply vec3 by vec2 to get us bc, ad, bc, ad and add to second accumulator. */ - double4 vec3 = { rxPtr[1], rxPtr[0], rxPtr[3], rxPtr[2] }; - - accum += vec1 * vec2; - accum2 += vec3 * vec2; + float4 vec3 = { rxPtr[1], rxPtr[0], rxPtr[3], rxPtr[2] }; + accumImag += vec3 * vec2; /* Shift pointers forward by 4 (2 complex floats). */ rxPtr += 4; vecPtr += 4; } /* dot product: (a + bi)(c + di) = (ac - bd) + i(bc + ad) */ - corrR = (accum[0] + accum[2]) - (accum[1] + accum[3]); - corrI = (accum2[0] + accum2[1]) + (accum2[2] + accum2[3]); + corrR = accumPos[0] + accumNeg[1] + accumPos[2] + accumNeg[3]; + corrI = accumImag[0] + accumImag[1] + accumImag[2] + accumImag[3]; complex float corr = corrR + I * corrI; /* Add remaining values to corr that couldn't be vectorized above. */ From 611bfe24e3c23c5a2387f0171736d0d06712c05d Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sat, 31 Dec 2022 22:46:26 -0800 Subject: [PATCH 09/20] macOS ctest fixes. --- CMakeLists.txt | 2 +- unittest/check_comp.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 97c99c02b..3c9d38172 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -506,7 +506,7 @@ endif() # Check Octave and C compressed waveforms are about the same add_test(NAME test_OFDM_modem_datac0_compression COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; - ./check_comp.sh ${CMAKE_CURRENT_SOURCE_DIR} $PATH:${CMAKE_CURRENT_BINARY_DIR}/src") + ./check_comp.sh ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src") # ---------------------------------- ofdm_mod/demod level C modem tests ---------------------------------- diff --git a/unittest/check_comp.sh b/unittest/check_comp.sh index caf203cbe..b559a2e10 100755 --- a/unittest/check_comp.sh +++ b/unittest/check_comp.sh @@ -8,7 +8,7 @@ # ../unittest/check_comp.sh ${CODEC2} ${PATH}:${CODEC2}/build_linux/src CODEC2=$1 -PATH=$2 +PATH=$2:$PATH set -x octave_log=$(mktemp) ch_log=$(mktemp) From 572c68887683d92f686a2e3d604456e359299658 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 00:07:42 -0800 Subject: [PATCH 10/20] Additional macOS test tweaks. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c9d38172..7c5283ed4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1252,7 +1252,7 @@ endif(NOT APPLE) # FEC/acquisition a work out, bursts of 1 frame as that stresses acquisition add_test(NAME test_freedv_data_raw_fsk_ldpc_100 COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; - ./freedv_data_raw_tx --testframes 10 --bursts 10 FSK_LDPC /dev/zero - | + ./freedv_data_raw_tx --testframes 10 --bursts 11 FSK_LDPC /dev/zero - | ./ch - - --No -5 --ssbfilt 0 | ./freedv_data_raw_rx --testframes -v FSK_LDPC - /dev/null") set_tests_properties(test_freedv_data_raw_fsk_ldpc_100 PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: 10") From 64c1470796a1c0712d29dfbce0d64296839d645c Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 00:41:39 -0800 Subject: [PATCH 11/20] M1 Mac is fast enough to require USE_MUTEX for test_fifo to consistently pass. --- src/codec2_fifo.c | 41 ++++++++++++++++++++++------------------- unittest/tfifo.c | 3 ++- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/codec2_fifo.c b/src/codec2_fifo.c index a2d3c3099..b93c7c346 100644 --- a/src/codec2_fifo.c +++ b/src/codec2_fifo.c @@ -30,8 +30,9 @@ */ #include -#include #include +#include +#include #include "codec2_fifo.h" struct FIFO { @@ -70,7 +71,6 @@ void codec2_fifo_destroy(struct FIFO *fifo) { } int codec2_fifo_write(struct FIFO *fifo, short data[], int n) { - int i; short *pdata; short *pin = fifo->pin; @@ -82,15 +82,17 @@ int codec2_fifo_write(struct FIFO *fifo, short data[], int n) { } else { - /* This could be made more efficient with block copies - using memcpy */ - pdata = data; - for(i=0; ibuf + fifo->nshort)) - pin = fifo->buf; - } + if ((pin + n) >= (fifo->buf + fifo->nshort)) + { + int firstSamples = fifo->buf + fifo->nshort - pin; + memcpy(pin, pdata, firstSamples * sizeof(short)); + n -= firstSamples; + pin = fifo->buf; + pdata += firstSamples; + } + memcpy(pin, pdata, n * sizeof(short)); + pin += n; fifo->pin = pin; } @@ -99,7 +101,6 @@ int codec2_fifo_write(struct FIFO *fifo, short data[], int n) { int codec2_fifo_read(struct FIFO *fifo, short data[], int n) { - int i; short *pdata; short *pout = fifo->pout; @@ -111,15 +112,17 @@ int codec2_fifo_read(struct FIFO *fifo, short data[], int n) } else { - /* This could be made more efficient with block copies - using memcpy */ - pdata = data; - for(i=0; ibuf + fifo->nshort)) - pout = fifo->buf; - } + if ((pout + n) >= (fifo->buf + fifo->nshort)) + { + int firstSamples = fifo->buf + fifo->nshort - pout; + memcpy(pdata, pout, firstSamples * sizeof(short)); + n -= firstSamples; + pout = fifo->buf; + pdata += firstSamples; + } + memcpy(pdata, pout, n * sizeof(short)); + pout += n; fifo->pout = pout; } diff --git a/unittest/tfifo.c b/unittest/tfifo.c index 0987db67b..1192299ff 100644 --- a/unittest/tfifo.c +++ b/unittest/tfifo.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "codec2_fifo.h" #define FIFO_SZ 1024 @@ -25,7 +26,7 @@ void *writer_thread(void *data); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; #define USE_THREADS -//#define USE_MUTEX +#define USE_MUTEX int main() { pthread_t awriter_thread; From 666406b710f82e81cc444dca7a789826185b9612 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 01:00:14 -0800 Subject: [PATCH 12/20] Tweak test_freedv_data_raw_fsk_ldpc_100 expected results to allow it to work on macOS and Linux. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c5283ed4..658d5e1e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1252,10 +1252,10 @@ endif(NOT APPLE) # FEC/acquisition a work out, bursts of 1 frame as that stresses acquisition add_test(NAME test_freedv_data_raw_fsk_ldpc_100 COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; - ./freedv_data_raw_tx --testframes 10 --bursts 11 FSK_LDPC /dev/zero - | + ./freedv_data_raw_tx --testframes 10 --bursts 10 FSK_LDPC /dev/zero - | ./ch - - --No -5 --ssbfilt 0 | ./freedv_data_raw_rx --testframes -v FSK_LDPC - /dev/null") - set_tests_properties(test_freedv_data_raw_fsk_ldpc_100 PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: 10") + set_tests_properties(test_freedv_data_raw_fsk_ldpc_100 PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: ( 9|10)") # FSK LDPC 1000 bit/s 2FSK, Fs=40kHz, as different configs can upset acquisition add_test(NAME test_freedv_data_raw_fsk_ldpc_1k From 88b95ad6ebb4bf04de00df814b6940711434ae78 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 03:43:56 -0800 Subject: [PATCH 13/20] Use codec2_math for complex dot product on embedded platforms. --- src/ofdm.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ofdm.c b/src/ofdm.c index 1f8a01a01..562d18c89 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -748,10 +748,9 @@ static int est_timing(struct OFDM *ofdm, complex float *rx, int length, #ifdef __EMBEDDED__ #ifdef __REAL__ - // Note: this code untested float re,im; - codec2_dot_product_f32(&rx_real[i], wvec_pilot_real, ofdm->samplespersymbol, &re); + codec2_dot_product_f32(&rx_real[i], wvec_pilot_real, ofdm->samplespersymbol, &re); codec2_dot_product_f32(&rx_real[i], wvec_pilot_imag, ofdm->samplespersymbol, &im); corr_st = re + im * I; @@ -1129,6 +1128,7 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { /* Determine if we can use vector ops below. Only for non-embedded platforms as double can be significantly slower on those. */ +#ifndef __EMBEDDED__ #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ (__GNUC_MINOR__ == 6 && \ @@ -1140,6 +1140,9 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { __clang_patchlevel__ > 0))) #define USE_VECTOR_OPS 1 #endif +#else +#include "codec2_math.h" +#endif /* __EMBEDDED__ */ #if USE_VECTOR_OPS typedef float float4 __attribute__ ((vector_size (16))); @@ -1200,6 +1203,10 @@ static float est_timing_and_freq(struct OFDM *ofdm, { corr += rx[i + t] * mvec[i]; } +#elif __EMBEDDED__ + float corrReal = 0, corrImag = 0; + codec2_complex_dot_product_f32((COMP*)&rx[t], (COMP*)mvec, Npsam, &corrReal, &corrImag); + complex float corr = corrReal + I * corrImag; #else complex float corr = 0; for (int i = 0; i < Npsam; i++) From 415776565decffe753b22779f746784a1b4b7b5c Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 03:45:21 -0800 Subject: [PATCH 14/20] Correct old comment. --- src/ofdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ofdm.c b/src/ofdm.c index 562d18c89..cca5654a2 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -1127,7 +1127,7 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { /* Joint estimation of timing and freq used for burst data acquisition */ /* Determine if we can use vector ops below. Only for non-embedded platforms - as double can be significantly slower on those. */ + as this can be significantly slower on those. */ #ifndef __EMBEDDED__ #if __GNUC__ > 4 || \ (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ From 17c7a763588f74b4a9e559657aac6fa6a694318e Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 10:36:51 -0800 Subject: [PATCH 15/20] Refactor code and allow the vectorized dot product implementation to be used on the voice side as well. --- src/ofdm.c | 161 +++++++++++++++++++++++++++-------------------------- 1 file changed, 83 insertions(+), 78 deletions(-) diff --git a/src/ofdm.c b/src/ofdm.c index cca5654a2..acec6fdda 100644 --- a/src/ofdm.c +++ b/src/ofdm.c @@ -671,6 +671,86 @@ static complex float vector_sum(complex float *a, int num_elements) { return sum; } +/* Determine if we can use vector ops below. Only for non-embedded platforms + as double can be significantly slower on those. */ +#ifndef __EMBEDDED__ +#if __GNUC__ > 4 || \ + (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ + (__GNUC_MINOR__ == 6 && \ + __GNUC_PATCHLEVEL__ > 0))) +#define USE_VECTOR_OPS 1 +#elif __clang_major__ > 3 || \ + (__clang_minor__ == 3 && (__clang_minor__ > 7 || \ + (__clang_minor__ == 7 && \ + __clang_patchlevel__ > 0))) +#define USE_VECTOR_OPS 1 +#endif +#else +#include "codec2_math.h" +#endif /* __EMBEDDED__ */ + +#if USE_VECTOR_OPS +typedef float float4 __attribute__ ((vector_size (16))); +#endif /* USE_VECTOR_OPS */ + +static complex float ofdm_complex_dot_product(complex float *left, complex float *right, int numSamples) +{ + complex float result; + +#if USE_VECTOR_OPS + float *leftPtr = (float*)left; + float *rightPtr = (float*)right; + float4 accumPos = { 0, 0, 0, 0 }; + float4 accumNeg = { 0, 0, 0, 0 }; + float4 accumImag = { 0, 0, 0, 0 }; + float resultReal = 0; + float resultImag = 0; + int numBlocks = numSamples >> 1; + for (int i = 0; i < numBlocks; i++) + { + /* Lay out vectors as follows: + vec1 = rx[0].a, rx[0].b, rx[1].a, rx[1].b, ... + vec2 = mvec[0].c, mvec[0].d, mvec[1].c, mvec1[1].d, ... */ + float4 vec1 = { leftPtr[0], leftPtr[1], leftPtr[2], leftPtr[3] }; + float4 vec2 = { rightPtr[0], rightPtr[1], rightPtr[2], rightPtr[3] }; + + accumPos += vec1 * vec2; + accumNeg -= vec1 * vec2; + + /* Lay out vec3 as { rx[0].b, rx[0].a, rx[1].b, rx[0].b, ... }. + Multiply vec3 by vec2 to get us bc, ad, bc, ad + and add to second accumulator. */ + float4 vec3 = { leftPtr[1], leftPtr[0], leftPtr[3], leftPtr[2] }; + accumImag += vec3 * vec2; + + /* Shift pointers forward by 4 (2 complex floats). */ + leftPtr += 4; rightPtr += 4; + } + + /* dot product: (a + bi)(c + di) = (ac - bd) + i(bc + ad) */ + resultReal = accumPos[0] + accumNeg[1] + accumPos[2] + accumNeg[3]; + resultImag = accumImag[0] + accumImag[1] + accumImag[2] + accumImag[3]; + result = resultReal + I * resultImag; + + /* Add remaining values to corr that couldn't be vectorized above. */ + for (int i = numBlocks << 1; i < numSamples; i++) + { + result += left[i] * right[i]; + } +#elif __EMBEDDED__ + float resultReal = 0, resultImag = 0; + codec2_complex_dot_product_f32((COMP*)left, (COMP*)right, numSamples, &resultReal, &resultImag); + result = resultReal + I * resultImag; +#else + for (int i = 0; i < numSamples; i++) + { + result += left[i] * right[i]; + } +#endif /* USE_VECTOR_OPS */ + + return result; +} + /* * Correlates the OFDM pilot symbol samples with a window of received @@ -768,12 +848,8 @@ static int est_timing(struct OFDM *ofdm, complex float *rx, int length, corr_en = re + im * I; #endif #else - for (j = 0; j < ofdm->samplespersymbol; j++) { - int ind = i + j; - - corr_st = corr_st + (rx[ind ] * wvec_pilot[j]); - corr_en = corr_en + (rx[ind + ofdm->samplesperframe] * wvec_pilot[j]); - } + corr_st = ofdm_complex_dot_product(&rx[i], wvec_pilot, ofdm->samplespersymbol); + corr_en = ofdm_complex_dot_product(&rx[i + ofdm->samplesperframe], wvec_pilot, ofdm->samplespersymbol); #endif // __EMBEDDED__ corr[i] = (cabsf(corr_st) + cabsf(corr_en)) * av_level; } @@ -1126,28 +1202,6 @@ int ofdm_sync_search_shorts(struct OFDM *ofdm, short *rxbuf_in, float gain) { /* Joint estimation of timing and freq used for burst data acquisition */ -/* Determine if we can use vector ops below. Only for non-embedded platforms - as this can be significantly slower on those. */ -#ifndef __EMBEDDED__ -#if __GNUC__ > 4 || \ - (__GNUC__ == 4 && (__GNUC_MINOR__ > 6 || \ - (__GNUC_MINOR__ == 6 && \ - __GNUC_PATCHLEVEL__ > 0))) -#define USE_VECTOR_OPS 1 -#elif __clang_major__ > 3 || \ - (__clang_minor__ == 3 && (__clang_minor__ > 7 || \ - (__clang_minor__ == 7 && \ - __clang_patchlevel__ > 0))) -#define USE_VECTOR_OPS 1 -#endif -#else -#include "codec2_math.h" -#endif /* __EMBEDDED__ */ - -#if USE_VECTOR_OPS -typedef float float4 __attribute__ ((vector_size (16))); -#endif /* USE_VECTOR_OPS */ - static float est_timing_and_freq(struct OFDM *ofdm, int *t_est, float *foff_est, complex float *rx, int Nrx, @@ -1164,56 +1218,7 @@ static float est_timing_and_freq(struct OFDM *ofdm, mvec[i] = conjf(known_samples[i]*ph); } for(int t=0; t> 1; - for (int i = 0; i < numBlocks; i++) - { - /* Lay out vectors as follows: - vec1 = rx[0].a, rx[0].b, rx[1].a, rx[1].b, ... - vec2 = mvec[0].c, mvec[0].d, mvec[1].c, mvec1[1].d, ... */ - float4 vec1 = { rxPtr[0], rxPtr[1], rxPtr[2], rxPtr[3] }; - float4 vec2 = { vecPtr[0], vecPtr[1], vecPtr[2], vecPtr[3] }; - - accumPos += vec1 * vec2; - accumNeg -= vec1 * vec2; - - /* Lay out vec3 as { rx[0].b, rx[0].a, rx[1].b, rx[0].b, ... }. - Multiply vec3 by vec2 to get us bc, ad, bc, ad - and add to second accumulator. */ - float4 vec3 = { rxPtr[1], rxPtr[0], rxPtr[3], rxPtr[2] }; - accumImag += vec3 * vec2; - - /* Shift pointers forward by 4 (2 complex floats). */ - rxPtr += 4; vecPtr += 4; - } - - /* dot product: (a + bi)(c + di) = (ac - bd) + i(bc + ad) */ - corrR = accumPos[0] + accumNeg[1] + accumPos[2] + accumNeg[3]; - corrI = accumImag[0] + accumImag[1] + accumImag[2] + accumImag[3]; - complex float corr = corrR + I * corrI; - - /* Add remaining values to corr that couldn't be vectorized above. */ - for (int i = numBlocks << 1; i < Npsam; i++) - { - corr += rx[i + t] * mvec[i]; - } -#elif __EMBEDDED__ - float corrReal = 0, corrImag = 0; - codec2_complex_dot_product_f32((COMP*)&rx[t], (COMP*)mvec, Npsam, &corrReal, &corrImag); - complex float corr = corrReal + I * corrImag; -#else - complex float corr = 0; - for (int i = 0; i < Npsam; i++) - { - corr += rx[i + t] * mvec[i]; - } -#endif /* USE_VECTOR_OPS */ + complex float corr = ofdm_complex_dot_product(&rx[t], mvec, Npsam); if (cabsf(corr) > max_corr) { max_corr = cabsf(corr); From c5e3dae1ffa61b267074d24bc4e3bf70a3ed6b39 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 17:39:09 -0800 Subject: [PATCH 16/20] Revert "M1 Mac is fast enough to require USE_MUTEX for test_fifo to consistently pass." This reverts commit 64c1470796a1c0712d29dfbce0d64296839d645c. --- src/codec2_fifo.c | 41 +++++++++++++++++++---------------------- unittest/tfifo.c | 3 +-- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/codec2_fifo.c b/src/codec2_fifo.c index b93c7c346..a2d3c3099 100644 --- a/src/codec2_fifo.c +++ b/src/codec2_fifo.c @@ -30,9 +30,8 @@ */ #include -#include #include -#include +#include #include "codec2_fifo.h" struct FIFO { @@ -71,6 +70,7 @@ void codec2_fifo_destroy(struct FIFO *fifo) { } int codec2_fifo_write(struct FIFO *fifo, short data[], int n) { + int i; short *pdata; short *pin = fifo->pin; @@ -82,17 +82,15 @@ int codec2_fifo_write(struct FIFO *fifo, short data[], int n) { } else { + /* This could be made more efficient with block copies + using memcpy */ + pdata = data; - if ((pin + n) >= (fifo->buf + fifo->nshort)) - { - int firstSamples = fifo->buf + fifo->nshort - pin; - memcpy(pin, pdata, firstSamples * sizeof(short)); - n -= firstSamples; - pin = fifo->buf; - pdata += firstSamples; - } - memcpy(pin, pdata, n * sizeof(short)); - pin += n; + for(i=0; ibuf + fifo->nshort)) + pin = fifo->buf; + } fifo->pin = pin; } @@ -101,6 +99,7 @@ int codec2_fifo_write(struct FIFO *fifo, short data[], int n) { int codec2_fifo_read(struct FIFO *fifo, short data[], int n) { + int i; short *pdata; short *pout = fifo->pout; @@ -112,17 +111,15 @@ int codec2_fifo_read(struct FIFO *fifo, short data[], int n) } else { + /* This could be made more efficient with block copies + using memcpy */ + pdata = data; - if ((pout + n) >= (fifo->buf + fifo->nshort)) - { - int firstSamples = fifo->buf + fifo->nshort - pout; - memcpy(pdata, pout, firstSamples * sizeof(short)); - n -= firstSamples; - pout = fifo->buf; - pdata += firstSamples; - } - memcpy(pdata, pout, n * sizeof(short)); - pout += n; + for(i=0; ibuf + fifo->nshort)) + pout = fifo->buf; + } fifo->pout = pout; } diff --git a/unittest/tfifo.c b/unittest/tfifo.c index 1192299ff..0987db67b 100644 --- a/unittest/tfifo.c +++ b/unittest/tfifo.c @@ -9,7 +9,6 @@ #include #include #include -#include #include "codec2_fifo.h" #define FIFO_SZ 1024 @@ -26,7 +25,7 @@ void *writer_thread(void *data); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; #define USE_THREADS -#define USE_MUTEX +//#define USE_MUTEX int main() { pthread_t awriter_thread; From 4cc0bba0ca42eb5825892650bb11b1e4cca8f6c8 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 17:44:30 -0800 Subject: [PATCH 17/20] Revert "macOS ctest fixes." This reverts commit 611bfe24e3c23c5a2387f0171736d0d06712c05d. --- CMakeLists.txt | 2 +- unittest/check_comp.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 658d5e1e2..afd69da5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -506,7 +506,7 @@ endif() # Check Octave and C compressed waveforms are about the same add_test(NAME test_OFDM_modem_datac0_compression COMMAND sh -c "cd ${CMAKE_CURRENT_SOURCE_DIR}/unittest; - ./check_comp.sh ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src") + ./check_comp.sh ${CMAKE_CURRENT_SOURCE_DIR} $PATH:${CMAKE_CURRENT_BINARY_DIR}/src") # ---------------------------------- ofdm_mod/demod level C modem tests ---------------------------------- diff --git a/unittest/check_comp.sh b/unittest/check_comp.sh index b559a2e10..caf203cbe 100755 --- a/unittest/check_comp.sh +++ b/unittest/check_comp.sh @@ -8,7 +8,7 @@ # ../unittest/check_comp.sh ${CODEC2} ${PATH}:${CODEC2}/build_linux/src CODEC2=$1 -PATH=$2:$PATH +PATH=$2 set -x octave_log=$(mktemp) ch_log=$(mktemp) From 6c7902b57381cf1ba6d63234d993e53920ebf88d Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 17:44:52 -0800 Subject: [PATCH 18/20] Revert "Tweak test_freedv_data_raw_fsk_ldpc_100 expected results to allow it to work on macOS and Linux." This reverts commit 666406b710f82e81cc444dca7a789826185b9612. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index afd69da5f..799b91271 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1252,10 +1252,10 @@ endif(NOT APPLE) # FEC/acquisition a work out, bursts of 1 frame as that stresses acquisition add_test(NAME test_freedv_data_raw_fsk_ldpc_100 COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; - ./freedv_data_raw_tx --testframes 10 --bursts 10 FSK_LDPC /dev/zero - | + ./freedv_data_raw_tx --testframes 10 --bursts 11 FSK_LDPC /dev/zero - | ./ch - - --No -5 --ssbfilt 0 | ./freedv_data_raw_rx --testframes -v FSK_LDPC - /dev/null") - set_tests_properties(test_freedv_data_raw_fsk_ldpc_100 PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: ( 9|10)") + set_tests_properties(test_freedv_data_raw_fsk_ldpc_100 PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: 10") # FSK LDPC 1000 bit/s 2FSK, Fs=40kHz, as different configs can upset acquisition add_test(NAME test_freedv_data_raw_fsk_ldpc_1k From ceb0d7323bb377173ff65d8c00f56ef7627b042b Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 17:48:23 -0800 Subject: [PATCH 19/20] Undo remaining ctest fix. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 799b91271..97c99c02b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1252,7 +1252,7 @@ endif(NOT APPLE) # FEC/acquisition a work out, bursts of 1 frame as that stresses acquisition add_test(NAME test_freedv_data_raw_fsk_ldpc_100 COMMAND sh -c "cd ${CMAKE_CURRENT_BINARY_DIR}/src; - ./freedv_data_raw_tx --testframes 10 --bursts 11 FSK_LDPC /dev/zero - | + ./freedv_data_raw_tx --testframes 10 --bursts 10 FSK_LDPC /dev/zero - | ./ch - - --No -5 --ssbfilt 0 | ./freedv_data_raw_rx --testframes -v FSK_LDPC - /dev/null") set_tests_properties(test_freedv_data_raw_fsk_ldpc_100 PROPERTIES PASS_REGULAR_EXPRESSION "Frms.: 10") From 7ba145283861045efd84f553279bd48e63c99977 Mon Sep 17 00:00:00 2001 From: Mooneer Salem Date: Sun, 1 Jan 2023 17:58:57 -0800 Subject: [PATCH 20/20] Revert "ofdm_destroy() should be done after we're finished with the ofdm object." This reverts commit 49a23986f440104a9971293e48bb7790b08d6cab. --- src/ofdm_demod.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ofdm_demod.c b/src/ofdm_demod.c index 11e40e6f2..05e575a69 100644 --- a/src/ofdm_demod.c +++ b/src/ofdm_demod.c @@ -641,6 +641,8 @@ int main(int argc, char *argv[]) { f++; } + ofdm_destroy(ofdm); + if (input_specified == true) fclose(fin); @@ -700,7 +702,5 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Npre.....: %6d Npost: %5d uw_fails: %2d\n", ofdm->pre, ofdm->post, ofdm->uw_fails); } - ofdm_destroy(ofdm); - return ret; }