Biopsychology.org

English

Artículos Casos   Libros Apuntes Otros  

Análisis del Comportamiento Verbal Articulatorio en Conversaciones Grupales Espontáneas. E. Barrull, 1992. (esteban@biopsychology.org)

Atrás Arriba Siguiente

 

 
FFT3R.ASM
FFT3.ASM
ASC2DEC.ASM
BCD2DEC.ASM

 

;
;  Fixer:	FFT3R.ASM
;
;  Procediment	fft3r:near
;
; Parametres:	bx = segment serie
;		cx = M%  on N=2^M
;		ax = SIG
;
;===================================================================
;
eseg	segment	public 'data'
sig	dw	?
m	dw	?
l	dd	?
dos	dw	2
tpn	dd	?
segi	dw	?
eseg	ends
;
; definim macros
;
des 	macro	seg,index,segmi,reg
	push	index
	sub	reg,reg
	shr	index,1
	rcl	reg,1
	add	index,segmi
	mov	seg,index
	shl	reg,1
	shl	reg,1
	shl	reg,1
	mov	index,reg
	endm
;
;
	extrn	fft3:near,sin_cos:near
	public	fft3r
	.8087
;
cseg	segment	public 'code'
	assume	cs:cseg,es:eseg
;
fft3r	proc	near
;
	push	ax
	push	bx
	push	cx
	push	dx
	push	si
	push	di
	push	bp
	push	ds
	push	es
	mov	dx,eseg
	mov	es,dx
;
	mov	es:m,cx	;salvem M%
	mov	es:sig,ax	;salvem SIG%
	mov	es:segi,bx	;salvem segment serie
;
;
	cmp	ax,1
	je	e2
   	jmp	e3
e2:	jmp	ifftr
e3:	cmp	ax,?1
	je	fftr
;
error:	jmp	fi
;
fftr:	dec	cx
;
	call	fft3
;
;	fem X(N/2)=X(0)
;
	mov	bx,es:segi
	mov	si,0
	push	ds
	des	ds,si,bx,ax
	finit
	fld	dword ptr [si]
	fld	dword ptr [si+4]
	pop	si
	mov	cx,es:m
	dec	cx
	mov	si,1
	shl	si,cl	;si=N/2
	dec	si	;si=?1 per poder arribar si m=17
	des	ds,si,bx,ax
	fstp	dword ptr [si+12]
	fstp	dword ptr [si+8]
	pop	si
	pop	ds
;
	call	recons
;
; no dividim per 2 ni per N, ho fem al calcular l'espectre.
;
	jmp	fi
;
;
ifftr:	call	recons
;
	mov	cx,es:m
	dec	cx
;
	call	fft3
;
;
fi:	pop	es
	pop	ds
	pop	bp
	pop	di
	pop	si
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	ret
fft3r	endp
;
;
;?------------------------------------------------------------
;
recons	proc	near
;
	push	ax
	push	bx
	push	cx
	push	si
	push	di
	push	bp
;
	finit
 	fild	word ptr es:dos
 	fldpi
 	fmul
	fild	word ptr es:m
	fld1
	fscale		;st=N
	fxch
	fstp	st
 	fdiv		;st=TPN=2*PI/N
	fstp	dword ptr es:tpn
;
	mov	bx,es:segi
	mov	di,0	;L=0
	mov	cx,es:m
	sub	cx,2
	mov	ax,1
	shl	ax,cl	;ax=N/4
	mov	bp,ax	;bp=N/4
	shl	ax,1	;ax=N/2
;
	mov	word ptr es:l+2,0
	push	ds
;
r1:	mov	word ptr es:l,di
	finit
 	fld	dword ptr es:tpn
 	fild	dword ptr es:l
 	fmul
 	call	sin_cos
 	fild	word ptr es:sig
 	fchs
 	fmulp	st(2),st
;
	mov	si,ax
	sub	si,di	;si=N/2?L
	sub	si,1
	push	es
	des	ds,di,bx,cx
	des	es,si,bx,cx
;
	fld	dword ptr [di]
	fld	dword ptr [di+4]
	fld	dword ptr es:[si+8]
	fld	dword ptr es:[si+12]
;
	fld	st(3)
	fld	st
	fmul	st,st(6)
	fsub
	fld	st(3)
	fmul	st,st(7)
	fadd
	fld	st(2)
	fadd	st(1),st
	fmul	st,st(6)
	fadd
	fld	st(1)
	fmul	st,st(7)
	fadd
	fstp	dword ptr [di]
;
	fld	st(2)
	fld	st
	fmul	st,st(6)
	fsub
	fld	st(4)
	fmul	st,st(7)
	fsub
	fld	st(1)
	fsub	st(1),st
	fmul	st,st(6)
	fsub
	fld	st(2)
	fmul	st,st(7)
	fadd
	fstp	dword ptr [di+4]
;
	fld	st(3)
	fld	st
	fmul	st,st(6)
	fadd
	fld	st(3)
	fmul	st,st(7)
	fsub
	fld	st(2)
	fadd	st(1),st
	fmul	st,st(6)
	fsub
	fld	st(1)
	fmul	st,st(7)
	fsub
	fstp	dword ptr es:[si+8]
;
	fld	st(2)
	fld	st
	fmul	st,st(6)
	fadd
	fld	st(4)
	fmul	st,st(7)
	fadd
	fld	st(1)
	fsub	st(1),st
	fmul	st,st(6)
	fadd
	fld	st(2)
	fmul	st,st(7)
	fsub
	fchs
	fstp	dword ptr es:[si+12]
;
	pop	si
	pop	di
	pop	es
;
;
 	cmp	di,bp	;L>=N/4?
	jae	r2
	inc	di	;L=L+1
	jmp	r1
;
r2:	pop	ds
;
	pop	bp
	pop	di
	pop	si
	pop	cx
	pop	bx
	pop	ax
;
	ret
recons	endp
;
;
cseg	ends
	end
;
;
 
;
;
;  Fixer:	FFT3.ASM
;
;  Procediment	fft3:near
;
;  Format: 	call fft3
;
;  Funció:	Calcula DFT (directa:SIG=?1 e inversa:SIG=1)
;
;  Parametres:	bx = segment serie entrada
;		cx = M
;		ax = SIG
;
;
;==================================================================
;
;
eseg	segment	public 'data'
mn	dw	?
nd	dd	?
nw	dw	?
nm1	dw	?
nd2	dw	?
k	dd	?
j	dd	?
sig	dw	?
segi	dw	?
dos	dw	2
nt	dw	1,2,4,8,16,32,64,128,256,512,1024
	dw	2048,4096,8192,16384,32768,0
eseg	ends
;
;
; definim macros
;
swap	macro	x,y
	des 	ds,x,dx,bp
	des 	es,y,dx,bp
	fld	qword ptr [x]
	fld	qword ptr es:[y]
	fstp	qword ptr [x]
	fstp	qword ptr es:[y]
	pop	y
	pop	x
	endm
;
des 	macro	seg,index,segmi,reg
	push	index
	dec	index
	sub	reg,reg
	shr	index,1
	rcl	reg,1
	add	index,segmi
	mov	seg,index
	shl	reg,1
	shl	reg,1
	shl	reg,1
	mov	index,reg
	endm
;
;
;
	public	fft3
	.8087
	extrn	sin_cos:near
;
cseg	segment	public 'code'
	assume	cs:cseg,es:eseg
;
fft3	proc	near
;
	push	ax
	push	bx
	push	cx
	push	dx
	push	di
	push	si
	push	bp
	push	ds
	push	es
	mov	dx,eseg
	mov	es,dx
;
   	mov	es:mn,cx	;salvem M%
	mov	es:sig,ax	;salvem SIG%
	mov	es:segi,bx	;salvem segment serie
;
	finit
    	fild	word ptr es:mn	;st=M%
	fld1		;st=1.0
	fscale		;st=N%=2^M%
	fistp	dword ptr es:nd	;salvem N%
;
	mov	bx,es:mn
	shl	bx,1
	mov	ax,es:[nt+bx]
	mov	es:nw,ax
	sub	ax,1
	mov	es:nm1,ax
	sub	bx,2
	mov	ax,es:[nt+bx]
	mov	es:nd2,ax
;
; Procedim a reordenar la matriu A
;
	mov	cx,es:nm1
	mov	dx,es:segi
	mov	bx,es:nd2
;
	finit
	push	ds
	push	es
;
	mov	si,1	;si=1
	sub	di,di	;di=0
;
;
e2: 	inc	di	;L=L+1
	cmp	di,si	;IF L>=J THEN 2
	jae	e3
 	swap	di,si	;SWAP A(L),A(J)
;
e3:	mov	ax,bx
;
e4:	cmp	ax,si	;IF K>=J THEN 4
	jae	e5
	sub	si,ax	;J=J?K
	shr	ax,1	;K=K/2
	jmp	e4	;GOTO 3
;
e5:	add	si,ax	;J=J+K
	cmp	di,cx	;NEXT L
	jb	e2
;
e6:	pop	es
	pop	ds
;
; Hem acabat de reordenar
;
;
	mov	word ptr es:k+2,0
	mov	word ptr es:j+2,0
;
	mov	bx,es:segi
   	mov	cx,1	;R%=1
;
e8:	mov	ax,1
	dec	cx
	shl	ax,cl	;ax=RE%/2=2^(R%?1)
	mov	dx,ax	;dx=K%=RE%/2
	mov	word ptr es:k,dx	;salvem K%
	shl	ax,1	;ax=RE%=2^R%
	inc	cx
	mov	bp,es:nw	;bp = N%
	sub	bp,ax	;bp = N%?RE%
;
	finit
	fldpi                          ;st=Ò
	fild	dword ptr es:k        ;st=K%
 	fdiv                           ;st=Ò/K%
;
	fld1                           ;st=UR=1.0
	fldz 		;st=UI=0.0
;
;
	push	cx                    ;salvem contador R%
	mov	cx,1                  ;cx=J%=1
e9:	mov	di,cx	;di=L%=J%
;
	push	ds
	push	es
	push	cx
;
e10:	mov	si,di
	add	si,dx	;si=LMK%=L%+K%
;
	des	ds,si,bx,cx	;desplaçament AR(LMK)
	fld	dword ptr [si]	;st=AR(LMK)
	fld	st	; "   "
	fld	dword ptr [si+4]	;st=AI(LMK)
	fld	st	; "   "
	fmul	st,st(4)	;st=AI(LMK)*UI
	fxch		;st=AI(LMK)
	fmul	st,st(5)	;st=AI(LMK)*UR
	fxch	st(2)	;st=AR(LMK)
	fmul	st,st(4)	;st=AR(LMK)*UI
	fxch	st(3)	;st=AR(LMK)
	fmul 	st,st(5)	;st=AR(LMK)*UR
	fsubr		;st= TR
	fxch	st(2)	;st=AR(LMK)*UI
	fadd		;st= TI
;
	des	es,di,bx,cx	;desplaçament AR(L)
	fld	dword ptr es:[di]	;st=AR(L)
	fld	st	; "  "
	fsub	st,st(3)	;st=AR(L)?TR
	fxch		;st=AR(L)
	fadd	st,st(3)	;st=AR(L)+TR
	fstp	dword ptr es:[di]	;salvem AR(L)
	fstp	dword ptr [si]	;salvem AR(LMK)
;
	fld	dword ptr es:[di+4]	;st=AI(L)
	fld	st	; "  "
	fsub	st,st(2)	;st=AI(L)?TI
	fxch		;st=AI(L)
	fadd	st,st(2)	;st=AI(L)+TI
	fstp	dword ptr es:[di+4]	;salvem AI(L)
	fstp	dword ptr [si+4]	;salvem AI(LMK)
;
	fstp	st	;st=TR
	fstp	st	;st=WI
;
	pop	di	;si = LMK%
	pop	si	;di = L%
;
	cmp	di,bp	;L%>N% ?
	jae	e11
	add	di,ax	;L%=L%+RE%
	jmp	e10
e11:
	pop	cx
	pop	es
	pop	ds
;
; calculem UI i UR
;
	fstp	st
	fstp	st
	mov	word ptr es:j,cx
	fild	dword ptr es:j
	fmul	st,st(1)
 	call 	sin_cos               ;st=sin(JÒ/K%)
	fild	word ptr es:sig
 	fmul                           ;st=WI=sig*sin(JÒ/K%)
;
	cmp	cx,dx	;J%>K% ?
	jae	e12
	inc	cx
	jmp	e9
;
e12:	pop	cx	;restaurem R%
	cmp	cx,es:mn	;R%>M% ?
	jae	fi3
	inc	cx	;R%=R%+1
	jmp	e8
;
;
fi3:	pop	es
	pop	ds
	pop	bp
	pop	si
	pop	di
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	ret
fft3	endp
;
cseg	ends
	end
;
 
;
; Fixer:		ASC2DEC.ASM
;
; Procediment:	asc2dec:far
;
; Format:	lea     ax,car
;		push    ax
;		lea     ax,ncar
;		push    ax
;		lea     ax,decimal
;		push    ax
;		call    asc2dec
;
;======================================================================
;
	public	asc2dec
;
cseg	segment	public 'code'
	assume	cs:cseg
;
asc2dec	proc	far
	push	bp
	mov	bp,sp
	push	ax
	push	bx
	push	cx
	push	dx
	push	si
	push	di
;
	mov	di,[bp+8]
	mov	ax,[di]	;ax = ncar
	mov	si,[bp+10]	;si apunta a car
	mov	dx,si	;dx també
;	mov	al,byte ptr [si]
;	cmp	al,'?'
;	je	neg
	add	si,ax
	sub	si,1	;si apunta a final car
	mov	di,[bp+6]	;di apunta a decimal
	mov	bx,di	;bx també
	add	di,18	;di apunta a final decimal
;
e1:	mov	al,byte ptr [si]
	cmp	si,dx
	je	signe
	mov	byte ptr [di],al
	dec	si
	dec	di
	jmp	e1
;
signe:	cmp	al,'?'
	je	neg
	cmp	al,'+'
	je	pos
	mov	byte ptr [di],al
	dec	di
pos:	mov	byte ptr [bx],'+'
	jmp	e2
neg:	mov	byte ptr [bx],al
;
e2:	cmp	di,bx
	je	fi
	mov	byte ptr [di],'0'
	dec	di
	jmp	e2
;
fi:	pop	di
	pop	si
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	mov	sp,bp
	pop	bp
	ret	6
asc2dec	endp
;
cseg	ends
	end
 
;
; Fixer:		BCD2DEC.ASM
;
; Procediment:	bcd2dec:far
;
; Format:	lea    ax,bcd
;		push   ax
;		lea    ax,decimal
;		push   ax
;		call   bcd2dec
;
;====================================================================
;
	public	bcd2dec
;
cseg	segment	public 'code'
	assume	cs:cseg
;
bcd2dec	proc	far
	push	bp
	mov	bp,sp
	push	ax
	push	si
	push	di
	push	cx
;
	mov	si,[bp+8]	;si apunta a bcd
	mov	di,[bp+6]	;di apunta a decimal
	add	di,18	;di apunta a final decimal
	mov	cx,9
;
e1:	mov	al,byte ptr [si]
	mov	ah,al
	and	al,00001111b
	and	ah,11110000b
	push	cx
	mov	cl,4
	shr	ah,cl
	pop	cx
	add	al,30h
	add	ah,30h
	mov	byte ptr [di],al
	dec	di
	mov	byte ptr [di],ah
	dec	di
	inc	si
	loop	e1
;
	mov	al,byte ptr [si]
	and	al,10000000b
	cmp	al,10000000b
	je	neg
	mov	byte ptr [di],'+'
	jmp	fi
neg:	mov	byte ptr [di],'?'
;
fi:	pop	cx
	pop	di
	pop	si
	pop	ax
	pop	bp
	ret	4
bcd2dec	endp
;
cseg	ends
	end
 

 

© Biopsychology.org, 1998-2006

 
Última actualización:
22/03/06