?? mpa_synth.s
字號:
/*
* mpa_synth.s
*
* MPEG/audio multichannel decoder.
* Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
*
*/
.include "mpa.h"
.secFILE_mpa_synth
/********************************************************************
Function: MPG_synthesis_subband
Description:
Filtering is a two-level implementation of Lee's fast-DCT algorithm.
The 32 input values are split in two 16-value vectors using an
even butterfly and an odd butterfly. The odd values are taken
through Lee's odd path using a 16x16 DCT matrix and appropriate
scaling. The even values are further split into two 8-value
vectors using even and odd butterflies into ee and eo.
The ee values are fed through an 8x8 DCT matrix while the eo
values are fed through the odd path using dct_even_odd_8x8.
Arguments:
rp0: in - synthesis buffer start pointer
rp3: in - 32 fraction data buffer pointer
rp1: out - synthesis output buffer (pcm data)
rp2: out - dct output buffer
index registers:
@bank0
d1 d0 s1 s0
---------------------------------------
sd0: -64 1 32 1,-1,96
sd1: x 1 x x
sd2: 2 4 -1 1
sd3: -2 -1 32 33
********************************************************************/
MPG_synthesis_subband::
eld d, rp0
er xsd
esd0 s0, #1
; input butterflies - level 1
ld r6, #15
eld rp0, rp3
erpn rp3, #31
eld mc0, #(2<<10) | 15
es me0
level1 eld p, @rp3+s1
eld ma0, p, a, @rp0+s1
eadd a, ma0, ma0, @rp0+s1
esub ma0, p, @rp0+d0, a ; even[i]
bnzd r6, level1
eld @rp3+d0, ma0 ; odd[i]
; input butterflies - level 2
ld r6, #7
eld mc0, #(1<<10) | 7
level2 eld p, @rp3+s1
eld ma0, p, a, @rp0+s1
eadd a, ma0, ma0, @rp0+s1
esub ma0, p, @rp0+d0, a ; ee[i]
bnzd r6, level2
eld @rp3+d0, ma0 ; eo[i]
; dct 8: even-even part
ld r6, #7
eld rp2, #synth_dct32
eld rp3, #dct_even_even_8x8
eld mc1, #(3<<10) | 31
es me2
eld x0, @rp0+s0, y0, @rp3+s0
emul x0y0, x0, @rp0+s0, y0, @rp3+s0
even_even emld ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
bnzd r6, even_even
eld @rp2+d0, ma0 ; out[i], i=0,4,8,12,16,20,24,28
; dct 8: even-odd part
ld r6, #7
er me0
erpn rp0, #13
erpd rp2+d1
erpd rp3+d1 ; dct_even_odd_8x8
esd0 s0, #-1
es me0
eld x0, @rp0+s0, y0, @rp3+s0
emul x0y0, x0, @rp0+s0, y0, @rp3+s0
even_odd emld ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
bnzd r6, even_odd
eld @rp2+d0, ma0 ; out[i], i=2,6,10,14,18,22,26,30
; dct 16: odd part
ld r6, #15
er me0
erpn rp0, #18
erpd rp3+d1 ; dct_odd_16x16
erps rp2+s1
eld mc0, #(2<<10) | 15 ; modulo 16
es me0
eld x0, @rp0+s0, y0, @rp3+s0
emul x0y0, x0, @rp0+s0, y0, @rp3+s0
odd emld ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s0
bnzd r6, odd
eld @rp2+d1, ma0 ; out[i], i=1,3,5,...,31
; expansion 64 samples
er me0
er me2
eld rp0, d ; synthesis_buffer[ch][1024]
erps rp2+s1 ; synth_dct32
eld rp3, rp0
erpn rp0, #48
erpn rp3, #47
eld a, @rp2+s0 ; dct32[0]
eneg a
eld @rp0+d0, a ; out[48]
ld r6, #14
%1 eld a, @rp2+s0 ; dct32[1 ~ 15]
eneg a
eld @rp0+d0, a ; out[49 ~ 63]
bnzd r6, %b1
eld @rp3+d0, a ; out[47 ~ 33]
eld rp0, d
ld r6, #15
%2 eld a, @rp2+s0
eld @rp0+d0, a ; out[0 ~ 15]
eneg a
bnzd r6, %b2
eld @rp3+d0, a ; out[32 ~ 17]
eld a, #0
eld @rp0+d0, a ; out[16]
; windowing and overlab add
ld r6, #31
esd0 s0, #0
es xsd
eld rp0, d
eld rp3, #synthesis_window_Di
eld mc0, #(0<<10) | 1023
eld mc1, #(7<<10) | 511
es me0
es me3
eld x0, @rp0+s0, y0, @rp3+s1
emul x0y0, x0, @rp0+s1, y0, @rp3+s1
overlab_add emld ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s1, y0, @rp3+s0
erpd rp0+d0
emad ma0, x0y0, x0, @rp0+s0, y0, @rp3+s1
emad ma0, x0y0, x0, @rp0+s1, y0, @rp3+s1
; scale up by 2 and restore pcm data to fraction buffer for downmix
esla ma0
esla ma0
bnzd r6, overlab_add
eld @rp1+d0, ma0
eld rp0, d
erpd rp0+d1
er me0
retd
er me3
.end
/*
.ifndef __FAST_SYNTHESIS
esra8 a
eincc a
; 16-bit saturation
ecp a, #0x7fff
etst neg, ec3
bra ec3, output_pcm_sample
eld a, #0x7fff
.endif
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -