* calculate the coefficients of the given sample and decode
*/
-char ss5_decode(unsigned char *data, int len)
+char ss5_decode(unsigned char *data, int len, double *_quality)
{
signed short buf[len];
signed long sk, sk1, sk2, low, high;
int k, n, i;
int f1 = 0, f2 = 0;
- double result[NCOEFF], power, noise, snr;
+ double result[NCOEFF], power, noise;
signed long long cos2pik_;
char digit = ' ';
+ double quality;
/* convert samples */
for (i = 0; i < len; i++)
}
}
- snr = 0;
+ quality = 0;
/* check one frequency */
if (result[f1] > TONE_MIN_DB /* must be at least -17 db */
&& result[f1]*SNR > noise) { /* */
digit = decode_one[f1];
if (digit != ' ')
- snr = result[f1] / noise;
+ quality = result[f1] / noise;
}
/* check two frequencies */
if (result[f1] > TONE_MIN_DB && result[f2] > TONE_MIN_DB /* must be at lease -17 db */
&& (result[f1]+result[f2])*SNR > noise) { /* */
digit = decode_two[f1][f2];
if (digit != ' ')
- snr = (result[f1]+result[f2]) / noise;
+ quality = (result[f1]+result[f2]) / noise;
}
/* debug powers */
#ifdef DEBUG_LEVELS
for (i = 0; i < NCOEFF; i++)
printf("%d:%3d %c ", i, (int)(result[i]*100), (f1==i || f2==i)?'*':' ');
- printf("N:%3d digit:%c snr=%3d\n", (int)(noise*100), digit, (int)(snr*100));
+ printf("N:%3d digit:%c quality=%3d%%\n", (int)(noise*100), digit, (int)(quality*100));
// if (result[f1]*TONE_DIFF_DB <= result[f2]) /* f2 must be not less than 5 db below f1 */
// printf("jo!");
#endif
+ if (_quality)
+ *_quality = quality;
return digit;
}