📄 fft.lst
字号:
41BA 90FDFF =1 341 mov dptr,#not 512
41BD E2 =1 342 scl2: movx a,@r0
41BE 08 =1 343 inc r0
41BF B4CC00 =1 344 cjne a,#-52,scl2a
41C2 5005 =1 345 scl2a: jnc scl3 ; < -52
41C4 B43400 =1 346 cjne a,#52,scl2b
41C7 5008 =1 347 scl2b: jnc scl4 ; >= 52
41C9 A3 =1 348 scl3: inc dptr
41CA E583 =1 349 mov a,dph
41CC 4582 =1 350 orl a,dpl
41CE 70ED =1 351 jnz scl2
41D0 22 =1 352 ret
=1 353 ;
41D1 0529 =1 354 scl4: inc sclfct
41D3 7800 =1 355 mov r0,#low real
41D5 90FDFF =1 356 mov dptr,#not 512
41D8 E2 =1 357 scl6: movx a,@r0 ; get real data
41D9 A2E7 =1 358 mov c,acc.7 ; arithmetic shift right ( hi bit unchanged)
41DB 13 =1 359 rrc a
41DC F2 =1 360 movx @r0,a
41DD 08 =1 361 inc r0
41DE A3 =1 362 inc dptr
41DF E583 =1 363 mov a,dph
41E1 4582 =1 364 orl a,dpl
41E3 70F3 =1 365 jnz scl6
41E5 22 =1 366 ret
367 ;
=1 368 $include(sysmpy.asm) ; signed multiply
=1 369 ; signed multiply a * b
=1 370 ; save sign of result, make both positive
FFT PAGE 6
=1 371 ; multiply, set result sign, shift accuracy
=1 372 ; return high order byte of result
41E6 FF =1 373 mpy: mov r7,a ; save multiplier
41E7 65F0 =1 374 xrl a,b ; xor signs
41E9 A2E7 =1 375 mov c,acc.7
41EB C0D0 =1 376 push psw ; save result sign
41ED C3 =1 377 clr c
41EE EF =1 378 mov a,r7 ; get multiplier
41EF 30E702 =1 379 jnb acc.7,mpy2
41F2 F4 =1 380 cpl a
41F3 04 =1 381 inc a
41F4 C5F0 =1 382 mpy2: xch a,b
41F6 30E702 =1 383 jnb acc.7,mpy3
41F9 F4 =1 384 cpl a
41FA 04 =1 385 inc a
41FB A4 =1 386 mpy3: mul ab ; unsigned math
41FC D0D0 =1 387 pop psw ; get result sign
41FE 500A =1 388 jnc mpy1 ; result is positive
4200 F4 =1 389 cpl a
4201 3400 =1 390 addc a,#0 ; make result negative
4203 C5F0 =1 391 xch a,b
4205 F4 =1 392 cpl a
4206 3400 =1 393 addc a,#0
4208 C5F0 =1 394 xch a,b
420A 33 =1 395 mpy1: rlc a
420B C5F0 =1 396 xch a,b
420D 33 =1 397 rlc a ; add 1 bit more of accuracy
420E 92E7 =1 398 mov acc.7,c ; insure sign
4210 22 =1 399 ret
400 ;
401 ;============================================================================
4211 75D000 402 main: mov psw,#0 ; reg base 0
4214 111B 403 call wave ; create test signal
4216 754810 404 mov radix,#16
4219 754902 405 mov radsiz,#2
421C 124245 406 call fft
421F 120112 407 call ilprt
4222 5363616C 408 db 'Scale factor: ',0
4226 65206661
422A 63746F72
422E 3A2000
4231 E529 409 mov a,sclfct
4233 120115 410 call prtrad
4236 12012D 411 call crlf
412 ; call reorder
4239 316B 413 call power
423B 124373 414 call ppg ; plot power graph
423E 754810 415 done: mov radix,#16
4241 754902 416 mov radsiz,#2
4244 22 417 ret ; back to monitor
418 ;============================================================================
419
4245 120112 420 fft: call ilprt
4248 6666743A 421 db 'fft:',cr,lf,0
424C 0D0A00
422
423 ; initialize data areas
424F 752900 424 mov sclfct,#0
FFT PAGE 7
425
426 ; clear imag array
4252 905400 427 clrimg: mov dptr,#imag
4255 7800 428 mov r0,#0
4257 E4 429 clr a
4258 F0 430 clri10: movx @dptr,a
4259 A3 431 inc dptr
425A D8FC 432 djnz r0,clri10
433
434 ; move input data into real array
425C 905300 435 mov dptr,#real
425F 75A052 436 mov p2,#high inpd
4262 7800 437 mov r0,#low inpd ; all arrays are on page boundary
4264 7A00 438 mov r2,#0
4266 E2 439 movdi: movx a,@r0 ; get input data
4267 C3 440 clr c
4268 9480 441 subb a,#80h ; convert to 2's compliment
426A F0 442 movx @dptr,a ; put to real
426B A3 443 inc dptr
426C 08 444 inc r0
426D DAF7 445 djnz r2,movdi
446 ;
=1 447 $include(permute.asm) ; decimation in time
=1 448 ; decimation in time - reorder data
=1 449 ; pre-transform bit swap
=1 450 ; this appears to be working properly.
=1 451 ; the bits are being reversed and
=1 452 ; a swap is done on no carry
426F =1 453 permute:
426F 75A053 =1 454 mov p2,#high real
4272 7900 =1 455 mov r1,#low real ; 'L'
4274 1103 =1 456 perm2: call bitrev
4276 E9 =1 457 mov a,r1 ; get L
4277 B50000 =1 458 cjne a,0,brv2 ; cmp with E
427A 4006 =1 459 brv2: jc swp1
427C E3 =1 460 swapem: movx a,@r1
427D FA =1 461 mov r2,a
427E E2 =1 462 movx a,@r0
427F F3 =1 463 movx @r1,a
4280 EA =1 464 mov a,r2
4281 F2 =1 465 movx @r0,a
4282 09 =1 466 swp1: inc r1 ; inc 'L'
4283 E9 =1 467 mov a,r1
4284 70EE =1 468 jnz perm2
469 ;
470 ; FFT first pass
471 ;
4286 31B5 472 Pass1: call scale
4288 905300 473 mov dptr,#real
428B E0 474 Pa1: movx a,@dptr
428C FA 475 mov r2,a ; put 'C'
428D 0582 476 inc dpl
428F E0 477 movx a,@dptr
4290 FB 478 mov r3,a ; put 'B'
4291 1582 479 dec dpl
4293 2A 480 add a,r2 ; B + C
4294 F0 481 movx @dptr,a
4295 EA 482 mov a,r2 ; get 'C'
FFT PAGE 8
4296 C3 483 clr c
4297 9B 484 subb a,r3 ; C - B
4298 0582 485 inc dpl
429A F0 486 movx @dptr,a
429B 0582 487 inc dpl
429D E582 488 mov a,dpl
429F 70EA 489 jnz Pa1
490 ;
491 ; computation of fft pass 2 thru n.
492 ;
42A1 7440 493 fpass: mov a,#64 ; 90 degrees
42A3 F525 494 mov celnum,a
42A5 F528 495 mov delta,a
42A7 7402 496 mov a,#2
42A9 F526 497 mov pairnm,a
42AB F527 498 mov celdis,a
499 ;
42AD 31B5 500 Npass: call scale
42AF 852524 501 mov celct,celnum
502
503 ; initialize data pointers
42B2 E4 504 clr a
42B3 F54B 505 mov rlpt1,a
42B5 F54C 506 mov rlpt2,a
42B7 F54D 507 mov impt1,a
42B9 F54E 508 mov impt2,a
509 ;
42BB 754F00 510 Ncell: mov sinpt,#0
42BE 85262E 511 mov lctr1,pairnm ; loop counter 1
512 ;
42C1 E54B 513 Nc1: mov a,rlpt1
42C3 2527 514 add a,celdis
42C5 F54C 515 mov rlpt2,a
42C7 F54E 516 mov impt2,a
517 ;
42C9 758351 518 mov dph,#high stadr
42CC 854F82 519 mov dpl,sinpt
42CF E0 520 movx a,@dptr
42D0 F52A 521 mov sine,a
42D2 7440 522 mov a,#64 ; 90 degrees
42D4 93 523 movc a,@a+dptr
42D5 F52B 524 mov cosine,a
525 ;
42D7 758353 526 mov dph,#high real
42DA 854C82 527 mov dpl,rlpt2
42DD E0 528 movx a,@dptr
42DE F5F0 529 mov b,a
42E0 C0F0 530 push b
42E2 E52B 531 mov a,cosine
42E4 31E6 532 call mpy
42E6 F52C 533 mov treal,a ; tr = rn * cos(z)
42E8 D0F0 534 pop b
42EA E52A 535 mov a,sine
42EC 31E6 536 call mpy
42EE F52D 537 mov timag,a ; tr = rn * sin(z)
538 ;
42F0 758354 539 mov dph,#high imag
42F3 854E82 540 mov dpl,impt2
FFT PAGE 9
42F6 E0 541 movx a,@dptr
42F7 F5F0 542 mov b,a
42F9 C0F0 543 push b
42FB E52A 544 mov a,sine
42FD 31E6 545 call mpy ; a = in * sin(z)
42FF 252C 546 add a,treal
4301 F52C 547 mov treal,a ; tr = rn*cos + in*sin
4303 D0F0 548 pop b
4305 E52B 549 mov a,cosine
4307 31E6 550 call mpy
4309 C3 551 clr c
430A 952D 552 subb a,timag
430C F52D 553 mov timag,a ; ti = in*cos - rn*sin
554 ;
430E 758353 555 mov dph,#high real
4311 854B82 556 mov dpl,rlpt1
4314 E0 557 movx a,@dptr
4315 FA 558 mov r2,a
4316 252C 559 add a,treal
4318 F0 560 movx @dptr,a ; rl1 = rl0 + treal
4319 EA 561 mov a,r2
431A C3 562 clr c
431B 952C 563 subb a,treal
431D 854C82 564 mov dpl,rlpt2
4320 F0 565 movx @dptr,a ; rl2 = rl0 - treal
566 ;
4321 758354 567 mov dph,#high imag
4324 854D82 568 mov dpl,impt1
4327 E0 569 movx a,@dptr
4328 FA 570 mov r2,a
4329 252D 571 add a,timag
432B F0 572 movx @dptr,a ; im1 = im0 + timag
432C EA 573 mov a,r2
432D C3 574 clr c
432E 952D 575 subb a,timag
4330 854E82 576 mov dpl,impt2
4333 F0 577 movx @dptr,a ; im2 = im0 - timag
578 ;
4334 E54F 579 mov a,sinpt
4336 2528 580 add a,delta
4338 F54F 581 mov sinpt,a
433A 054B 582 inc rlpt1
433C 054D 583 inc impt1
433E 152E 584 dec lctr1
4340 E52E 585 mov a,lctr1
4342 6002 586 jz Nc2
4344 41C1 587 jmp Nc1
588 ;
4346 E54B 589 Nc2: mov a,rlpt1
4348 2527 590 add a,celdis
434A F54B 591 mov rlpt1,a
434C F54D 592 mov impt1,a
434E 1524 593 dec celct
4350 E524 594 mov a,celct
4352 6002 595 jz Np1
4354 41BB 596 jmp Ncell
597 ;
598 ; change parameters for next pass
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -