📄 presence.s
字号:
;********************************************************************
;
; (c)1997 Copyright LuxSonor, Inc. All rights reserved
;
; Revision 1.0
;
;
; Module: AUDIO code
;
; Initial version:Cecile Foret, August 1997
; Jinshi Huang 12/1/98 for LS388/LS500
; This routine performs the rate conversion from 11kH to 44kH, for
; the microphone input.
;
; return adress to main routine: r11
; returns: none, the decimated sequence will be written in local memory
; input : r2, input adress for micro sequence
; loading of micro input sequence is done outside this subroutine
; input sequence is located at adress local_micro_in
;*********************************************************************
.nolist
#include "regdef2.h"
#include "stereo_user.h"
#include "memory2.h"
#include "user2.h"
.list
.data
.global SUB_presence
SUB_presence:
;******* do the difference of both sequences ************************
;******* input sequences=audio sequences at 0x0-0x400 ***************
;******* averaged sequence is located at 0x1100-0x1300 **************
movi AGRAdr0, local_micro_44 ;localA_data tchou
movi AGRInc0, 0x2
movi AGRSiz0, 0xffff
movi AGRAdr1, local_micro_out
movi AGRInc1, 0x2
movi AGRSiz1, 0xffff
tsti r15,FLAG_LS128
bne two_mic_channel
li r0,0x007fffff //ZhangWei:if ls128,the channel L is zero.
j mix_gain_done
two_mic_channel:
li r0,0x00400000
// movi r0, 0x4000 ; r0 =0.5
mix_gain_done:
;******* deseable the interrupt **********
movi TrapReg, 0x0
nop
nop
loop 256, micro_average
mulhf r2, r0, i0 ; 0.5*left
msubhf r2, r0, i0 ; 0.5*(left-right)
#ifdef EFFECT
nop
#endif //EFFECT
rndhf i1, r2 ; output=0.5*(left-right), 44.1Kh
micro_average:
;****** enable interrupt *****************
movi TrapReg, 1<<2
;******* load the history of the filter in local memory *************
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
#ifdef EFFECT
movi DMASize, 31 ; history =127 coefficients
movi r9, (local_dec_hist)>>2
movi r20, dec_hist
shr r20, 2
loop 2,till_the_end
mov LocalAddr,r9
; sets the location in local memory
dmarr r20 ; adress in DRAM for history
WaitDma
addi r9,32
addi r20,32
till_the_end:
#else //EFFECT
movi ByteSize, 0xfc ; history =127 coefficients
movi ByteLocal,local_dec_hist
; sets the location in local memory
dmabr dec_hist ; adress in DRAM for history
#endif //EFFECT
;******* set up the AGRAdr ******************************************
;******* filter ********
movi AGRAdr0, local_rate_filter; pointer on filter coefficients
movi AGRSiz0, 0xfe ; 128 coefficients, circular buffer
movi AGRInc0, 0x2 ; increments by 2 (one coefficient)
;******* data_in *******
#ifdef EFFECT
movi AGRAdr4, local_dec_hist ; pointer on the history and input seq
movi AGRSiz4, 0xffff
movi AGRMod4, 0
movi AGRInc4, 0xff08 ; increments by -252 (reset of history)
#else //EFFECT
movi AGRAdr2, local_dec_hist ; pointer on the history and input seq
movi AGRSiz2, 0xffff
movi AGRInc2, 0xff08 ; increments by -252 (reset of history)
#endif //EFFECT
;******* data_out ******
movi AGRAdr3, local_DL1FB; pointer on the output sequence.
movi AGRSiz3, 0xffff
movi AGRInc3, 0x2 ; increments by one
;******* process a block of 256 samples *******************************
movi r2, 64
dec_micro_block:
;******* use all coefficients of the filter, and shift by four data ***
#ifdef EFFECT
mulhf r0, i0, a4(2)
#else //EFFECT
mulhf r0, i0, a2(2)
#endif //EFFECT
;******* deseable the interrupt ***************
movi TrapReg, 0x0
nop
nop
loop 31, decim_filter
#ifdef EFFECT
maddhf r0, i0, a4(2) ; first filter set
maddhf r0, i0, a4(2) ; second
maddhf r0, i0, a4(2) ; third
maddhf r0, i0, a4(2) ; fourth, go back to first set of filter
#else //EFFECT
maddhf r0, i0, a2(2) ; first filter set
maddhf r0, i0, a2(2) ; second
maddhf r0, i0, a2(2) ; third
maddhf r0, i0, a2(2) ; fourth, go back to first set of filter
#endif //EFFECT
decim_filter:
;******* enable the interrupt ******************
movi TrapReg, 1<<2
#ifdef EFFECT
maddhf r0, i0, a4(2)
maddhf r0, i0, a4(2)
#else //EFFECT
maddhf r0, i0, a2(2)
maddhf r0, i0, a2(2)
#endif //EFFECT
;****** deseable interrupt *********************
movi TrapReg, 0x0
nop
nop
#ifdef EFFECT
maddhf r0, i0, a4(2)
#else //EFFECT
maddhf r0, i0, a2(2)
#endif //EFFECT
#ifndef EFFECT //for LS388/LS500, MAC has different format
;******* shift the result by 2 (divide by 4) before rounding **********
shl r3, r0, 14
shl r4, r16,14
shr r0, r0, 2
shr r1, r1, 2
add r1, r1, r3
add r0, r0, r4
shra r16, r16, 2 ; keep the sign
#endif
// shr r0,2 ; tchou
rndhf i3, r0 ; output sample
;******* enable interrupt **************
movi TrapReg, 1<<2
;******* reset pointer on input data **********************************
#ifdef EFFECT
movhf r0, i4
#else //EFFECT
movhf r0, i2
#endif //EFFECT
subi r2, 0x1 ; decrements the counter
#ifdef EFFECT
bne dec_micro_block
#else //EFFECT
bnz dec_micro_block
#endif //EFFECT
;******** save the history of the rate filter back in DRAM ****************
;******** history =last 127 samples ***************************************
; movi StartAddrHigh, 0x7
movi StartAddrHigh, DataSeg // 10-13-98
movi DMASize, 31
movi r20,local_last_dec_hist
shr r20, 2
movi r21, dec_hist
shr r21, 2
; sets the location in local memory
loop 2, save_hist ; history =127 coefficients
mov LocalAddr, r20
dmawr r21 ; adress in DRAM for history
WaitDma
addi r20, 32
addi r21, 32
save_hist:
//****************************************************************
#if 1
movi DcacheBase,MEM_SEG
nop
nop
dlw r0,USER_ICFG
nop
andi r0,ICFG_HWECHO_MASK
tsti r0,ICFG_HWECHO_MASK
bne sw_avf
//---------------------------------------------------------------
//ZhangWei:read flag of microphone energy
rlwi r0,GenIOMIS_Read_Reg
nop
movi r6,0
andi r0,1
tsti r0,1
beq with_power
nop
j without_power
sw_avf:
#endif
;******** Find the microphone energy *****************************
movi AGRAdr3, local_DL1FB; pointer on the output sequence.
li r5,0x0001ffff ; 1/64
movi r0,0
//--------------------------------------------------------------------
tsti r15,FLAG_LS128
bne need_not_offset
movhf r6,%dc_offset
loop 64,dcoff
movhf r2,i3
sub r2,r6
shra r2,9
add r6,r2
dcoff:
movhf %dc_offset,r6
movi AGRAdr3, local_DL1FB; pointer on the output sequence.
loop 64,sum_energy_ls128
movhf r2,i3
sub r2,r6
shra r2,8
shra r2,5
abs r2,r2
add r0,r2
sum_energy_ls128:
nop
movi r6,0
movi r5,1
j sum_energy_done
need_not_offset:
loop 64,sum_energy
mulhf r2,r5,i3
abs r2,r2
add r0,r2
sum_energy:
movi r6,0
shr r0,8
movi r5,1
sum_energy_done:
//--------------------------------------------------------------------
tsti r0,0x2000 ;energy_on level
bgt with_power
tsti r0,0x1000 ;energy_off level
bgt on_hysteresis ;exit
without_power:
movh %ufon_on_counter,r6
movh r7, %ufon_off_counter
tsti r7,0xffff ;wrap_around checking
beq hit_bottom
addi r7,1
movh %ufon_off_counter,r7
hit_bottom:
tsti r7,0x96 ; 0.75 sec energy off
blt on_hysteresis
movh %energy_indicator,r6
j on_hysteresis
with_power:
movh %ufon_off_counter,r6
movh r7, %ufon_on_counter
tsti r7,0xffff ;wrap_around checking
beq reach_summit
addi r7,1
movh %ufon_on_counter,r7
reach_summit:
tsti r7,0x64 ; 0.5 sec energy on
blt on_hysteresis
movh %energy_indicator,r5
on_hysteresis:
;********* Get echo from the dram **************
movh r21,%Echo_delay_ptr
movi r2,local_next_delayed_echo
shr r2, 2
subi r21,0x4e0 ; 225 ms echo of 5.8 ms resolution
tsti r21,Decimated_echo_storge_start
bgte wrapping_of_echo
addi r21,Decimated_echo_storge_size
wrapping_of_echo:
mov LocalAddr,r2
dmarr r21 ; delay dram word address
WaitDma
;********** Sum of current microphone and echo ************************
movi AGRAdr4, local_DL1FB
movi AGRInc4, 0x2
movi AGRSiz4, 0xffff
movi AGRAdr5, local_next_delayed_echo
movi AGRInc5, 0x2
movi AGRSiz5, 0xffff
li r3,0x004fffff
movh r4,%echo_com
shl r4,3
multi r4,0x89d8 ; 0x6fffff/0x1a
nop
loop 64, echo_together
mulhf r0, r3, a4(0) ; 0.5 * echo1
msubhf r0, r4, i5 ; 0.5 * echo1 - r4 * echo2
nop
rndhf i4, r0
echo_together:
;******** save the summed samples(L-R) in DRAM ****************
;******** 64 downsamples *********************
movi r20,local_DL1FB
shr r20, 2
movh r21,%Echo_delay_ptr
mov LocalAddr, r20
dmawr r21 ; adress in DRAM for history
WaitDma
; addi r20, 32
addi r21, 32
tsti r21,Decimated_echo_storge_end ; wrapping check
blt no_decim_wrap_around
subi r21,Decimated_echo_storge_size
no_decim_wrap_around:
movh %Echo_delay_ptr,r21
j r11 ; go back to main routine
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -