⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 presence.s

📁 关于DVD的MPEG2用的DSP代码,在DSP的实现MPEG的压缩,解压算法.
💻 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 + -