📄 cs_dec.s
字号:
//=====================================================================
// (c)1996-2000 Copyright LuxSonor Semiconductors Inc.,
// All Rights Reserved !!!
// File name: <cs56k.h>
// Circle Surround equates
// Target Processor: LS500 DSP Processor
// Target System: ISA Board/Stand Alone Machine.
//
// $Initial Version: Corin Chen
// Richard Huang
// Tan Chou
//
//=====================================================================
.nolist
#include "regdef.h"
#include "regdef2.h"
#include "globalv.h"
#include "user.h"
#include "stereo_user.h"
#include "SRScoeff.h"
.rdata
.list
.global SUB_CS_DEC
SUB_CS_DEC:
// PCM and CS context switch
jsr r30, SUB_save_pcm_context1000
jsr r30, SUB_restore_SRS_context
movi r0, local_FApcm_buf_byte //L
movw storedataptr, r0
movw in_Mat_ptr, r0
movi r20, 0 // counter
movh r1, Lhini_flag
tsti r1, 0x0
bne jump_SRS_init
// Initialize filter coeffs and variable
movi r1, 0x1
movi r7, 0x0009
nop
nop
movh Lhini_flag, r1
movh Lhcsflag, r7 //Narrow and Music mode
// Low and high ends of the Time constant control voltage
li r3, 0x00094d28
li r4, 0x0013ee7b
li r5, 0xff9db41c
li r6, 0x00434502
movw vartclow, r3
movw vartchigh, r4
// Coefficient Evaluation (slope and intercept) - high band signal path
movw hbslope ,r5
movw hpinter, r6
// Coefficient Evaluation (Slope and intercept) - lowband/frontback signal path
li r3, 0xffd0e347
li r4, 0x004191d5
movi r0, 0
movw lofbslope, r3
movw lofbinter, r4
// Evaluated Coefficients - High band
movw hba1, r0
movw hbb0, r0
// Evaluated Coefficients - Low band / Front back
movw lofba1, r0
movw lofbb0, r0
// Exponential Ratio circuit - Coefficients
li r3, 0x00044a58
li r4, 0x00564faf
li r5, 0xfffa50eb
movw exprcoeff1, r3
movw exprcoeff2, r4
movw exprcoeff3, r5
// Variable Multiplier Control parameters
li r2, 0x0014dc99
li r3, 0x001f39e3
li r4, 0xfff3c209
li r5, 0x004ccccd
li r6, 0x00004666
movw vmlowend, r2
movw vmupend, r3
movw vminter, r4
movw vmslope, r5
movw multval, r6
// Rear Audio Path filters - 2KHz - low and high pass
li r1, 0x000ee41d
li r2, 0x006237c5
li r3, 0xff8ee41d
li r4, 0x006237c5
movw l1p2k_1, r1
movw l1p2k_2, r2
movw h1p2k_1, r3
movw h1p2k_2, r4
// Sub Woofer Path filters - 80Hz - low pass II order
li r1, 0xffc0f0da
li r2, 0x007f0d5d
li r3, 0x000000e4
li r4, 0x000001c9
movw l2p80_1, r1
movw l2p80_2, r2
movw l2p80_3, r3
movw l2p80_4, r4
// Center Channel - 100 Hz high pass I order filter
li r1, 0x007f2aed
li r2, 0x007e55da
li r3, 0x00000583
li r4, 0x00000b06
li r5, 0x007da177
li r6, 0xff84a705
movw h1p100_1, r1
movw h1p100_2, r2
// Front Left, Right filters - 200Hz - low pass II order
movw l2p200_1, r3
movw l2p200_2, r4
movw l2p200_3, r5
movw l2p200_4, r6
li r1, 0xffddb3d8
li r2, 0x002ed9ec
li r3, 0x00783333
li r4, 0x007c199a
movw h1p16k_1, r1
movw h1p16k_2, r2
// 480Hz high pass filter Coefficients
movw h1p480_1, r3
movw h1p480_2, r4
// 32Hz Low pass filter Coefficients
li r1, 0x007f77ff
li r2, 0x00008801
li r3, 0x007fd846
li r4, 0x000037fb
li r5, 0x002d3f7c
li r6, 0x0071cac1
movw l1p32_1, r1
movw l1p32_2, r2
// 16Hz Low pass filter Coefficients
movw l1p16_1, r3
movw l1p16_2, r4
// Center and Surround scaling coefficients
movw cscale, r5
movw sscale, r6
jump_SRS_init:
//=============================================================
// Input Matrix : L,R,L-R,L+R,-L,-R are evaluated.
//=============================================================
movw r8, in_Mat_ptr
mov AGRAdr0, r8
movi AGRSiz0, 0xffff
movi AGRAdr1, L
movi AGRSiz1, 0xffff
movi AGRAdr2, R
movi AGRSiz2, 0xffff
movi AGRAdr3, LMR
movi AGRSiz3, 0xffff
movi AGRAdr4, LPR
movi AGRSiz4, 0xffff
movi AGRAdr5, AL
movi AGRSiz5, 0xffff
movi AGRAdr6, AR
movi AGRSiz6, 0xffff
movi r7, 0
li r9, 0xFFFFFF00
loop BLOCKSIZE, InputMatrix
shra r3, a0(0*4), 8
and r3, r9 // r3 = R, 24-bit format
shl r4, a0(3*4), 16
shra r4, 8 // r4 = L, 24-bit format
sub a6(1*4), r7, r3 // -R
sub a5(1*4), r7, r4 // -L
sub r5, r4, r3 // L-R
add r6, r4, r3 // L+R
mov a1(1*4), r4
mov a2(1*4), r3
shra r5, 1 // L-R divided by 2
shra r6, 1 // L+R divided by 2
mov a3(1*4), r5 // L-R
mov a4(1*4), r6 // L+R
InputMatrix:
mov r8, AGRAdr0
movw in_Mat_ptr, r8
//=============================================================
// AUDIO PATH PROCESSING
//=============================================================
Start_SRS_processing:
//----------------------------------
// Front Left Channel Processing
//----------------------------------
movw r1, cscale
movw r0, vca2
mulf r10, r0, r1
movi AGRAdr1, AR // -R
movi AGRInc1, 0x4
movi AGRSiz1, 15*4 //modulo 16 words
// movi AGRAdr3, vca2buffer
// movi AGRSiz3, 15*4 //modulo 16 words
// nop
// loop BLOCKSIZE/2, vca2up
// mulf r2, r10, a1(1*4)//1.23, 1.23, 1.23
// mulf r6, r10, a1(1*4)//1.23, 1.23, 1.23
// mov a3(1*4), r2 //1.23
// mov a3(1*4), r6 //1.23
//vca2up:
movi AGRAdr2, Lfiltbuffer
movi AGRSiz2, 15*4 //modulo 16 words
movw r1, x2L1filt
movw r2, x1L1filt
mov r4, a2(-2*4) // Set pointer, dummy
loop BLOCKSIZE, lowpass7
mulf r8, r2, l2p200_2
// nop
// mov r3, a3(1*4)
mulf r4, r10,a1(1*4)
madd r8, r1, l2p200_1
madd r8, r4, l2p200_1
mov r3, a2(1*4)
madd r8, r3, l2p200_4
mov r5, a2(1*4)
madd r8, r5, l2p200_3
mov r1, r2
madd r8, r5, l2p200_3
mov r2, r4
rnd a2(-1*4), r8
lowpass7:
movw x2L1filt, r1
movw x1L1filt, r2
movi AGRAdr3, Lfiltbuffer
movi AGRSiz3, 0xffff
movi AGRAdr2, vca4buffer
// movi AGRSiz2, 15*4 // modulo 16 words
movw r1, x2L2filt
movw r2, x1L2filt
mov r4, a2(-2*4) // Set pointer, dummy
loop BLOCKSIZE, lowpass8
mulf r8, r2, l2p200_2
// nop
madd r8, r1, l2p200_1
mov r3, a3(1*4)
madd r8, r3, l2p200_1
mov r4, a2(1*4)
madd r8, r4, l2p200_4
mov r5, a2(1*4)
madd r8, r5, l2p200_3
mov r1, r2
madd r8, r5, l2p200_3
mov r2, r3
rnd a2(-1*4), r8
lowpass8:
movw x2L2filt, r1
movw x1L2filt, r2
movi AGRAdr2, LFRF+2
// movi AGRSiz2, 0xffff
movi AGRInc2, 0x4
// movi AGRAdr3, vca2buffer
movi AGRAdr4, vca4buffer
movi AGRAdr3, L
// movi AGRSiz3, 0xffff
movw r12, vca34
loop BLOCKSIZE, LeftFront
// mov r2, a3(1*4)
mulf r2, r10,a1(1*4)
add r6, r2, a3(1*4)
sub r2, r6, a4(1*4)
mulhf i2, r2, r12
LeftFront:
//----------------------------------
// Front Right Channel Processing
//----------------------------------
movi AGRAdr1, AL // -L
// movi AGRInc1, 0x4
//dlw r1, cscale
movw r0, vca1
mulf r10, r0, cscale
// movi AGRAdr3, vca1buffer
// movi AGRSiz3, 15*4 //modulo 16 words
// loop BLOCKSIZE/2, vca1up
// mulf r2, r10, a1(1*4)//1.23, 1.23, 1.15
// mulf r6, r10, a1(1*4)//1.23, 1.23, 1.15
// mov a3(1*4), r2 //1.23
// mov a3(1*4), r6 //1.23
//vca1up:
movi AGRAdr2, Rfiltbuffer
// movi AGRSiz2, 15*4 //modulo 16 words
movw r1, x2R1filt
movw r2, x1R1filt
mov r4, a2(-2*4) // Set pointer, dummy
loop BLOCKSIZE, lowpass9
mulf r8, r2, l2p200_2
// nop
// mov r3, a3(1*4)
mulf r4, r10,a1(1*4)
madd r8, r1, l2p200_1
madd r8, r4, l2p200_1
mov r3, a2(1*4)
madd r8, r3, l2p200_4
mov r5, a2(1*4)
madd r8, r5, l2p200_3
mov r1, r2
madd r8, r5, l2p200_3
mov r2, r4
rnd a2(-1*4), r8
lowpass9:
movw x2R1filt, r1
movw x1R1filt, r2
movi AGRAdr3, Rfiltbuffer
movi AGRAdr2, vca3buffer
movw r1, x2R2filt
movw r2, x1R2filt
mov r4, a2(-2*4) // Set pointer, dummy
loop BLOCKSIZE, lowpass10
mulf r8, r2, l2p200_2
// nop
madd r8, r1, l2p200_1
mov r3, a3(1*4)
madd r8, r3, l2p200_1
mov r4, a2(1*4)
madd r8, r4, l2p200_4
mov r5, a2(1*4)
madd r8, r5, l2p200_3
mov r1, r2
madd r8, r5, l2p200_3
mov r2, r3
rnd a2(-1*4), r8
lowpass10:
movw x2R2filt, r1
movw x1R2filt, r2
movi AGRAdr2, LFRF
movi AGRSiz2, 0xffff
movi AGRInc2, 0x4
// movi AGRAdr3, vca1buffer
movi AGRAdr4, vca3buffer
movi AGRAdr3, R
// movw r12, vca34
loop BLOCKSIZE, RightFront
// mov r2, a3(1*4)
mulf r2, r10,a1(1*4)
add r6, r2, a3(1*4)
sub r2, r6, a4(1*4)
mulhf i2, r2, r12
RightFront:
//----------------------------------
// Center Channel Processing
//----------------------------------
movi AGRAdr1, LPR // L+R
// movi AGRSiz1, 0xffff
// dlw r1, cscale
movw r0, vca5
mulf r10, r0, cscale
// movi AGRAdr3, vca5buffer
// movi AGRSiz3, 15*4 //modulo 16 words
// loop BLOCKSIZE/4, vca5up
// mulf r2, r10, a1(1*4)//1.23, 1.23, 1.23
// mulf r4, r10, a1(1*4)//1.23, 1.23, 1.23
// mulf r6, r10, a1(1*4)//1.23, 1.23, 1.23
// mulf r8, r10, a1(1*4)//1.23, 1.23, 1.23
// shl a3(1*4), r2, 1
// shl a3(1*4), r4, 1
// shl a3(1*4), r6, 1
// shl a3(1*4), r8, 1
//vca5up:
movi AGRAdr2, CTSW+2
// movi AGRSiz2, 0xffff
movi AGRInc2, 0x4
movw r2, x1ctfilt
movw r4, lastcenterval
shl r10,1
loop BLOCKSIZE, highpassct
mulnf r8, r2, h1p100_1 //1.23, 1.23, 1.23
// nop
// mov r2, a3(1*4) //update x1ctfilt
mulf r2, r10,a1(1*4)
madd r8, r4, h1p100_2 //1.23, 1.23, 1.23
madd r8, r2, h1p100_1 //1.23, 1.23, 1.23
nop
rnd r4, r8 //update lastcenterval(1.23)
movhf i2, r4
highpassct:
movw lastcenterval, r4
movw x1ctfilt, r2
//----------------------------------
// Sub Woofer Path Processing
//----------------------------------
movi AGRAdr1, LPR // L+R
movi AGRSiz1, 15*4 //modulo 16 words
movi AGRAdr2, subfilt
movi AGRSiz2, 15*4 //modulo 16 words
movi AGRAdr0, local_iir_filter_byte //0x980
movw r0, subfilt_lowpass5_past2
movw r1, subfilt_lowpass5_past1
movw r8, LpR2_past2 // LpR2_past2 is past value of LpRaudio2
movw r9, LpR2_past1
loop BLOCKSIZE, lowpass5
mulf r6, r0, l2p80_1 //1.23, 1.23, 1.23
// nop
madd r6, r1, l2p80_2 //1.23, 1.23, 1.23
mov r0, a1(1*4)
shl r6, 1
madd r6, r8, l2p80_3
mov r8, r9
madd r6, r9, l2p80_4
mov r9, r0
madd r6, r0, l2p80_3 //1.23, 1.23, 1.15
mov r0, r1 // store for next calculation
mov a2(1*4), r6 // store to buffer "subfilt"
mov r1, r6 // store for next calculation
lowpass5:
movw LpR2_past2, r8 // store for next calculation
movw LpR2_past1, r9 // store for next calculation
movw subfilt_lowpass5_past2, r0
movw subfilt_lowpass5_past1, r1
movi AGRAdr1, subfilt
movi AGRAdr2, CTSW
movi AGRInc2, 0x4
movw r0, CTSW_sub_past2
movw r1, CTSW_sub_past1 //sub_past1 is latest past value
movw r8, subfilt_lowpass6_past2
movw r9, subfilt_lowpass6_past1
loop BLOCKSIZE, lowpass6
mulf r6, r0, l2p80_1 //1.23, 1.23, 1.23
// nop
madd r6, r1, l2p80_2 //1.23, 1.23, 1.23
mov r0, a1(1*4)
shl r6, 1
madd r6, r8, l2p80_3 //1.23, 1.23, 1.23
mov r8, r9 // store for next calculation
madd r6, r9, l2p80_4 //1.23, 1.23, 1.23
mov r9, r0 // store for next calculation
madd r6, r0, l2p80_3 //1.23, 1.23, 1.23
mov r0, r1 // store for next calculation
movhf i2, r6
mov r1, r6 // store for next calculation
lowpass6:
movw subfilt_lowpass6_past2, r8
movw subfilt_lowpass6_past1, r9
movw CTSW_sub_past2, r0
movw CTSW_sub_past1, r1 //sub_past1 is latest past value
// Phantom mode processing
/* //+++++++++++++++++++++++++++
//add test phantom mode here
//+++++++++++++++++++++++++++
li r5, 0x00FFFF00
li r0, 0x5A8279 // 0.7071068
movi AGRInc2, 0x2
mov r4, a2(-17*4) // set pointer to position, dummy
mov r4, i2 // set pointer to center channel
movi r4, 0
movi AGRAdr1, LFRF
movi AGRInc1, 0x2
loop BLOCKSIZE, ph_loop
mov r10, a1(0*4)
shr r11, r10, 8
shl r10, 8
and r11, r5 //1.23(Left)
and r10, r5 //1.23(Right)
mov r1, a2(0*4) // move center value(1.23)
mulf r8, r0, r1
addhf i1, r8, r11
addhf i1, r8, r10
mov a2(1*4),r4
ph_loop:
*/
//----------------------------------
// Surround Audio Path Processing
//----------------------------------
// vca8 implementation on the rears
movi AGRAdr1, LMR
// movi AGRAdr3, vca8buffer
// movi AGRSiz3, 15*4 //modulo 16 words
movw r10, vca8
// loop BLOCKSIZE/4, Rearvca
// mulf r2, r10, a1(1*4) //1.23, 1.23, 1.23
// mulf r4, r10, a1(1*4) //1.23, 1.23, 1.23
// mulf r6, r10, a1(1*4) //1.23, 1.23, 1.23
// mulf r8, r10, a1(1*4) //1.23, 1.23, 1.23
// mov a3(1*4), r2
// mov a3(1*4), r4
// mov a3(1*4), r6
// mov a3(1*4), r8
//Rearvca:
// Low Pass filter - 2KHz
movw r2,rearxstat //r2=x(n-1)
movw r3,rearLPfiltstat //r3=y(n-1)
movi AGRAdr4, RearLPfilt //output
// movi AGRSiz4, 0xffff
movi AGRInc4, 4
loop BLOCKSIZE,Lowpass4
mulf r0, r2, l1p2k_1 //r0=b0*x(n-1)
// mov r2, a3(1*4)
mulf r2, r10,a1(1*4)
madd r0, r3, l1p2k_2 //r8=a1*y(n-1)
madd r0, r2, l1p2k_1
nop
mov a4(1*4), r0
mov r3, r0
Lowpass4:
movw rearLPfiltstat,r3 //Store the final output for next pass
//High Pass filter - 2kHz
movw r2,rearxstat //r2=x(n-1)
movw r3,rearHPfiltstat //r3=y(n-1)
movi AGRAdr4,RearHPfilt //output
movi AGRInc4,4
loop BLOCKSIZE,Highpass
mulf r0, r2, h1p2k_1 //r0=b0*x(n-1)
mov r2, a3(1*4)
madd r0, r3, h1p2k_2
msub r0, r2, h1p2k_1
nop
mov a4(1*4), r0
mov r3, r0
Highpass:
movw rearHPfiltstat,r3 //Store the final output for next pass
movw rearxstat,r2 //save the final x(n)
//Surround Delay, Vcas 9-12 and output buffer update
//Surround Delay, doesn't implement right now !!!
movi AGRAdr4, RearLPfilt //output
movi AGRSiz4, 0xffff
movi AGRInc4, 0x4
movi AGRAdr5, RearHPfilt //output
movi AGRSiz5, 0xffff
movi AGRInc5, 0x4
movi AGRAdr1, LSRS+2
movi AGRSiz1, 0xffff
movw r1, vca09
movw r2, vca10
movw r3, vca11
movw r4, vca12
li r5, 0x00FFFF00
loop BLOCKSIZE, Rearvca2
mulf r6, r1, a5(0*4)
mulf r8, r3, a5(1*4)
madd r6, r2, a4(0*4)
madd r8, r4, a4(1*4)
movhf a1(-1*2),r6
movhf a1(1*6),r8
Rearvca2:
//=========================================================
// STEERING PROCESSING
//=========================================================
// Steering Filter L,R 16KHz high pass filters
movi AGRAdr2, L+(BLOCKSIZE-1) * 4
movi AGRSiz2, 0xffff
movi AGRAdr3, R+(BLOCKSIZE-1) * 4
movi AGRSiz3, 0xffff
movi AGRAdr0, L16k+(BLOCKSIZE-1) * 4
movi AGRSiz0, 0xffff
movi AGRAdr1, R16k+(BLOCKSIZE-1) * 4
movi AGRSiz1, 0xffff
movi AGRAdr4, iir_h1p16k_1
movi AGRInc4, 0
movi AGRAdr5, iir_h1p16k_2
movi AGRInc5, 0
mulf r10, i4,a0(-15*4) //1.23, 1.23, 1.23
msub r10, i5,a2(-15*4)
mulf r12, i4,a1(-15*4) //1.23, 1.23, 1.23
msub r12, i5,a3(-15*4)
madd r10, i5,a2(0*4)
madd r12, i5,a3(0*4)
mov a0(0*4), r10
mov a1(0*4), r12
loop BLOCKSIZE-1, strLR16k
mulf r10, i4,a0(1*4) //1.23, 1.23, 1.23
msub r10, i5,a2(1*4)
mulf r12, i4,a1(1*4) //1.23, 1.23, 1.23
msub r12, i5,a3(1*4)
madd r10, i5,a2(0*4)
madd r12, i5,a3(0*4)
mov a0(0*4), r10
mov a1(0*4), r12
strLR16k:
// Steering Filter L,R 480Hz high pass filters
movi AGRAdr2, L+(BLOCKSIZE-1) * 4
movi AGRAdr3, R+(BLOCKSIZE-1) * 4
movi AGRAdr0, L480+(BLOCKSIZE-1) * 4
movi AGRAdr1, R480+(BLOCKSIZE-1) * 4
movi AGRAdr4, iir_h1p480_1
movi AGRAdr5, iir_h1p480_2
mulf r10, i4,a0(-15*4) //1.23, 1.23, 1.23
msub r10, i5,a2(-15*4)
mulf r12, i4,a1(-15*4) //1.23, 1.23, 1.23
msub r12, i5,a3(-15*4)
madd r10, i5,a2(0*4)
madd r12, i5,a3(0*4)
mov a0(0*4), r10
mov a1(0*4), r12
loop BLOCKSIZE-1, strLR480
mulf r10, i4,a0(1*4) //1.23, 1.23, 1.23
msub r10, i5,a2(1*4)
mulf r12, i4,a1(1*4) //1.23, 1.23, 1.23
msub r12, i5,a3(1*4)
madd r10, i5,a2(0*4)
madd r12, i5,a3(0*4)
mov a0(0*4), r10
mov a1(0*4), r12
strLR480:
// Steering Filter L-R,L+R 480Hz high pass filters
movi AGRAdr2, LMR+(BLOCKSIZE-1) * 4
movi AGRAdr3, LPR+(BLOCKSIZE-1) * 4
movi AGRAdr0, LMR480+(BLOCKSIZE-1) * 4
movi AGRAdr1, LPR480+(BLOCKSIZE-1) * 4
mulf r10, i4,a0(-15*4) //1.23, 1.23, 1.23
msub r10, i5,a2(-15*4)
mulf r12, i4,a1(-15*4) //1.23, 1.23, 1.23
msub r12, i5,a3(-15*4)
madd r10, i5,a2(0*4)
madd r12, i5,a3(0*4)
mov a0(0*4), r10
mov a1(0*4), r12
loop BLOCKSIZE-1, strLMPR480
mulf r10, i4,a0(1*4) //1.23, 1.23, 1.23
msub r10, i5,a2(1*4)
mulf r12, i4,a1(1*4) //1.23, 1.23, 1.23
msub r12, i5,a3(1*4)
madd r10, i5,a2(0*4)
madd r12, i5,a3(0*4)
mov a0(0*4), r10
mov a1(0*4), r12
strLMPR480:
//Log Difference for 16KHz high pass filtered L,R signals
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -