Hi Tim, It kind of depends where the it errors lie, but with enough frames, both PER and coded BER should be minimised.
You could also compare BER results to the original phi0 implementation in the CML library that we started from. List: Tim is experimenting with part of the LDPC FEC decoding that was optimised for 700D on the sm1000. The algorithm he is looking at was discussed a few years ago in this blog post: https://www.rowetel.com/wordpress/store.html/?p=6413 Tim, if you are interested in other optimisation work in general, there has been some recent work here: https://github.com/drowe67/codec2/pull/200 - David On Wed, 2021-08-04 at 08:39 -0500, Tim Meehan wrote: > Perhaps it is just PER that I should minimize on? I can't conceive of > a case where your BER would go up but your PER would stay the same > ... > > On Wed, Aug 4, 2021 at 8:16 AM Tim Meehan <btmee...@gmail.com> wrote: > > Hi Al - nice to hear from you. > > > > I'm trying to learn ARM cross compiling, but it would be nice to > > also have some folks to check on live hardware. The only SDR I have > > is receive-only (NooElec NESDR Nano2+, and your web link is NEAT!). > > > > In the script snippet that I attached, there was a bit at the end > > that I thought might have been the "figure of merit" ... if so ... > > I can try and tune the knot placement based on these numbers. > > > > Uncoded PSK Eb/No simulation: > > No = 1.00 dB (1.26 linear) > > Eb = 0.00 dB (1.00 linear) > > Eb/No = -1.00 dB (0.79 linear) > > Using: HRA_112_112 > > Using: HRA_112_112 > > Nframes: 100 > > CodeLength: 224 offset: 0 > > written: 22400 > > .....xxx.x.x.x...xmeasured double sided (real) noise power: > > 0.629226 > > xx.x............................................x....x....x....x..x > > .........x....xtotal iters 5469 > > Raw Tbits: 22400 Terr: 2268 BER: 0.101 > > Coded Tbits: 11200 Terr: 68 BER: 0.006 > > Tpkts: 100 Tper: 17 PER: 0.170 > > > > I gather that having both of these numbers small is good? > > Minimizing on two numbers is a bit challenging, I might just try to > > minimize based on sqrt(BER^2 + PER^2) ... any thoughts would be > > appreciated. > > > > On Wed, Aug 4, 2021 at 3:32 AM Al Beard <bear...@unixservice.com.au > > > wrote: > > > Hello Tim, > > > > > > It's great to have you onboard. I'm more of an "implimenter", by > > > no means good at C or C++. > > > So I can't help to that depth. > > > > > > I can compile code on ARM and Intel Linux platforms here and with > > > transceivers, give it a go. > > > > > > So, if I can be useful. > > > > > > My SDR here in western Sydney, Australia can do Codec2 decode > > > though currently in one mode. > > > (easily changeable in a script file) Web browse > > > 110.143.195.8:8073 > > > > > > You may notice the M17 project has chosen the Codec2 modes 1600 > > > and 3200 to "replace" AMBE > > > in an open source transceiver project. > > > > > > Welcome > > > > > > Alan VK2ZIW > > > > > > On Tue, 3 Aug 2021 17:14:15 -0500, Tim Meehan wrote > > > > Hi - I'm not extremely versed in digital modes, but I am well > > > versed in optimization. I think that HAM radio should be > > > something open source, which is why Codec2 appeals to me. > > > > > > > > Before I post a large blob of C code, I wanted to mention that > > > I have a program that I have written a genetic optimizer to move > > > spline knots around - and I'd be happy to run the optimizer based > > > on BER/PER ... however ... I need someone to explain to me how I > > > might generate quantities to optimize on. I don't need bunches > > > of help, just enough so that I can write it myself. > > > > > > > > I found that the 16-sample clamped endpoint spline with log- > > > spaced samples worked the best, so I'll chop out the higher > > > sample density parts of the code. My hope was faster AND more > > > accurate, but I think all I got was faster and LESS accurate. > > > Perhaps wiser eyes than mine can help me out. > > > > > > > > The test script that I was using was: > > > > #!/bin/sh > > > > ./ldpc_enc /dev/zero - --sd --code HRA_112_112 --testframes 100 > > > \ | ./ldpc_noise - - 1 \ > > > > | ./ldpc_dec - /dev/null --code HRA_112_112 --sd -- > > > testframes > > > > > > > > The code is (simply replace phi0.c with this):// phi0.c > > > > #include <stdint.h> > > > > #include <stddef.h> > > > > > > > > float coeffs_clamped_16[16] = { > > > > 7.93223341e+07, 1.55433768e+07, 3.60871810e+06, > > > 7.33752374e+05, > > > > 1.65434845e+05, 3.44055511e+04, 7.62050634e+03, > > > 1.60695364e+03, > > > > 3.52218272e+02, 7.50245180e+01, 1.64584579e+01, > > > 3.63755151e+00, > > > > 8.75888035e-01, 1.72673513e-01, 6.76273536e-03, > > > -7.75296180e-03}; > > > > > > > > float x_16[16] = { > > > > 1.00000000e-04, 2.15443469e-04, 4.64158883e-04, > > > 1.00000000e-03, > > > > 2.15443469e-03, 4.64158883e-03, 1.00000000e-02, > > > 2.15443469e-02, > > > > 4.64158883e-02, 1.00000000e-01, 2.15443469e-01, > > > 4.64158883e-01, > > > > 1.00000000e+00, 2.15443469e+00, 4.64158883e+00, > > > 1.00000000e+01}; > > > > > > > > float y_16[16] = { > > > > 9.90348755e+00, 9.13595919e+00, 8.36843084e+00, > > > 7.60090254e+00, > > > > 6.83337448e+00, 6.06584753e+00, 5.29832570e+00, > > > 4.53082768e+00, > > > > 3.76344015e+00, 2.99656512e+00, 2.23206146e+00, > > > 1.47840690e+00, > > > > 7.71936833e-01, 2.32985688e-01, 1.92853284e-02, > > > 9.07998596e-05}; > > > > > > > > static size_t > > > > bisect(float x, float *restrict x_data, size_t size) > > > > { > > > > size_t left = 0; > > > > size_t right = size - 1; > > > > int max_iterations = 32; /* waay higher than we need */ > > > > > > > > while (right - left > 1 && max_iterations--) { > > > > size_t middle = left + (right - left)/2; > > > > float xm = x_data[middle]; > > > > if (x < xm) > > > > right = middle; > > > > else if (xm < x) > > > > left = middle; > > > > } > > > > > > > > return left; > > > > } > > > > > > > > static float > > > > spline_interpolate(float x, > > > > float *restrict x_data, > > > > float *restrict y_data, > > > > float *restrict M, > > > > size_t size) { > > > > size_t i = bisect(x, x_data, size); > > > > float h = x_data[i + 1] - x_data[i]; > > > > float z = (x - x_data[i])/h; > > > > float h2 = h * h; > > > > > > > > float c1 = (M[i + 1] - M[i]) * h2 / 6.0; > > > > float c2 = M[i] * h2 / 2.0; > > > > float c3 = y_data[i + 1] - y_data[i] - (M[i + 1] + 2.0 * > > > M[i]) * h2 / 6.0; > > > > > > > > return ((c1 * z + c2) * z + c3) * z + y_data[i]; > > > > } > > > > > > > > extern float > > > > phi0(float x) { > > > > if (x <= x_16[0]) > > > > return 10.0f; > > > > if (x >= x_16[15]) > > > > return 0.0f; > > > > > > > > return spline_interpolate(x, x_16, y_16, coeffs_clamped_16, > > > 16); > > > > } > > > > > > > > > --------------------------------------------------- > > > Alan VK2ZIW > > > Before the Big Bang, God, Sela. > > > OpenWebMail 2.53, nothing in the cloud. > > > > > > _______________________________________________ > > > Freetel-codec2 mailing list > > > Freetel-codec2@lists.sourceforge.net > > > https://lists.sourceforge.net/lists/listinfo/freetel-codec2 > > _______________________________________________ > Freetel-codec2 mailing list > Freetel-codec2@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/freetel-codec2 _______________________________________________ Freetel-codec2 mailing list Freetel-codec2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/freetel-codec2