| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  | // q65_subs.c
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Fortran interface for Q65 codec
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    To encode a Q65 message: | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |    integer x(13)        !Message payload, 78 bits as 13 six-bit integers | 
					
						
							|  |  |  |    integer y(63)        !Codeword, 63 six-bit integers | 
					
						
							|  |  |  |    call q65_enc(imsg,icodeword) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    To decode a Q65 message: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    parameter (LL=64,NN=63) | 
					
						
							|  |  |  |    real s3(LL,NN)        !Received energies | 
					
						
							|  |  |  |    real s3prob(LL,NN)    !Symbol-value probabilities | 
					
						
							|  |  |  |    integer APmask(13) | 
					
						
							|  |  |  |    integer APsymbols(13) | 
					
						
							|  |  |  |    real snr2500 | 
					
						
							|  |  |  |    integer xdec(13)      !Decoded 78-bit message as 13 six-bit integers | 
					
						
							|  |  |  |    integer irc           !Return code from q65_decode() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    call q65_dec(s3,APmask,APsymbols,s3prob,snr2500,xdec,irc) | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "qra15_65_64_irr_e23.h"	// QRA code used by Q65
 | 
					
						
							|  |  |  | #include "q65.h"
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static q65_codec_ds codec; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void q65_enc_(int x[], int y[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static int first=1; | 
					
						
							|  |  |  |   if (first) { | 
					
						
							|  |  |  |     // Set the QRA code, allocate memory, and initialize
 | 
					
						
							|  |  |  |     int rc = q65_init(&codec,&qra15_65_64_irr_e23); | 
					
						
							|  |  |  |     if (rc<0) { | 
					
						
							|  |  |  |       printf("error in q65_init()\n"); | 
					
						
							|  |  |  |       exit(0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     first=0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   // Encode message x[13], producing codeword y[63]
 | 
					
						
							|  |  |  |   q65_encode(&codec,y,x); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-23 06:03:59 +01:00
										 |  |  | void q65_intrinsics_ff_(float s3[], int* submode, float* B90Ts, | 
					
						
							| 
									
										
										
										
											2020-10-28 09:28:50 -04:00
										 |  |  | 			int* fadingModel, float s3prob[]) | 
					
						
							| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Input:   s3[LL,NN]       Received energies
 | 
					
						
							| 
									
										
										
										
											2020-10-27 13:56:25 -04:00
										 |  |  |  *          submode         0=A, 4=E | 
					
						
							|  |  |  |  *          B90             Spread bandwidth, 90% fractional energy | 
					
						
							|  |  |  |  *          fadingModel     0=Gaussian, 1=Lorentzian | 
					
						
							| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  |  * Output:  s3prob[LL,NN]   Symbol-value intrinsic probabilities | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int rc; | 
					
						
							| 
									
										
										
										
											2020-10-27 12:02:49 -04:00
										 |  |  |   static int first=1; | 
					
						
							| 
									
										
										
										
											2020-10-27 15:52:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 12:02:49 -04:00
										 |  |  |   if (first) { | 
					
						
							|  |  |  |     // Set the QRA code, allocate memory, and initialize
 | 
					
						
							|  |  |  |     int rc = q65_init(&codec,&qra15_65_64_irr_e23); | 
					
						
							|  |  |  |     if (rc<0) { | 
					
						
							|  |  |  |       printf("error in q65_init()\n"); | 
					
						
							|  |  |  |       exit(0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     first=0; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-11-23 06:03:59 +01:00
										 |  |  |   rc = q65_intrinsics_fastfading(&codec,s3prob,s3,*submode,*B90Ts,*fadingModel); | 
					
						
							| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  |   if(rc<0) { | 
					
						
							|  |  |  |     printf("error in q65_intrinsics()\n"); | 
					
						
							|  |  |  |     exit(0); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-10-28 09:28:50 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | void q65_dec_(float s3[], float s3prob[], int APmask[], int APsymbols[], | 
					
						
							| 
									
										
										
										
											2021-02-23 16:13:46 -05:00
										 |  |  | 	      int* maxiters0, float* esnodb0, int xdec[], int* rc0) | 
					
						
							| 
									
										
										
										
											2020-10-28 09:28:50 -04:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-22 13:58:29 -05:00
										 |  |  | /* Input:   s3[LL,NN]       Symbol spectra
 | 
					
						
							|  |  |  |  *          s3prob[LL,NN]   Symbol-value intrinsic probabilities | 
					
						
							| 
									
										
										
										
											2020-10-28 09:28:50 -04:00
										 |  |  |  *          APmask[13]      AP information to be used in decoding | 
					
						
							|  |  |  |  *          APsymbols[13]   Available AP informtion | 
					
						
							|  |  |  |  * Output:   | 
					
						
							| 
									
										
										
										
											2020-11-22 13:58:29 -05:00
										 |  |  |  *          esnodb0         Estimated Es/No (dB) | 
					
						
							| 
									
										
										
										
											2020-10-28 09:28:50 -04:00
										 |  |  |  *          xdec[13]        Decoded 78-bit message as 13 six-bit integers | 
					
						
							|  |  |  |  *          rc0             Return code from q65_decode() | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int rc; | 
					
						
							|  |  |  |   int ydec[63]; | 
					
						
							|  |  |  |   float esnodb; | 
					
						
							| 
									
										
										
										
											2021-02-23 16:13:46 -05:00
										 |  |  |   int maxiters=*maxiters0; | 
					
						
							| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-23 16:13:46 -05:00
										 |  |  |   rc = q65_decode(&codec,ydec,xdec,s3prob,APmask,APsymbols,maxiters); | 
					
						
							| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  |   *rc0=rc; | 
					
						
							| 
									
										
										
										
											2020-10-27 15:52:26 -04:00
										 |  |  |   // rc = -1:  Invalid params
 | 
					
						
							|  |  |  |   // rc = -2:  Decode failed
 | 
					
						
							|  |  |  |   // rc = -3:  CRC mismatch
 | 
					
						
							| 
									
										
										
										
											2020-10-30 14:52:58 -04:00
										 |  |  |   *esnodb0 = 0.0;             //Default Es/No for a failed decode
 | 
					
						
							| 
									
										
										
										
											2020-10-27 15:52:26 -04:00
										 |  |  |   if(rc<0) return; | 
					
						
							| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-27 16:08:50 -04:00
										 |  |  |   rc = q65_esnodb_fastfading(&codec,&esnodb,ydec,s3); | 
					
						
							| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  |   if(rc<0) { | 
					
						
							|  |  |  |     printf("error in q65_esnodb_fastfading()\n"); | 
					
						
							|  |  |  |     exit(0); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-10-30 14:52:58 -04:00
										 |  |  |   *esnodb0 = esnodb; | 
					
						
							| 
									
										
										
										
											2020-10-26 16:54:05 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-11-22 13:58:29 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | void q65_dec_fullaplist_(float s3[], float s3prob[], int codewords[], | 
					
						
							| 
									
										
										
										
											2020-11-30 09:52:47 -05:00
										 |  |  | 	    int* ncw, float* esnodb0, int xdec[], float* plog, int* rc0) | 
					
						
							| 
									
										
										
										
											2020-11-22 13:58:29 -05:00
										 |  |  | { | 
					
						
							|  |  |  | /* Input:   s3[LL,NN]         Symbol spectra
 | 
					
						
							|  |  |  |  *          s3prob[LL,NN]     Symbol-value intrinsic probabilities | 
					
						
							|  |  |  |  *          codewords[63,ncw] Full codewords to search for | 
					
						
							|  |  |  |  *          ncw               Number of codewords | 
					
						
							|  |  |  |  * Output:   | 
					
						
							|  |  |  |  *          esnodb0           Estimated Es/No (dB) | 
					
						
							|  |  |  |  *          xdec[13]          Decoded 78-bit message as 13 six-bit integers | 
					
						
							|  |  |  |  *          rc0               Return code from q65_decode() | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int rc; | 
					
						
							|  |  |  |   int ydec[63]; | 
					
						
							|  |  |  |   float esnodb; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   rc = q65_decode_fullaplist(&codec,ydec,xdec,s3prob,codewords,*ncw); | 
					
						
							| 
									
										
										
										
											2020-11-30 09:52:47 -05:00
										 |  |  |   *plog=q65_llh; | 
					
						
							| 
									
										
										
										
											2020-11-22 13:58:29 -05:00
										 |  |  |   *rc0=rc; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   // rc = -1:  Invalid params
 | 
					
						
							|  |  |  |   // rc = -2:  Decode failed
 | 
					
						
							|  |  |  |   // rc = -3:  CRC mismatch
 | 
					
						
							|  |  |  |   *esnodb0 = 0.0;             //Default Es/No for a failed decode
 | 
					
						
							|  |  |  |   if(rc<0) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   rc = q65_esnodb_fastfading(&codec,&esnodb,ydec,s3); | 
					
						
							|  |  |  |   if(rc<0) { | 
					
						
							|  |  |  |     printf("error in q65_esnodb_fastfading()\n"); | 
					
						
							|  |  |  |     exit(0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   *esnodb0 = esnodb; | 
					
						
							|  |  |  | } |