Stefano, Correction to my previous email: The values for the Viterbi decoder are: "Sure 1" is 255, "Sure 0" is 0 and 127 is "neither 1 nor 0". Sorry for the confusion. 73, John On Wed, Feb 1, 2012 at 3:10 PM, John Douyere <vk2eta@xxxxxxxxx> wrote: > Hi Stefano, > > I can comment on the code. > > The Viterbi decoder is capable of handling "soft bits" meaning that we can > feed it with variable values that represent how certain we are that they > represent a 1 or a 0. > > The coding is done such that +127 represents a "very sure 1", -128 a "very > sure zero" and 0 (or 1) a "not sure if it is a 1 or a 0". > > That helps the decoder make soft decisions as to which value (binary 0 or > 1) is more likely to be the correct one. > > So here I use two criteria: > > 1. The angle is first: BPSK modulation is coded as 0 or 180 degree angle > phases and therefore I use the angle as the first criteria: 0 or 180 degree > decoded angle = "very sure 0 or 1" and 90 degrees is "either 0 or 1", then > for anything in between the certainty is proportional to the deviation from > 90 degrees. > > 2. The amplitude: the concept being that is the received signal is faint > due to selective fading for example then the amplitude will be smaller than > the average signal and therefore we should apply some "discounting" to the > credibility of the phase information. > > In my tests, using the soft decoding algorithm improves the robustness of > the signal to white noise by around 1 dB which may not be much but adds to > the whole coding gain. > > Do you have a project in mind? > > Hope this helps, > > 73, John > > > On 01/02/2012 7:24 AM, "Stefano" <stefano.banti@xxxxxxxx> wrote: > >> Hi all, >> >> I'm a sporadic user of pskmail, software developer and ham radio op as >> well; I'm looking at the source code of fldigi because I'm interested in >> the pskr software modem implementation. >> Can someone explain (shortly) the method used for the 4-level softbit >> quantizer ? Or give a reference to find mathematics involved ? >> >> ... >> averageamp = decayavg(averageamp, sigamp, SQLDECAY); >> if (sigamp > 0 && averageamp > 0) { >> softamp = clamp( averageamp / sigamp, 1.0, 1e6); >> } else { >> softamp = 1; // arbritary number (50% impact) >> } >> // Compute values between -128 and +127 for phase value only >> if (phase > M_PI) { >> softangle = (127 - (((2 * M_PI - phase) / M_PI) * (double) >> 255)); >> } else { >> softangle = (127 - ((phase / M_PI) * (double) 255)); >> } >> // Then apply impact of amplitude. Finally, re-centre on 127-128 >> // as the decoder needs values between 0-255 >> softbit = (unsigned char) ((softangle / (1 + softamp)) - 127); >> ... >> >> many thanks in advance >> Stefano ik2yxt. >> >> >>