121 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
COPYRIGHT
 | 
						|
 | 
						|
This package is copyright 2006 by Phil Karn, KA9Q. It may be used
 | 
						|
under the terms of the GNU Lesser General Public License (LGPL). See
 | 
						|
the file "lesser.txt" in this package for license details.
 | 
						|
 | 
						|
INTRODUCTION
 | 
						|
 | 
						|
This package provides a set of functions that implement several
 | 
						|
popular forward error correction (FEC) algorithms and several low-level routines
 | 
						|
useful in modems implemented with digital signal processing (DSP).
 | 
						|
 | 
						|
The following routines are provided:
 | 
						|
 | 
						|
1. Viterbi decoders for the following convolutional codes:
 | 
						|
 | 
						|
r=1/2 k=7 ("Voyager" code, now a widely used industry standard)
 | 
						|
r=1/2 k=9 (Used on the IS-95 CDMA forward link)
 | 
						|
r=1/6 k=15 ("Cassini" code, used by several NASA/JPL deep space missions)
 | 
						|
 | 
						|
2. Reed-Solomon encoders and decoders for any user-specified code.
 | 
						|
 | 
						|
3. Optimized encoder and decoder for the CCSDS-standard (255,223)
 | 
						|
Reed-Solomon code, with and without the CCSDS-standard "dual basis"
 | 
						|
symbol representation.
 | 
						|
 | 
						|
4. Compute dot product between a 16-bit buffer and a set of 16-bit
 | 
						|
coefficients. This is the basic DSP primitive for digital filtering
 | 
						|
and correlation.
 | 
						|
 | 
						|
4. Compute sum of squares of a buffer of 16-bit signed integers. This is
 | 
						|
useful in DSP for finding the total energy in a signal.
 | 
						|
 | 
						|
5. Find peak value in a buffer of 16-bit signed integers, useful for
 | 
						|
scaling a signal to prevent overflow.
 | 
						|
 | 
						|
SIMD SUPPORT
 | 
						|
 | 
						|
This package automatically makes use of various SIMD (Single
 | 
						|
Instruction stream, Multiple Data stream) instruction sets, when
 | 
						|
available: MMX, SSE and SSE2 on the IA-32 (Intel) architecture, and
 | 
						|
Altivec on the PowerPC G4 and G5 used by Power Macintoshes.
 | 
						|
 | 
						|
"Altivec" is a Motorola trademark; Apple calls it "Velocity Engine",
 | 
						|
and IBM calls it "VMX". Altivec is roughly comparable to SSE2 on the
 | 
						|
IA-32.
 | 
						|
 | 
						|
Many of the SIMD versions run more than an order of
 | 
						|
magnitude faster than their portable C versions. The available SIMD
 | 
						|
instruction sets, if any, are determined at run time and the proper
 | 
						|
version of each routine is automatically selected. If no SIMD
 | 
						|
instructions are available, the portable C version is invoked by
 | 
						|
default. On targets other than IA-32 and PPC, only the portable C
 | 
						|
version is built.
 | 
						|
 | 
						|
The SIMD-assisted versions generally produce the same results as the C
 | 
						|
versions, with a few minor exceptions. The Viterbi decoders in C have
 | 
						|
a very slightly greater Eb/No performance due to their use of 32-bit
 | 
						|
path metrics. On the other hand, the SIMD versions use the
 | 
						|
"saturating" arithmetic available in these instructions to avoid the
 | 
						|
integer wraparounds that can occur in C when argument ranges are not
 | 
						|
properly constrained. This applies primarily to the "dotprod" (dot
 | 
						|
product) function.
 | 
						|
 | 
						|
The MMX (MultiMedia eXtensions) instruction set was introduced on
 | 
						|
later Pentium CPUs; it is also implemented on the Pentium II and most
 | 
						|
AMD CPUs starting with the K6. SSE (SIMD Streaming Extensions) was
 | 
						|
introduced in the Pentium III; AMD calls it "3D Now! Professional".
 | 
						|
Intel introduced SSE2 on the Pentium 4, and it has been picked up by
 | 
						|
later AMD CPUs. SSE support implies MMX support, while SSE2 support
 | 
						|
implies both SSE and MMX support.
 | 
						|
 | 
						|
The latest IA-32 SIMD instruction set, SSE3 (also known as "Prescott
 | 
						|
New Instructions") was introduced in early 2004 with the latest
 | 
						|
("Prescott") revision of the Pentium 4. Relatively little was
 | 
						|
introduced with SSE3, and this library currently makes no use of it.
 | 
						|
 | 
						|
See the various manual pages for details on how to use the library
 | 
						|
routines.
 | 
						|
 | 
						|
Copyright 2006, Phil Karn, KA9Q
 | 
						|
karn@ka9q.net
 | 
						|
http://www.ka9q.net/
 | 
						|
 | 
						|
This software may be used under the terms of the GNU Lesser General
 | 
						|
Public License (LGPL); see the file lesser.txt for details.
 | 
						|
 | 
						|
Revision history:
 | 
						|
Version 1.0 released 29 May 2001
 | 
						|
 | 
						|
Version 2.0 released 3 Dec 2001:
 | 
						|
Restructured to add support for shared libraries.
 | 
						|
 | 
						|
Version 2.0.1 released 8 Dec 2001:
 | 
						|
Includes autoconf/configure script
 | 
						|
 | 
						|
Version 2.0.2 released 4 Feb 2002:
 | 
						|
Add SIMD version override options
 | 
						|
Test for lack of SSE2 mnemonic support in 'as'
 | 
						|
Build only selected version
 | 
						|
 | 
						|
Version 2.0.3 released 6 Feb 2002:
 | 
						|
Fix to parityb function in parity.h
 | 
						|
 | 
						|
feclib version 1.0 released November 2003
 | 
						|
Merged SIMD-Viterbi, RS and DSP libraries
 | 
						|
Changed SIMD Viterbi decoder to detect SSE2/SSE/MMX at runtime rather than build time
 | 
						|
 | 
						|
feclib version 2.0 (unreleased) Mar 2004
 | 
						|
General speedups and cleanups
 | 
						|
Switch from 4 to 8-bit input symbols on all Viterbi decoders
 | 
						|
Support for Altivec on PowerPC
 | 
						|
Support for k=15 r=1/6 Cassini/Mars Pathfinder/Mars Exploration Rover/STEREO code
 | 
						|
Changed license to GNU Lesser General Public License (LGPL)
 | 
						|
 | 
						|
feclib version 2.1 June 5 2006
 | 
						|
Added error checking, fixed alignment bug in SSE2 versions of Viterbi decoders causing segfaults
 | 
						|
 | 
						|
feclib version 2.1.1 June 6 2006
 | 
						|
Fix test/benchmark time measurement on Linux
 |