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 > <http://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