📄 viterbi615.c
字号:
/* K=15 r=1/6 Viterbi decoder with optional Intel or PowerPC SIMD * Copyright Feb 2004, Phil Karn, KA9Q */#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "fec.h"/* Create a new instance of a Viterbi decoder */void *create_viterbi615(int len){ find_cpu_mode(); switch(Cpu_mode){ case PORT: default: return create_viterbi615_port(len);#ifdef __VEC__ case ALTIVEC: return create_viterbi615_av(len);#endif#ifdef __i386__ case MMX: return create_viterbi615_mmx(len); case SSE: return create_viterbi615_sse(len); case SSE2: return create_viterbi615_sse2(len);#endif }}void set_viterbi615_polynomial(int polys[6]){ switch(Cpu_mode){ case PORT: default: set_viterbi615_polynomial_port(polys); break;#ifdef __VEC__ case ALTIVEC: set_viterbi615_polynomial_av(polys); break;#endif#ifdef __i386__ case MMX: set_viterbi615_polynomial_mmx(polys); break; case SSE: set_viterbi615_polynomial_sse(polys); break; case SSE2: set_viterbi615_polynomial_sse2(polys); break;#endif }}/* Initialize Viterbi decoder for start of new frame */int init_viterbi615(void *p,int starting_state){ switch(Cpu_mode){ case PORT: default: return init_viterbi615_port(p,starting_state);#ifdef __VEC__ case ALTIVEC: return init_viterbi615_av(p,starting_state);#endif#ifdef __i386__ case MMX: return init_viterbi615_mmx(p,starting_state); case SSE: return init_viterbi615_sse(p,starting_state); case SSE2: return init_viterbi615_sse2(p,starting_state);#endif }}/* Viterbi chainback */int chainback_viterbi615( void *p, unsigned char *data, /* Decoded output data */ unsigned int nbits, /* Number of data bits */ unsigned int endstate){ /* Terminal encoder state */ switch(Cpu_mode){ case PORT: default: return chainback_viterbi615_port(p,data,nbits,endstate);#ifdef __VEC__ case ALTIVEC: return chainback_viterbi615_av(p,data,nbits,endstate);#endif#ifdef __i386__ case MMX: return chainback_viterbi615_mmx(p,data,nbits,endstate); case SSE: return chainback_viterbi615_sse(p,data,nbits,endstate); case SSE2: return chainback_viterbi615_sse2(p,data,nbits,endstate);#endif }}/* Delete instance of a Viterbi decoder */void delete_viterbi615(void *p){ switch(Cpu_mode){ case PORT: default: delete_viterbi615_port(p); break;#ifdef __VEC__ case ALTIVEC: delete_viterbi615_av(p); break;#endif#ifdef __i386__ case MMX: delete_viterbi615_mmx(p); break; case SSE: delete_viterbi615_sse(p); break; case SSE2: delete_viterbi615_sse2(p); break;#endif }}/* Update decoder with a block of demodulated symbols * Note that nbits is the number of decoded data bits, not the number * of symbols! */int update_viterbi615_blk(void *p,unsigned char syms[],int nbits){ switch(Cpu_mode){ case PORT: default: return update_viterbi615_blk_port(p,syms,nbits);#ifdef __VEC__ case ALTIVEC: return update_viterbi615_blk_av(p,syms,nbits);#endif#ifdef __i386__ case MMX: return update_viterbi615_blk_mmx(p,syms,nbits); case SSE: return update_viterbi615_blk_sse(p,syms,nbits); case SSE2: return update_viterbi615_blk_sse2(p,syms,nbits);#endif }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -