mirror of
https://git.vladimir.cc/vladimir/libfec.git
synced 2026-08-25 17:27:34 +00:00
init commit
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
COPYRIGHT
|
||||
|
||||
This package is copyright 2004 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 2004, Phil Karn, KA9Q
|
||||
karn@ka9q.net
|
||||
http://people.qualcomm.com/karn
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user