100 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* CHANNEL.C - Procedures and variables regarding channels. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Copyright (c) 1995-2012 by Radford M. Neal.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Permission is granted for anyone to copy, use, modify, and distribute
							 | 
						||
| 
								 | 
							
								 * these programs and accompanying documents for any purpose, provided
							 | 
						||
| 
								 | 
							
								 * this copyright notice is retained and prominently displayed, and note
							 | 
						||
| 
								 | 
							
								 * is made of any changes made to these programs.  These programs and
							 | 
						||
| 
								 | 
							
								 * documents are distributed without any warranty, express or implied.
							 | 
						||
| 
								 | 
							
								 * As the programs were written for research purposes only, they have not
							 | 
						||
| 
								 | 
							
								 * been tested to the degree that would be advisable in any important
							 | 
						||
| 
								 | 
							
								 * application.  All use of these programs is entirely at the user's own
							 | 
						||
| 
								 | 
							
								 * risk.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <math.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "channel.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* GLOBAL VARIABLES.  Declared in channel.h. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								channel_type channel;	/* Type of channel */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								double error_prob;	/* Error probability for BSC */
							 | 
						||
| 
								 | 
							
								double std_dev;		/* Noise standard deviation for AWGN */
							 | 
						||
| 
								 | 
							
								double lwidth;		/* Width of noise distribution for AWLN */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* PARSE A COMMAND-LINE SPECIFICATION OF A CHANNEL.  Takes a pointer to an
							 | 
						||
| 
								 | 
							
								   argument list and an argument count; returns the number of arguments that 
							 | 
						||
| 
								 | 
							
								   make up a channel specification at this point in the command line.  Returns
							 | 
						||
| 
								 | 
							
								   zero if the argument list does not start with a channel specification.
							 | 
						||
| 
								 | 
							
								   Returns -1 if there seems to be a channel specification here, but it's 
							 | 
						||
| 
								 | 
							
								   invalid.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   Sets the variables declared in channel.h to the type and parameters of
							 | 
						||
| 
								 | 
							
								   the channel.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int channel_parse
							 | 
						||
| 
								 | 
							
								( char **argv,		/* Pointer to argument list */
							 | 
						||
| 
								 | 
							
								  int argc		/* Number of arguments in list */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{ 
							 | 
						||
| 
								 | 
							
								  char junk;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (argc==0) return 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (strcmp(argv[0],"bsc")==0  || strcmp(argv[0],"BSC")==0)
							 | 
						||
| 
								 | 
							
								  { 
							 | 
						||
| 
								 | 
							
								    channel = BSC;
							 | 
						||
| 
								 | 
							
								    if (argc<2 || sscanf(argv[1],"%lf%c",&error_prob,&junk)!=1 
							 | 
						||
| 
								 | 
							
								     || error_prob<=0 || error_prob>=1)
							 | 
						||
| 
								 | 
							
								    { return -1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    { return 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  else if (strcmp(argv[0],"awgn")==0 || strcmp(argv[0],"AWGN")==0)
							 | 
						||
| 
								 | 
							
								  { 
							 | 
						||
| 
								 | 
							
								    channel = AWGN;
							 | 
						||
| 
								 | 
							
								    if (argc<2 || sscanf(argv[1],"%lf%c",&std_dev,&junk)!=1 
							 | 
						||
| 
								 | 
							
								     || std_dev<=0)
							 | 
						||
| 
								 | 
							
								    { return -1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    { return 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  else if (strcmp(argv[0],"awln")==0 || strcmp(argv[0],"AWLN")==0)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    channel = AWLN;
							 | 
						||
| 
								 | 
							
								    if (argc<2 || sscanf(argv[1],"%lf%c",&lwidth,&junk)!=1 
							 | 
						||
| 
								 | 
							
								     || lwidth<=0)
							 | 
						||
| 
								 | 
							
								    { return -1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    { return 2;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								  { 
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* PRINT USAGE MESSAGE REGARDING CHANNEL SPECIFICATIONS. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void channel_usage(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  fprintf(stderr,
							 | 
						||
| 
								 | 
							
								    "Channel: bsc error-probability | awgn standard-deviation | awln width\n");
							 | 
						||
| 
								 | 
							
								}
							 |