README.Trimedia 6.18 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
################# REMOVE warnings on trimedia compiler 	##############################
################# Not critical to compilation			##############################

1. Change the following statements to remove warning for constant expression
(i)		mdf.c			[if(0) --> #if 0]
(ii)	ltp.c			[if(1) --> #if 1]
(iii)	preprocess.c	[if(1) --> #if 1]
(iv)	sb_celp.c		[if (SPEEX_SET_VBR_MAX_BITRATE<1) --> #if (SPEEX_SET_VBR_MAX_BITRATE<1)]

2. add REMARK_ON macro to remove warning on not reference variable
-- uses (void)<variable> to remove warning on not referenced variable
-- #define REMARK_ON
--	  (void)<variable>
-- #endif
-- search for REMARK_ON on the following files 
(i)		jitter.c
(ii)	lsp.c
(iii)	ltp.c
(iv)	mdf.c
(v)		filters.c
(vi)	filterbank.c
(vii)	cb_search.c
(viii)	vq.c
(ix)	vbr.c
(x)		stereo.c
(xi)	speex_callbacks.c
(xii)	preprocess.c

3. commented out the following in pseudofloat.h for unused variable
//static const spx_float_t FLOAT_HALF = {16384,-15};

4. commented out unused variable in nb_celp.c
//spx_word16_t *sp; ***unused variable***
//sp=out+offset; ***unused variable***
//int submode; ***unused variable***
// ***unused variable***
// advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
advance = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
// ***unused variable***
//advance = submode = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
advance = speex_bits_unpack_unsigned(bits, SB_SUBMODE_BITS);
// spx_word16_t *exc; ***unused variable*** 
// exc=st->exc+offset; ***unused variable***

5. commented out unused variable in vbr.c
//int va; ***unused variable***
//va = 0; ***unused variable***
//va = 1; ***unused variable***

6. added HAVE_CONFIG into medfilter.c

################# Patches for trimedia compiler 		##############################
################# Critical to compilation				##############################
-- change the following in modes.c and speex.h as compiler does not support const * const...
(i) modes.c
#ifdef __TCS__
const SpeexMode * speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode};
#else
const SpeexMode * const speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode};
#endif

(ii) speex.h
#ifdef __TCS__
extern const SpeexMode * speex_mode_list[SPEEX_NB_MODES];
#else
extern const SpeexMode * const speex_mode_list[SPEEX_NB_MODES];
#endif

-- added the #elif defined (TM_ASM) to the following files for optimized codes
(1)		arch.h 
(2)		cb_search.c
(3)		fftwrap.c
(4)		filterbank.c
(5)		filters.c
(6) 	kiss_fft.c
(7)		kiss_fftr.c
(8)		lpc.c
(9)		lsp.c
(10)	ltp.c
(11)	mdf.c
(12)	misc.c
(13)	preprocess.c
(14)	quant_lsp.c
(15)	vq.c

-- reorder macro definations in quant_lsp.c
#ifdef FIXED_POINT

#define LSP_LINEAR(i)		(SHL16(i+1,11))
#define LSP_LINEAR_HIGH(i)	(ADD16(MULT16_16_16(i,2560),6144))
#define LSP_DIV_256(x)		(SHL16((spx_word16_t)x, 5))
#define LSP_DIV_512(x)		(SHL16((spx_word16_t)x, 4))
#define LSP_DIV_1024(x)		(SHL16((spx_word16_t)x, 3))
#define LSP_PI				25736

#else

#define LSP_LINEAR(i)		(.25*(i)+.25)
#define LSP_LINEAR_HIGH(i)	(.3125*(i)+.75)
#define LSP_SCALE			256.
#define LSP_DIV_256(x)		(0.0039062*(x))
#define LSP_DIV_512(x)		(0.0019531*(x))
#define LSP_DIV_1024(x)		(0.00097656*(x))
#define LSP_PI				M_PI

#endif

#ifdef BFIN_ASM
#include "quant_lsp_bfin.h"
#elif defined (TM_ASM)
#include "quant_lsp_tm.h"
#endif

-- added macro PREPROCESS_MDF_FLOAT to allow using of floating point 
-- in mdf and preprocess while keeping fixed point in encoder/decoder
-- This is due to the fact that preprocess/mdf run faster on floating
-- point on trimedia
-- added the following 3 lines to the files below
#ifdef PREPROCESS_MDF_FLOAT
#undef FIXED_POINT
#endif
(1) mdf.c
(2) preprocess.c
(3) filterbank.c
(4) fftwrap.c
(5) kiss_fft.c
(6) kiss_fftr.c

-- created a new USE_COMPACT_KISS_FFT for fftwrap.c and shifted defination 
-- to config file so that user configure the usage of fft on config.h
-- TOEXPLORE:is it possible to share table between mdf/preprocess?
-- Introducing this macro made the following changes in C code 
-- New macro to facilitate integration
(grouping real/complex for dc and nyquist frequency seems to require a large
amount of memory for mdf, therefore did not made the changes for that)
(1) modify preprocess.c on init and destroy
(2) modify mdf.c on init and destroy
(3) shifted power_spectrum to fftwrap.c to share optimised code between
	preprocess.c and mdf.c
	
################# NOTES 								##############################
(1) fixed point encoding/decoding is tested on narrowband
	-	some of the QX fractions are packed together to 
			(frac1 * a + frac2 * a) >> X (should be more accurate in rounding)
		instead of 
			((frac1 * a) >> X) + ((frac2 * a) >> X)
		will cause some different between optimized and unoptimized code.
		tried decoding/encoding optimized code on some audio files retains 
		the clearity of the word
		
	- wideband/ultrawideband is not heavily tested yet
		
(2) optimized fixed point code requires memory alignment
	-	used config to debug on functions where memory is not align

(3) floating point optimization for preprocess/mdf is tested
	fixed point is not tested yet (except fft/filterbank)
	Note (1) also applies to sround in fft for fixed point
	some optimization is provided for fixed point as it requires lesser
	memory compared to floating point.
	
(4) unroll configurations provided to reduce code size if required

(5) use profile options only if compiler profiling fails to work 

(6) can't include the makefile as it is close proprietary

################# TODO:For Trimedia						##############################
(1) Possible add TSSA wrapper for codec but don't think this can be open source.
(2) Optimizations for fixed point in mdf/preprocess

################# Added Files							##############################
- _kiss_fft_guts_tm.h
- cb_search_tm.h
- fftwrap_tm.h
- filterbank_tm.h
- filters_tm.h
- fixed_tm.h
- kiss_fft_tm.h
- kiss_fftr_tm.h
- lpc_tm.h
- lsp_tm.h
- ltp_tm.h
- mdf_tm.h
- misc_tm.h
- preprocess_tm.h
- profile_tm.h
- quant_lsp_tm.h
- vq_tm.h
- config.h
- speex_config_types.h