Yalac - Comparisons
Reply #313 – 2006-09-27 14:55:01
Do you mean this statement: "...Possibly it works better if only one Lpc-Filter is beeing used. But yalac currently sends the signal through up to 4 different filters...."? yeah, i thought about predictors when you mean different filters, and next time i read more careful!The signal may go through up to 4 filters: 1) Initial filtering 2) PreFilter (optional) 3) Channel decorrelation (optional) 4) Linear prediction ok, then a cascaded weighting is not really useful if you only do one stage of linear predictionI would expect an weighting approach of different parallel filters to be most efficient, if it is adapting very fast to changes of the signal characteristics. Because it isn't efficient to store the updated filter parameters and weights too frequently into the bit stream, you would have to perform the adaption on the encoder and decoder side to avoid the need to store the parameters. i think that the weighting of a cascade is better because it's more stable against sudden changes in signal characteristics. you can look at a cascade as some sort of parallel filters too P0 = predictor of the first stage P1 = predictor of the next stage PW = weight0 * P0 + weight1 * P1 // weight the cascade or PW = weight0 * P0 + weight1 * (P0+P1) // weight them paralellBut i don't want the decoder to perform any (continous) adaption, because 1) it would be slower and 2) i suppose, that it is far more probable to run into patent issues witch such adaptive approaches. Hence abolutely no adaption in the decoder and only a block (subframe) based adaption in the encoder. the algorithm i mentioned is extreme simple. it's used in MP4ALS btw. here's some C pseudo codeweight0 = weight1 = weight2 = init_weight for (i=0;i<NumSamples;i++) { P0 = first stage predictor P1 = second stage predictor P2 = third stage predictor PW = (weight0 * P0 + weight1 * P1 + weight2 * P2) >> Shift Error = Input - PW if (Error > 0) { (P0<0)?weight0--:weight0++; (P1<0)?weight1--:weight1++; (P2<0)?weight2--:weight2++; } else if (Error < 0) { (P0<0)?weight0++:weight0--; (P1<0)?weight1++:weight1--; (P2<0)?weight2++:weight2--; } }