ЭУМК по дисциплине "Программирование проблемно-ориентированных вычислительных средств реального времени" › Теория › Тема 5. Программирование алгоритмов БПФ с прореживанием по частоте

# Электронный учебно-методический
комплекс по дисциплине
"Программирование проблемно-ориентированных вычислительных средств реального времени"

для специальности

1-40 02 02 «Электронные вычислительные средства»

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах

5.3. Алгоритм БПФ с поблочно-плавающей запятой
5.3.1. Принцип поблочно-плавающей запятой

Одним из недостатков рассмотренных выше программ является то, что на каждой итерации выходные значения делятся пополам. В результате для широкополосных сигналов после БПФ получаются значения изображения Фурье с малым динамическим диапазоном. Увеличить динамический диапазон сигнала можно при использовании арифметики с плавающей запятой. Но реализация арифметики с плавающей запятой на процессорах с фиксированной запятой требует неоправданно высоких вычислительных затрат.
Существует способ совместить достоинства фиксированной и плавающей запятой – поблочно-плавающая запятая. В этом случае значения чисел представляются дробной мантиссой и одним общим порядком. В случае возникновения переполнения все мантиссы делятся пополам, а общий порядок увеличивается на 1. Использование этого метода позволяет получить максимальный диапазон при минимальных затратах. В этом случае максимальная мантисса будет находиться в диапазоне от 0,5 до 1,0.
Применить арифметику с поблочно-плавающей запятой можно к любой из рассмотренных ранее программ. Пример такой программы БПФ с прореживанием по частоте и прямым расположением входных данных приводится ниже. В этой программе после всех операций типа суммирование/вычитание производится проверка на переполнение и в случае переполнения все данные (уже обработанные и еще не обработанные) делятся пополам, и увеличивается счетчик переполнения, после чего повторяется вычисление «бабочки», на которой произошло переполнение. Для этого в программе выделены две ячейки промежуточных результатов (XR и XI), которые хранят новые значения до завершения вычисления «бабочки».

5.3.2. Программная реализация алгоритма БПФ

Ниже приведен пример подпрограммы для реализации алгоритма БПФ с поблочно-плавающей запятой, прореживанием по частоте и прямым порядком входных данных.

    * DIF FFT Programm for TMS320C5402 DSP Starter Kit
    * direct -> reverce addres (Cooley-Tuke) 10/11/04 12:20:00
    	.data
    HOLDN   .word    64h
    QUARTN  .word    65h
    N1      .word    66h
    N2      .word    67h
    J       .word    68h
    IADDR   .word    69h
    SINTBL  .word    6Ah
    SIN     .word    6Bh
    COS     .word    6Ch
    I       .word    6Dh
    IE      .word    6Eh
    NOF	.word    6Fh
    XR	.word    70h
    XI	.word    71h
    	.text
    FFT	ld	#N, 16, a
    	sth	a, HOLDN		; N
    	sth	a, -2, QUARTN	; N/4
    	st	#1, IE		; IE=1 !!!
    	sth	a, N2			; N2=N !!!
    	stl	a, NOF
    	st	#XFFT, IADDR
    	stm	#M, AR1		; число итераций - 1
    IELOOP	st	#sint, SINTBL	; K=0
    	ld	N2, a			; N <= 16384
    	sth	a, J			; J=0
    	stl	a, -1, N2		; N2=N2/2
    	mvdm	N2, AR2
    	stl	a, N1			; N1=2N2
    	mar	*AR2-			; AR2=N2-1
    JLOOP	ld	J, 1, a
    	stl	a, I			; I=J (2J)
    	ld	SINTBL, a
    	reada	SIN
    	add	QUARTN, a
    	reada	COS			; W(K)
    ILOOP	ld	IADDR, a
    	add	I, a
    BUTT	stlm	a, AR3		; (I)
    	mvdm	N1, AR0		; N2 (N1=2N2)
    	nop				;PPC1 ar0
    	ld	*AR3+0, 16, a	; A = PR
    	sub	*AR3-0, 16, a	; A = XR = (PR-QR)
    	bcd	SCAL, aov
    	mar	*AR3+			;1w PI
    	ld	*AR3+0, 16, b	;1w B = PI
    	sub	*AR3-0, 16, b	; B = XI = (PI-QI)
    	bcd	SCAL, bov
    	sth	a, XR			;1w XR
    	ld	XR, T			;1w T = XR = (PR-QR)
    	sth	b, XI			; XI
    	mpy	COS, a		; A = (PR-QR)cos
    	ld	XI, T			; T = XI = (PI-QI)
    	mac	SIN, a		; A = (PR-QR)cos+(PI-QI)sin
    	mpy	COS, b		; B = (PI-QI)cos
    	ld	XR, T			; T = XR = (PR-QR)
    	sth	a, XR			; new QR
    	mas	SIN, b		; B = (PI-QI)cos-(PR-QR)sin
      	sth	b, XI			; new QI
    	ld	*AR3+0, 16, a	; A = PI
    	add	*AR3-, 16, a	; A = new PI = (PI+QI)
    	bcd	SCAL, aov
    	ld	*AR3-0, 16, b	;1w B = QR
    	add	*AR3, 16, b	;1w B = new PR = (PR+QR)
    	bcd	SCAL, bov
    	or	XI, a			;1w PI | QI
    	or	XR, b			;1w PR | QR
    	sth	b, *AR3+0		; PR
    	stl	b, *AR3+		; QR
    	stl	a, *AR3-0		; QI
    	sth	a, *AR3-		; PI
    	ld	I, a
    	add	N1, 1, a		; 2N1
    	stl	a, I			; I=I+2N2 (2N1=4N2)
    	sub	HOLDN, 1, a
    	bcd	ILOOP, alt		; I < N (< 2N=2HOLDN)
    	ld	SINTBL, b		;1w
    	add	IE, b			;1w
    	stl	b, SINTBL		; K=K+IE
    	banzd	JLOOP, *AR2-	; J < N2
    	addm	#1, J			;2w J=J+1
    	ld	IE, a
    	banzd	IELOOP, *AR1-	; IE < N
    	stl	a, 1, IE		;2w IE=2IE
    DRC2	stm	#N-1, AR1
    	mvdm	IADDR, AR3
    	mvdm	IADDR, AR2
    LOOPD	mvmm	AR3, AR0
    	cmpr	LT, AR2
    	bcd	NODRC, NTC
    	mvdm	HOLDN, AR0		;2w
    	dld	*AR2, a
    	dld	*AR3, b
    	dst	b, *AR2
    	dst	a, *AR3
    NODRC	mar	*AR2+
    	banzd	LOOPD, *AR1-
    	mar	*AR2+ 		;1w
    	mar	*AR3+0B		;1w
    	retd
    	ld	NOF, b		;1w
    	nop				;1w
    SCAL	stm	#2*N-1, BRC
    	mvdm	IADDR, AR3
    	rptbd	LOOPM-1
    	addm	#1, NOF		;2w
    	ld	*AR3, 15, a
    	sth	a, *AR3+
    LOOPM	bd	BUTT
    	ld	IADDR, a		;1w
    	add	I, a			;1w

Оглавление | Программа | Теория | Практика | Контроль знаний | Об авторах
© БГУИР , 2012