Hello all, The attached patch quite noticeably minimizes rounding errors and improves audio quality. I decided to drop non-SIMD variant because it would require quite a bit of work to update for better precision. Most of the CPU cores which are relevant nowadays have support for some kind of SIMD extension anyway. I will also do ARMv6 SIMD version of the analysis filter after all the high level SBC optimizations are in place. Audio quality estimation done with tiny_psnr (lower stddev value is better): === before patch (4 subbands) === ./sbc_encode_test.rb BigBuckBunny-stereo.flac [2, 48000] ["-j -s4 -B16 -b128", "-p -j -l16 -n4 -r1584000"] --- comparing original / sbcenc + sbcdec --- stddev: 3.58 PSNR: 85.23 bytes:114519660/114520000 --- comparing original / sbcenc + sbc_decoder.exe --- stddev: 1.70 PSNR: 91.71 bytes:114519660/114520000 --- comparing original / sbc_encoder.exe + sbc_decoder.exe --- stddev: 1.44 PSNR: 93.09 bytes:114519660/114520000 --- comparing sbcenc + sbc_decoder.exe / sbc_encoder.exe + sbc_decoder.exe stddev: 0.99 PSNR: 96.36 bytes:114519808/114519808 === after patch (4 subbands) === ./sbc_encode_test.rb BigBuckBunny-stereo.flac [2, 48000] ["-j -s4 -B16 -b128", "-p -j -l16 -n4 -r1584000"] --- comparing original / sbcenc + sbcdec --- stddev: 3.55 PSNR: 85.31 bytes:114519660/114520000 --- comparing original / sbcenc + sbc_decoder.exe --- stddev: 1.62 PSNR: 92.09 bytes:114519660/114520000 --- comparing original / sbc_encoder.exe + sbc_decoder.exe --- stddev: 1.44 PSNR: 93.09 bytes:114519660/114520000 --- comparing sbcenc + sbc_decoder.exe / sbc_encoder.exe + sbc_decoder.exe stddev: 0.77 PSNR: 98.57 bytes:114519808/114519808 === before patch (8 subbands) === ./sbc_encode_test.rb BigBuckBunny-stereo.flac [2, 48000] ["-j -s8 -B16 -b255", "-p -j -l16 -n8 -r1569000"] --- comparing original / sbcenc + sbcdec --- stddev: 4.85 PSNR: 82.60 bytes:114519260/114520000 --- comparing original / sbcenc + sbc_decoder.exe --- stddev: 2.07 PSNR: 89.98 bytes:114519260/114520000 --- comparing original / sbc_encoder.exe + sbc_decoder.exe --- stddev: 1.09 PSNR: 95.56 bytes:114519260/114520000 --- comparing sbcenc + sbc_decoder.exe / sbc_encoder.exe + sbc_decoder.exe stddev: 1.77 PSNR: 91.34 bytes:114519552/114519552 === after patch (8 subbands) === ./sbc_encode_test.rb BigBuckBunny-stereo.flac [2, 48000] ["-j -s8 -B16 -b255", "-p -j -l16 -n8 -r1569000"] --- comparing original / sbcenc + sbcdec --- stddev: 4.55 PSNR: 83.16 bytes:114519260/114520000 --- comparing original / sbcenc + sbc_decoder.exe --- stddev: 1.28 PSNR: 94.11 bytes:114519260/114520000 --- comparing original / sbc_encoder.exe + sbc_decoder.exe --- stddev: 1.09 PSNR: 95.56 bytes:114519260/114520000 --- comparing sbcenc + sbc_decoder.exe / sbc_encoder.exe + sbc_decoder.exe stddev: 0.73 PSNR: 98.96 bytes:114519552/114519552 === So for 4 subbands encode, stddev is down from 1.70 to 1.62 (1.44 for the reference encoder). For 8 subbands encode stddev is down from 2.07 to 1.28 (1.09 for the reference encoder). It is very interesting to see what a more advanced PEAQ test will show. Best regards, Siarhei Siamashka