Mike and Bill,

Thanks for the comments. As Bill noted, I’m not doing anything fancy - as Bill 
said, my program is written in C and is called with the same system call that 
calls the real kvasd. I am, indeed, seeing the “Error in KV decoder” messages 
and I have determined that my program is not terminating cleanly in some cases. 
 Somehow, in addition to the “Error in KV decoder” messages, I am also 
triggering a number of weird errors — for example: the fft wisdom 
initialization started up in the middle of decoding all files in a directory 
and on a couple of occasions I've caused a crash in Joe’s packjt routine. I’ll 
work on cleaning up my act… 

For what it’s worth, I think that I have been running in JT65-only mode all 
along - but I’ll keep an eye on that, too.
Thanks!
Steve k9an

> On Sep 13, 2015, at 7:34 AM, Bill Somerville <g4...@classdesign.com> wrote:
> 
> On 13/09/2015 13:24, Michael Black wrote:
> 
> Hi Mike,
>> He described interleaving so perhaps he's multithreading in sfrsd?  If it's 
>> exiting normally isn't all I/O flushed?  Or does FORTRAN behave differently 
>> than C/C++?
>> If the decodes are appearing in a different order it would seem he's either 
>> multithreading or doing a completely different walk-through of the window or 
>> some system flushing problem like you suggested.
> Truncation can look like interleaving. AFAIK there is no threading in 
> sfrsd. The sfrsd program is written in C.
> 
> The most likely reason for decodes in different orders is using JT9+JT65 
> mode, any changes in timing of the JT65 decodes could change the places 
> where the concurrent JT9 decodes appear in the combined output. Also a 
> failure or success of an algorithm on a particular decode has a bearing 
> on the following processing so any differences between KVASD and sfrsd 
> results will have such an impact.
> 
> As an aside, I would do performance testing in JT65 only mode thus 
> eliminating any influence of JT9 decodes running in parallel.
> 
> I would guess that the log file problems are due to abnormal exits from 
> sfrsd causing truncated log output.
>> 
>> Mike W9MDB
> 73
> Bill
> G4WJS.
>> 
>> -----Original Message-----
>> From: Bill Somerville [mailto:g4...@classdesign.com]
>> Sent: Sunday, September 13, 2015 7:16 AM
>> To: wsjt-devel@lists.sourceforge.net
>> Subject: Re: [wsjt-devel] update on sfrsd
>> 
>> On 13/09/2015 13:03, Bill Somerville wrote:
>>> On 13/09/2015 12:55, Michael Black wrote:
>>> 
>>> Hi Mike,
>>>> JT9 is multithreaded.  Printf() is thread-safe but it is not atomic.  So 
>>>> you need to use a mutex to access it safely from multiple threads.
>>> I don't think that is relevant in this case. KVASD is only executed
>>> for
>>> JT65 decodes and each decoder is single threaded. The JT65 and JT9
>>> decoders do run concurrently in separate threads.
>>> 
>>> Also KVASD is executed by a Fortran SYSTEM() intrinsic function so it
>>> is run in a separate process. If there is any contention for a common
>>> log file then some sort of interprocess synchronization would be
>>> required. I doubt that is necessary in this case, maybe there is some
>>> overlap of process exit and flushing buffers but that seems unlikely
>>> too. Making sure file handles are closed before exit in sfrsd should
>>> sort that out if it is happening.
>> The most likely reason for incomplete output from a process is that it did 
>> not terminate cleanly and properly. The jt9 program does check the exit 
>> status of the KVASD process and prints a:
>> 
>> 'Error in KV decoder, or no KV decoder present.'
>> 
>> message if it is non-zero. If you are seeing that message in the band 
>> activity window then that is a sign that the KVASD process did not run 
>> properly. In that case any log output saved by sfrsd (KVASD) may well be 
>> truncated.
>>>> Mike W9MDB
>>> 73
>>> Bill
>>> G4WJS.
>> 73
>> Bill
>> G4WJS.
>>>> -----Original Message-----
>>>> From: Steven Franke [mailto:s.j.fra...@icloud.com]
>>>> Sent: Saturday, September 12, 2015 11:59 PM
>>>> To: WSJT software development
>>>> Subject: Re: [wsjt-devel] update on sfrsd
>>>> 
>>>> Joe and Bill,
>>>> 
>>>> I am running wsjt-x (wsjtx_exp branch) using my decoder program (sfrsd) 
>>>> renamed to kvasd. It seemed to work OK at first, although the decodes that 
>>>> wsjt-x displays are shown in a different order than they are when I use 
>>>> the “real” kvasd.
>>>> 
>>>> Now, in addition to the results coming out in a different order, I have 
>>>> started to get segmentation faults and strange errors. This started after 
>>>> I significantly increased the amount of data that I am writing to a log 
>>>> file (/tmp/sfrsd.log) using fprintf statements from within sfrsd. I notice 
>>>> that the contents of the log file are garbled - as if more than one 
>>>> instance of the program was trying to write to it at the same time. Are 
>>>> you spawning multiple instances of kvasd? Is there anything that I need to 
>>>> do to my program to make it safe to run when called from wsjt-x?
>>>> 
>>>> Steve k9an
>>>> 
>>>>> On Sep 12, 2015, at 4:02 PM, Steven Franke <s.j.fra...@icloud.com> wrote:
>>>>> 
>>>>> Joe,
>>>>> 
>>>>> FYI, examining the results a bit more, I notice that sfrsd decoded cases 
>>>>> containing as many as 38 bad symbols (out of 63). I haven’t done the same 
>>>>> study for kvasd - it doesn’t return the total number of errors, 
>>>>> unfortunately.
>>>>> 
>>>>> More important, I also notice that the vast majority of the successful 
>>>>> decodes take less than 100 trials (that’s the number of erasure locator 
>>>>> vectors that we have to try before we get lucky and hit one that will 
>>>>> decode) - whereas the cutoff is set to 10000 at the moment. This points 
>>>>> the way toward achieving a very significant speedup. Note the following:
>>>>> 
>>>>> Total number of calls to sfrsd: 1408 Total number of successful
>>>>> decodes: 104
>>>>> 
>>>>> Of the 1304 unsuccessful decodes, a large fraction (probably 90%) consist 
>>>>> of long strings of nearly identical rx vectors. I am using your 
>>>>> suggestion to rename sfrsd to kvasd for the purpose of running these 
>>>>> tests, so your birdie removal should be operative. I have seen as many as 
>>>>> 15 un-decodable and identical rx vectors from one file. Since most of the 
>>>>> successful decodes finish after fewer than 100 trials, whereas every 
>>>>> single un-decodable one will run out the full 10000 trials, much less 
>>>>> than 1% of the execution time is actually spent on decodable vectors. So 
>>>>> there’s a lot to gain if we can figure out a way to reduce the number of 
>>>>> un-necessary calls to the decoder.
>>>>> 
>>>>> As I noted in the last message, I have a long list of things that I can 
>>>>> do to speed up the execution time, but none of them promise the huge 
>>>>> improvement available if we can cut out a bunch of those bad rx vectors. 
>>>>> I can certainly look at this --- I don’t mean to throw it in your lap --- 
>>>>> but I’m guessing that you may already have some insight into what’s going 
>>>>> on.
>>>>> 
>>>>> Steve k9an
>>>>> 
>>>>>> On Sep 12, 2015, at 1:04 PM, Steven Franke <s.j.fra...@icloud.com> wrote:
>>>>>> 
>>>>>> Hi Joe -
>>>>>> Since you asked about where the sfrsd routine stands with respect to 
>>>>>> kvasd, I did a quick test this morning. Before I ran the test, I found 
>>>>>> and fixed a fundamental flaw in the sfrsd routine that significantly 
>>>>>> improved its performance. Then I did a run with the number of trials set 
>>>>>> to 10000, which makes it very slow (it takes a long time to time out) 
>>>>>> but I wanted to see where we stand in terms of decoding probability, 
>>>>>> irrespective of decoding time. The results are encouraging. Here’s a 
>>>>>> brief summary of the results from my set of 212 .wav files:
>>>>>> 
>>>>>> baseline (BM HDD only): 618 decodes
>>>>>> kvasd: 104 decodes (this is above and beyond the 618 BM decodes)
>>>>>> sfrsd: 104 decodes (2 bad decodes)
>>>>>> 
>>>>>> kvasd decoded 14 cases that were not decoded by sfrsd.
>>>>>> sfrsd decoded 12 cases (not counting 2 bad ones) that were not
>>>>>> decoded by kvasd
>>>>>> 
>>>>>> This result is obtained using a very simple-minded algorithm, which can 
>>>>>> be described in just a few lines:
>>>>>> 
>>>>>> 1. sort the symbol probabilities
>>>>>> 2. among the 51 smallest symbol probabilities, randomly select a subset 
>>>>>> and set them as “erasures”
>>>>>> 3. try to decode with BM
>>>>>> 4. if decode succeeds, quit. Otherwise go to 2.
>>>>>> 
>>>>>> This algorithm only makes use of the symbol probabilities to identify 
>>>>>> the 51 symbols that are erasure candidates. Obviously, one can do a 
>>>>>> better job by using the symbol quality to determine the probability of 
>>>>>> setting that symbol as an erasure. That’s the next step.
>>>>>> 
>>>>>> I am not too worried about the bad decodes at this stage. The algorithm 
>>>>>> should be enhanced such that it saves a list of all of the codewords 
>>>>>> produced by the BM algorithm. It should then select the codeword with 
>>>>>> the best metric (e.g. some measure of distance from the received symbol 
>>>>>> vector). It should also apply a threshold to reject codewords that are 
>>>>>> too “far” away from the received codeword. I have not implemented any of 
>>>>>> that yet.
>>>>>> Steve k9an
>>>>>> 
>>>>>>> On Sep 11, 2015, at 12:11 PM, Steven Franke <s.j.fra...@icloud.com> 
>>>>>>> wrote:
>>>>>>> 
>>>>>>> Hi Joe,
>>>>>>> 
>>>>>>> Re the sfrsd program. Please regard this as merely a framework for 
>>>>>>> future development. Nothing in the current code is optimized and I am 
>>>>>>> almost certain that I can do better. I think that it is premature to do 
>>>>>>> any quantitative performance comparisons with KV.  I will say that it 
>>>>>>> was very encouraging to see how easy it is to come up with something 
>>>>>>> that provides useful gains via very simple use of soft-symbol 
>>>>>>> information.
>>>>>>> 
>>>>>>> Regarding the prospects for improving on KV - long story short - I am 
>>>>>>> convinced that the class of algorithms that I am playing with can be 
>>>>>>> tuned to be competitive with KV if we are willing to wait long enough 
>>>>>>> for the algorithm to run to completion. What I don’t know yet is if it 
>>>>>>> will be possible to come up with something that runs fast enough to be 
>>>>>>> useful.
>>>>>>> 
>>>>>>> My next step will be to pick apart the existing KA9Q Berlekamp Massey 
>>>>>>> code so that we can eliminate some redundant calculations. In 
>>>>>>> particular, I recently realized that the syndromes only have to be 
>>>>>>> calculated once for each received symbol vector, whereas I am now 
>>>>>>> re-calculating them thousands of times in the main loop.  I plan to 
>>>>>>> implement the current sfrsd algorithm with this improvement and then 
>>>>>>> move on to improving algorithm. I’ll let you know when I’ve got it to a 
>>>>>>> point where I think that it’s worth comparing to KV.
>>>>>>> 
>>>>>>> By the way, one thing that I’ve already noticed is that some files 
>>>>>>> produce lots of identical un-decodable received symbol vectors. Since I 
>>>>>>> have to try a whole bunch of virtual received signal vectors before I 
>>>>>>> can decide that these are un-decodable, my decoder bogs down on these 
>>>>>>> whereas KV seems to be able to blow right past them. I’m guessing that 
>>>>>>> these events result from interference, or birdies - I can’t think of 
>>>>>>> anything else that would produce a slew of identical vectors. It may 
>>>>>>> eventually be necessary to figure out a way to identify these events 
>>>>>>> before they are sent to the decoder.
>>>>>>> 
>>>>>>> Re JTMSK - I am very interested in it, but I haven’t had time to look 
>>>>>>> at what you are doing there. If you have carefully read the relevant 
>>>>>>> sections of Proakis, then you certainly know more about CPFSK 
>>>>>>> techniques than I do. I am aware of the fact that it should be 
>>>>>>> possible, in principle, to do some form of block demodulation, perhaps 
>>>>>>> using the Viterbi algorithm, as opposed to symbol-by-symbol 
>>>>>>> demodulation. While this could produce significant gains - it would 
>>>>>>> seem that this approach will require the channel to be reasonably well 
>>>>>>> behaved (i.e. no significant frequency offset or random phase walks), 
>>>>>>> no?  Off-list I’ll send you a manuscript that does some comparisons of 
>>>>>>> different demodulation schemes. I haven’t yet had time to distill it 
>>>>>>> down to any simple wisdom - maybe you’ll get something useful out of it.
>>>>>>> 
>>>>>>> 73, Steve k9an
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> On Sep 11, 2015, at 8:54 AM, Joe Taylor <j...@princeton.edu> wrote:
>>>>>>>> Hi Steve,
>>>>>>>> 
>>>>>>>> I finally found time for a quick look at "sfrsd", your drop-in
>>>>>>>> replacement for kvasd that uses the stochastic Chase algorith.
>>>>>>>> 
>>>>>>>> I compiled and ran it on a few test cases this morning, and (as
>>>>>>>> will be no surprise to you) found that it works, and it succeeds
>>>>>>>> in some cases where the hard-decision Berlekamp-Massey algorithm
>>>>>>>> fails.  Just like kvasd... and no patents, non-disclosure
>>>>>>>> agreements, or non-open source code to worry about!  Very impressive!!
>>>>>>>> 
>>>>>>>> I have not yet done any thorough tests of sensitivity relative to
>>>>>>>> the Koetter-Vardy algorithm.  Have you?  Are there any
>>>>>>>> theoretical reasons to expect that it should be (or not be) as good as 
>>>>>>>> K-V?
>>>>>>>> 
>>>>>>>> I will do further tests, as time permits.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On another matter, somewhat along the same lines:
>>>>>>>> 
>>>>>>>> Have you looked at all at the way I am presently decoding the MSK
>>>>>>>> signals in JTMSK?  Especially since about r5848, I think the
>>>>>>>> decoder is pretty good; but since the demodulation process does
>>>>>>>> not yet take full advantage of signal coherency or the inherent 
>>>>>>>> symbol-to-symbol "memory"
>>>>>>>> in MSK modulation, I think a still better decoder is possible.
>>>>>>>> 
>>>>>>>>   From reading Proakis I'm aware that (quite apart from the
>>>>>>>> Viterbi algorithm used to decode the K=13, r=1/2 convolutional
>>>>>>>> code of
>>>>>>>> JTMSK) a Viterbi algorithm could also be used as an optimum
>>>>>>>> receiver for these continuous-phase signals.  I also understand
>>>>>>>> that using modulation index
>>>>>>>> h=0.715 (rather than the h=0.5 of MSK) might have advantages
>>>>>>>> while still requiring bandwith no more than 2 kHz.
>>>>>>>> 
>>>>>>>> Do you have any opinions here?  Any interest in looking into
>>>>>>>> these questions further?
>>>>>>>> 
>>>>>>>>        -- 73, Joe, K1JT
> 
> 
> ------------------------------------------------------------------------------
> _______________________________________________
> wsjt-devel mailing list
> wsjt-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wsjt-devel


------------------------------------------------------------------------------
_______________________________________________
wsjt-devel mailing list
wsjt-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wsjt-devel

Reply via email to