📄 dso_fft.lst
字号:
494 2 rPartKB = xr[k+1] ;
495 2 xr[k+1]=xr[k]-rPartKB ;
496 2 xr[k]=xr[k]+rPartKB;
497 2 }
498 1
499 1 for(L=2;L<=N;L++)//L=1
500 1 {
501 2 B=1<<(L-1);
502 2 for(J=0;J<=B-1;J++)
503 2 {
504 3 P=J*(1<<(N-L));
505 3 for(k=J;k<=Sam_N-1;k+=1<<L)
506 3 {
507 4 if(P==0)
508 4 {
509 5 rPartKB=xr[k+B];
510 5 iPartKB=xi[k+B];
511 5 xr[k+B]=xr[k]-rPartKB;
512 5 xi[k+B]=xi[k]-iPartKB;
513 5 xr[k]=xr[k]+rPartKB;
514 5 xi[k]=xi[k]+iPartKB;
515 5 }
516 4 else if(P==32)
517 4 {
518 5 rPartKB=-xi[k+B];
519 5 iPartKB=xr[k+B];
520 5 xr[k+B]=xr[k]-rPartKB;
521 5 xi[k+B]=xi[k]-iPartKB;
522 5 xr[k]=xr[k]+rPartKB;
523 5 xi[k]=xi[k]+iPartKB;
524 5 }
525 4 else if(P==64)
526 4 {
527 5 rPartKB=-xr[k+B];
528 5 iPartKB=-xi[k+B];
529 5 xr[k+B]=xr[k]-rPartKB;
530 5 xi[k+B]=xi[k]-iPartKB;
531 5 xr[k]=xr[k]+rPartKB;
532 5 xi[k]=xi[k]+iPartKB;
533 5 }
534 4 else if(P==96)
535 4 {
536 5 rPartKB=xi[k+B];
537 5 iPartKB=-xr[k+B];
538 5 xr[k+B]=xr[k]-rPartKB;
539 5 xi[k+B]=xi[k]-iPartKB;
540 5 xr[k]=xr[k]+rPartKB;
541 5 xi[k]=xi[k]+iPartKB;
542 5 }
543 4 else{
544 5 rPartKB=xr[k+B]*rCf[P]-xi[k+B]*iCf[P];
545 5 iPartKB=xi[k+B]*rCf[P]+xr[k+B]*iCf[P];
546 5 rPartKB=rPartKB>>7;
547 5 iPartKB=iPartKB>>7;
548 5 xr[k+B]=xr[k]-rPartKB;
549 5 xi[k+B]=xi[k]-iPartKB;
550 5 xr[k]=xr[k]+rPartKB;
551 5 xi[k]=xi[k]+iPartKB;
C51 COMPILER V7.06 DSO_FFT 02/25/2007 18:04:19 PAGE 10
552 5 }
553 4 }
554 3 }
555 2 }
556 1 }
557 /***************************************************************
558 *名称:ChangeOrder(float xr[],float xi[],int N)
559 *描述:ChangeOrder
560 *参数:
561 *返回:
562 ****************************************************************/
563 void ChangeOrder()
564 {
565 1 uchar I,J,K;
566 1 int T;
567 1 long sum_xr = 0 ;
568 1 Ram_cs = 0 ;
569 1 J=Sam_N>>1;
570 1 for(I=1;I<=Sam_N-2;I++)
571 1 {
572 2 if(I<J)
573 2 {
574 3 T=xr[I];xr[I]=xr[J];xr[J]=T;
575 3 }
576 2 K=Sam_N>>1;
577 2 while(J>=K)
578 2 {
579 3 J=J-K;
580 3 K=(int)(K/2+0.5);
581 3 }
582 2 J=J+K;
583 2 }
584 1 for(I=0;I<Sam_N;I++)
585 1 {
586 2 sum_xr = sum_xr + xr[I] ;
587 2 }
588 1 sum_xr = sum_xr>>7 ;
589 1 for(I=0;I<Sam_N;I++)
590 1 {
591 2 xr[I]=xr[I]-sum_xr ;
592 2 }
593 1 }
594 /***************************************************************
595 *名称:Fft_out (float xr[] , float xi[])
596 *描述:计算频谱分析结果
597 *参数:fft计算结果的实虚序列
598 *返回:
599 ****************************************************************/
600 void Fft_out (void)
601 {
602 1 uchar i ;
603 1 for(i=0;i<Sam_N>>1;i=i+1)
604 1 {
605 2 w[i]=sqrt(xr[i]*xr[i]+xi[i]*xi[i]);
606 2 w[i]=w[i]>>6;
607 2 }
608 1 }
609 /***************************************************************
610 *名称:showsine (void)
611 *描述:显示采样的结果,采64个点但显示256点
612 *参数:xr_temp[]显示数组,N_temp数组元素个数,
613 start_add图形开始的x地址,last上次显示最后一个元素
C51 COMPILER V7.06 DSO_FFT 02/25/2007 18:04:19 PAGE 11
614 *返回:
615 ****************************************************************/
616 void showsine (uchar xr_temp[],uchar N_temp,uchar start_add,uchar last)
617 {
618 1 uchar i ;
619 1 WriteD(start_add,xr_temp[1]>>1);
620 1 vector(start_add-1,last>>1,xr_temp[1]>>1);
621 1 for(i=2;i<N_temp;i++)
622 1 {
623 2 WriteD(i-1+start_add,xr_temp[i]>>1);
624 2 vector(i-2+start_add,xr_temp[i-1]>>1,xr_temp[i]>>1);
625 2 }
626 1 }
627
628 void main()
629 {
630 1 uchar temp[32] ,temp_1,temp_2;
631 1 uchar i ;
632 1
633 1 Ram_cs = 1 ;//转向对液晶操作
634 1 lcd_a0 = 0 ;
635 1 lcd_wr = 1 ;
636 1 initall() ;
637 1
638 1 while(1)
639 1 {
640 2 Ram_cs = 0 ;
641 2 //采样,采128点
642 2 P0 = 0xff ;
643 2 Adc_work() ;
644 2
645 2 lcd_a0 = 1 ;//转向对ram操作
646 2 lcd_wr = 1 ;
647 2 Ram_cs = 0 ;
648 2
649 2 Fft() ;
650 2 Fft_out() ;
651 2
652 2 for(i=0;i<32;i++)
653 2 {
654 3 temp[i]=xr_show[i];
655 3 }
656 2
657 2 temp_1=temp[31];
658 2
659 2 Ram_cs = 1 ;//转向对液晶操作
660 2 lcd_a0 = 0 ;
661 2 lcd_wr = 1 ;
662 2 initram_1();
663 2 WriteD(25,temp[0]/2);
664 2 showsine(temp,32,25+1,temp[0]);
665 2
666 2 lcd_a0 = 1 ;//转向对ram操作
667 2 lcd_wr = 1 ;
668 2 Ram_cs = 0 ;
669 2 for(i=32;i<64;i++)
670 2 {
671 3 temp[i-32]=xr_show[i];
672 3 }
673 2 temp_2=temp[31];
674 2
675 2 Ram_cs = 1 ;//转向对液晶操作
C51 COMPILER V7.06 DSO_FFT 02/25/2007 18:04:19 PAGE 12
676 2 lcd_a0 = 0 ;
677 2 lcd_wr = 1 ;
678 2 showsine(temp,32,25+31,temp_1);
679 2
680 2 lcd_a0 = 1 ;//转向对ram操作
681 2 lcd_wr = 1 ;
682 2 Ram_cs = 0 ;
683 2 for(i=64;i<96;i++)
684 2 {
685 3 temp[i-64]=xr_show[i];
686 3 }
687 2 temp_1=temp[31];
688 2
689 2 Ram_cs = 1 ;//转向对液晶操作
690 2 lcd_a0 = 0 ;
691 2 lcd_wr = 1 ;
692 2 showsine(temp,32,25+63,temp_2);
693 2
694 2 lcd_a0 = 1 ;//转向对ram操作
695 2 lcd_wr = 1 ;
696 2 Ram_cs = 0 ;
697 2 for(i=96;i<128;i++)
698 2 {
699 3 temp[i-96]=xr_show[i];
700 3 }
701 2
702 2 Ram_cs = 1 ;//转向对液晶操作
703 2 lcd_a0 = 0 ;
704 2 lcd_wr = 1 ;
705 2 showsine(temp,32,25+95,temp_1);
706 2 showchin() ;
707 2
708 2 lcd_a0 = 1 ;//转向对ram操作
709 2 lcd_wr = 1 ;
710 2 Ram_cs = 0 ;
711 2 for(i=0;i<32;i++)temp[i]=w[i];
712 2
713 2 Ram_cs = 1 ;
714 2 lcd_a0 = 0 ;
715 2 lcd_wr = 1 ;
716 2 pinpu(temp,32,25) ;
717 2
718 2 lcd_a0 = 1 ;//转向对ram操作
719 2 lcd_wr = 1 ;
720 2 Ram_cs = 0 ;
721 2 for(i=0;i<32;i++)temp[i]=w[i+32];
722 2
723 2 Ram_cs = 1 ;
724 2 lcd_a0 = 0 ;
725 2 lcd_wr = 1 ;
726 2 pinpu(temp,32,32*2+25) ;
727 2
728 2 }
729 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 4289 ----
CONSTANT SIZE = 794 ----
XDATA SIZE = 1792 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 93
C51 COMPILER V7.06 DSO_FFT 02/25/2007 18:04:19 PAGE 13
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -