📄 mpa_lfe.s
字号:
/*
* mpa_lfe.s
*
* MPEG/audio multichannel decoder.
* Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
*
*/
.include "mpa.h"
.if( _DECODER_TYPE != MPEG_1_AUDIO )
.secFILE_mpa_lfe
/********************************************************************
Function: MC_II_lfe_dequantize
Description:
Arguments:
index registers:
@bank0
d1 d0 s1 s0
---------------------------------------
sd1: x 1 1 0
@bank1
d1 d0 s1 s0
---------------------------------------
sd3: x x x 17
audio buffer map (max 10 channels)
<------------ sample per each channel ------------>
+----+----+----+----+----+----+----+-----+----+----+
| Lo | L | Ls | C | Lc | Ro | R | Rs | LFE | Rc |
+----+----+----+----+----+----+----+-----+----+----+
... 1152 th sample of channel
********************************************************************/
MC_II_lfe_dequantize::
es psh1
es usm
es op
es opm
ebk #1000b
er xsd
esd3 s0, #1
es xsd
esd3 s0, #1
eld sd1, #0x0110
eld rp1, #lfe_fraction + 1
ld r6, #GRANULES-1
eld rpd1, #layer_info
eld a, rpd1.lfe_allocation
ecp a, #0
ebra ec0, no_lfe_dequant
eld b, rpd1.lfe_scalefactor
eld c, rpd1.alloc_tbl_ptr ; allocation table pointer
eld rp2, c
erpn rp2, a
eld d, @rp2 ; index
eld rp2, #scalefactor
erpn rp2, b
eld x1, @rp2 ; scale multiply factor
eld rp2, #II_MSB_position
erpn rp2, d
eld si, sr ; backup bit_buffer
ld r0, #0x80 ; high word of -1.0
; invert most significant bit, extend sign, dequantize sample
; then scale to fixed format
dequantize_lfe_sample
eld rp3, rp2
eld a, @rp3+s0
eld b, @rp1+s0
esft b, a ; si: sample
etst c, ec3 ; check msb is +/-
brad ec3, %f1
eld b, #0 ; 0.0
ecld bh, r0 ; -1.0
%1 eld a, #-1
esft sr, a
eadd b, sr ; 2's complement sample
; dequantize the sample, s" = C * (s"' + D)
eld ma0, @rp3+s0 ; dequant_coeff_D
eadd b, ma0, y1, @rp3+s0 ; dequant_coeff_C
eld x0, b
emul x0y1
eld y0, p
emul x1y0
bnzd r6, dequantize_lfe_sample
eld @rp1+d0, p ; dequantized sample[part]
brad end_lfe_dequantize
eld sr, si ; restore bit_buffer
no_lfe_dequant
bnzd r6, $
eld @rp1+d0, a
end_lfe_dequantize
ebk #0000b
er xsd
er psh1
er usm
er op
er opm
ret
/********************************************************************
Function: expand_lfe_sample
Description: expand 12 lfe samples to 1152 samples.
Arguments:
index registers:
@bank0
d1 d0 s1 s0
---------------------------------------
sd0: x 1 x x
sd1: x x 1 x
sd2: x 1 x x
********************************************************************/
expand_lfe_sample::
es op
es opm
er xsd
eld sd0, #0x0100
eld sd1, #0x0010
eld sd2, #0x0100
ld r4, #GRANULES
ld r5, #95 - 1
ld r7, r5
esec0 #ECP_POS
eld rp0, #pcm_lfe_buffer
eld rp1, #lfe_fraction
%1 eld rp2, #lfe_scale_factor
ecr ma1
eld ma1, @rp1+s1 ; get previous sample
eld b, @rp1+s0 ; get current sample
eld @rp0+d0, ma1
; calculate step value
ld r3, #0 ; sign bit flag
esub b, ma1
ebra ec0, %f2
ld r3, #1
eneg b
%2 er nq
ecr ma0
eld ma0l, b
eld p, #96
esla ma0
ld r6, #23
bnzd r6, $
edivq ma0, p
eresr ma0, p
eld ph, ma0l ; quotient
esra ma0
eld d, ma0 ; remainder
erpn rp2, d
eld pl, @rp2 ; step value
%3 cmp eq, r3, #0
brt %f4
esub ma1, p
bra %f5
%4 eadd ma1, p
ernd ma1
%5 bnzd r7, %b3
eld @rp0+d0, ma1
dt r4
brfd %b1
ld r7, r5
end_lfe_expansion
; store last sample to previous sample
eld a, @rp1+s0 ; get last sample
eld rp1, #lfe_fraction
eld @rp1, a
esec0 #ECP_Z
er op
er opm
ret
/********************************************************************
Function: lfe_filter
Description: Low pass lfe filter, cutoff frequency is 125Hz,
sampling frequency is 48kHz.
This filtering is encoder isue. In decoder, not working
Algorithm:
for (i = 0; i < 1152; i++)
{
for(k = 0; k < 8; k++)
{
v0[k] = sambuf[i];
sambuf[i] = v0[k] * a0[k] +
v1[k] * a1[k] +
v2[k] * a2[k] -
w1[k] * b1[k] -
w2[k] * b2[k];
v2[k] = v1[k];
v1[k] = v0[k];
w2[k] = w1[k];
w1[k] = sambuf[i];
}
}
Arguments:
index registers:
@bank0
d1 d0 s1 s0
---------------------------------------
sd0: x 1 x x
sd1: x x 1 x
sd2: x 1 x x
********************************************************************/
lfe_filter::
es psh1
er usm
es opm
er xsd
eld sd0, #0x8880
eld sd3, #0x0018
es xsd
eld sd0, #0xF000
eld sd3, #0x00E0
eld sd1, #0x0100
eld sd2, #0x0100
ld r6, #SAMPLES_PER_FRAME-1
ld r7, #7
eld a, #-7
eld rp2, #pcm_lfe_buffer
%1 eld rp0, #v1
eld rp3, #lfe_filter_coef
eld ma0, @rp2+s0
eld x0, ma0
eld y0, @rp3+s0
emul x0y0, x1, @rp0+s0, y0, @rp3+s0
eld ma0, p, @rp0+d0, ma0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0
eld @rp0+d0, x1
eld x0, @rp0+s1, y0, @rp3+s0
emad ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
emsb ma0, x1y0
eld @rp0+d1, x0
esub ma0, p
eld @rp0+d1, ma0
erpn rp0, a
eld x0, ma0
eld y0, @rp3+s0
emul x0y0, x1, @rp0+s0, y0, @rp3+s0
eld ma0, p, @rp0+d0, ma0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0
eld @rp0+d0, x1
eld x0, @rp0+s1, y0, @rp3+s0
emad ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
emsb ma0, x1y0
eld @rp0+d1, x0
esub ma0, p
eld @rp0+d1, ma0
erpn rp0, a
eld x0, ma0
eld y0, @rp3+s0
emul x0y0, x1, @rp0+s0, y0, @rp3+s0
eld ma0, p, @rp0+d0, ma0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0
eld @rp0+d0, x1
eld x0, @rp0+s1, y0, @rp3+s0
emad ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
emsb ma0, x1y0
eld @rp0+d1, x0
esub ma0, p
eld @rp0+d1, ma0
erpn rp0, a
eld x0, ma0
eld y0, @rp3+s0
emul x0y0, x1, @rp0+s0, y0, @rp3+s0
eld ma0, p, @rp0+d0, ma0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0
eld @rp0+d0, x1
eld x0, @rp0+s1, y0, @rp3+s0
emad ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
emsb ma0, x1y0
eld @rp0+d1, x0
esub ma0, p
eld @rp0+d1, ma0
erpn rp0, a
eld x0, ma0
eld y0, @rp3+s0
emul x0y0, x1, @rp0+s0, y0, @rp3+s0
eld ma0, p, @rp0+d0, ma0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0
eld @rp0+d0, x1
eld x0, @rp0+s1, y0, @rp3+s0
emad ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
emsb ma0, x1y0
eld @rp0+d1, x0
esub ma0, p
eld @rp0+d1, ma0
erpn rp0, a
eld x0, ma0
eld y0, @rp3+s0
emul x0y0, x1, @rp0+s0, y0, @rp3+s0
eld ma0, p, @rp0+d0, ma0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0
eld @rp0+d0, x1
eld x0, @rp0+s1, y0, @rp3+s0
emad ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
emsb ma0, x1y0
eld @rp0+d1, x0
esub ma0, p
eld @rp0+d1, ma0
erpn rp0, a
eld x0, ma0
eld y0, @rp3+s0
emul x0y0, x1, @rp0+s0, y0, @rp3+s0
eld ma0, p, @rp0+d0, ma0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0
eld @rp0+d0, x1
eld x0, @rp0+s1, y0, @rp3+s0
emad ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
emsb ma0, x1y0
eld @rp0+d1, x0
esub ma0, p
eld @rp0+d1, ma0
erpn rp0, a
eld x0, ma0
eld y0, @rp3+s0
emul x0y0, x1, @rp0+s0, y0, @rp3+s0
eld ma0, p, @rp0+d0, ma0
emul x1y0, x0, @rp0+s0, y0, @rp3+s0
emad ma0, x0y0
eld @rp0+d0, x1
eld x0, @rp0+s1, y0, @rp3+s0
emad ma0, x0y0, x1, @rp0+s0, y0, @rp3+s1
emsb ma0, x1y0
eld @rp0+d1, x0
esub ma0, p
eld @rp0+d1, ma0
erpn rp0, a
esla ma0
dt r6
brfd %b1
eld @rp2+d0, ma0
er psh1
er opm
ret
.endif
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -