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

📄 ff.lst

📁 在ICCAVR 环境实现的fft,
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    007B E5CF      LDI	R28,0x5F
    007C E0D4      LDI	R29,4
    007D BFCD      OUT	0x3D,R28
    007E BFDE      OUT	0x3E,R29
    007F 51C0      SUBI	R28,0x10
    0080 40D0      SBCI	R29,0
    0081 EA0A      LDI	R16,0xAA
    0082 8308      STD	Y+0,R16
    0083 2400      CLR	R0
    0084 EAE0      LDI	R30,0xA0
    0085 E0F0      LDI	R31,0
    0086 E010      LDI	R17,0
    0087 3CE3      CPI	R30,0xC3
    0088 07F1      CPC	R31,R17
    0089 F011      BEQ	0x008C
    008A 9201      ST	R0,Z+
    008B CFFB      RJMP	0x0087
    008C 8300      STD	Z+0,R16
    008D EBE6      LDI	R30,0xB6
    008E E0F0      LDI	R31,0
    008F E6A0      LDI	R26,0x60
    0090 E0B0      LDI	R27,0
    0091 E010      LDI	R17,0
    0092 3FE6      CPI	R30,0xF6
    0093 07F1      CPC	R31,R17
    0094 F021      BEQ	0x0099
    0095 95C8      LPM
    0096 9631      ADIW	R30,1
    0097 920D      ST	R0,X+
    0098 CFF9      RJMP	0x0092
    0099 940E0434  CALL	_main
_exit:
    009B CFFF      RJMP	_exit
_FFT:
  xx                   --> Y+12
  x2                   --> R14
  x1                   --> R10
  x0                   --> R12
  L                    --> Y+24
  j                    --> R10
  temp                 --> Y+8
  TI                   --> Y+4
  TR                   --> Y+0
  b                    --> Y+22
  p                    --> R14
  k                    --> R12
  dataI                --> Y+38
  dataR                --> Y+36
    009C 940E043B  CALL	push_arg4
    009E 940E04AB  CALL	push_gset5
    00A0 976A      SBIW	R28,0x1A
FILE: D:\HJN\Design\AVR\fft\ff.c
(0001) #include <iom128v.h>
(0002) #include <math.h>
(0003) #define PI 3.1415926
(0004) 
(0005) unsigned char i,w[32];
(0006) float dataR[]={5,5,5,5,0,0,0,0};
(0007) float dataI[]={0,0,0,0,0,0,0,0};
(0008) 
(0009) void FFT(float dataR[],float dataI[])
(0010) {
(0011)    int x0,x1,x2,xx;
(0012)    
(0013)    int L,j,k,b,p;
(0014)    float TR,TI,temp;
(0015) 
(0016) /********** following code invert sequence ************/
(0017)  for(i=0;i<8;i++)
    00A1 2422      CLR	R2
    00A2 922000C0  STS	i,R2
    00A4 C055      RJMP	0x00FA
(0018)   { 
(0019)    x0=x1=x2=0;
    00A5 24EE      CLR	R14
    00A6 24FF      CLR	R15
    00A7 24AA      CLR	R10
    00A8 24BB      CLR	R11
    00A9 24CC      CLR	R12
    00AA 24DD      CLR	R13
(0020)    x0=i&0x01; 
    00AB 918000C0  LDS	R24,i
    00AD 2799      CLR	R25
    00AE 7081      ANDI	R24,1
    00AF 7090      ANDI	R25,0
    00B0 016C      MOVW	R12,R24
(0021)    x1=(i/2)&0x01; 
    00B1 E022      LDI	R18,2
    00B2 E030      LDI	R19,0
    00B3 910000C0  LDS	R16,i
    00B5 2711      CLR	R17
    00B6 940E0444  CALL	div16s
    00B8 01C8      MOVW	R24,R16
    00B9 7081      ANDI	R24,1
    00BA 7090      ANDI	R25,0
    00BB 015C      MOVW	R10,R24
(0022)    x2=(i/4)&0x01;
    00BC E024      LDI	R18,4
    00BD E030      LDI	R19,0
    00BE 910000C0  LDS	R16,i
    00C0 2711      CLR	R17
    00C1 940E0444  CALL	div16s
    00C3 01C8      MOVW	R24,R16
    00C4 7081      ANDI	R24,1
    00C5 7090      ANDI	R25,0
    00C6 017C      MOVW	R14,R24
(0023)    xx=x0*4+x1*2+x2;
    00C7 E002      LDI	R16,2
    00C8 E010      LDI	R17,0
    00C9 0195      MOVW	R18,R10
    00CA 940E0492  CALL	empy16s
    00CC 0118      MOVW	R2,R16
    00CD E004      LDI	R16,4
    00CE E010      LDI	R17,0
    00CF 0196      MOVW	R18,R12
    00D0 940E0492  CALL	empy16s
    00D2 0128      MOVW	R4,R16
    00D3 0C42      ADD	R4,R2
    00D4 1C53      ADC	R5,R3
    00D5 0C4E      ADD	R4,R14
    00D6 1C5F      ADC	R5,R15
    00D7 865D      STD	Y+13,R5
    00D8 864C      STD	Y+12,R4
(0024)    dataI[xx]=dataR[i];   //实部的数放在虚部数组中
    00D9 902000C0  LDS	R2,i
    00DB E084      LDI	R24,4
    00DC 9D82      MUL	R24,R2
    00DD 01F0      MOVW	R30,R0
    00DE A00C      LDD	R0,Y+36
    00DF A01D      LDD	R1,Y+37
    00E0 0DE0      ADD	R30,R0
    00E1 1DF1      ADC	R31,R1
    00E2 8020      LDD	R2,Z+0
    00E3 8031      LDD	R3,Z+1
    00E4 8042      LDD	R4,Z+2
    00E5 8053      LDD	R5,Z+3
    00E6 852C      LDD	R18,Y+12
    00E7 853D      LDD	R19,Y+13
    00E8 E004      LDI	R16,4
    00E9 E010      LDI	R17,0
    00EA 940E0492  CALL	empy16s
    00EC 01F8      MOVW	R30,R16
    00ED A00E      LDD	R0,Y+38
    00EE A01F      LDD	R1,Y+39
    00EF 0DE0      ADD	R30,R0
    00F0 1DF1      ADC	R31,R1
    00F1 8220      STD	Z+0,R2
    00F2 8231      STD	Z+1,R3
    00F3 8242      STD	Z+2,R4
    00F4 8253      STD	Z+3,R5
    00F5 918000C0  LDS	R24,i
    00F7 5F8F      SUBI	R24,0xFF
    00F8 938000C0  STS	i,R24
    00FA 918000C0  LDS	R24,i
    00FC 3088      CPI	R24,0x8
    00FD F408      BCC	0x00FF
    00FE CFA6      RJMP	0x00A5
(0025)   }
(0026)  for(i=0;i<8;i++)
    00FF 2422      CLR	R2
    0100 922000C0  STS	i,R2
    0102 C02C      RJMP	0x012F
(0027)   { 
(0028)    dataR[i]=dataI[i];    //将虚部保存的数传回实部
    0103 902000C0  LDS	R2,i
    0105 E084      LDI	R24,4
    0106 9D82      MUL	R24,R2
    0107 0110      MOVW	R2,R0
    0108 01F1      MOVW	R30,R2
    0109 A00E      LDD	R0,Y+38
    010A A01F      LDD	R1,Y+39
    010B 0DE0      ADD	R30,R0
    010C 1DF1      ADC	R31,R1
    010D 8040      LDD	R4,Z+0
    010E 8051      LDD	R5,Z+1
    010F 8062      LDD	R6,Z+2
    0110 8073      LDD	R7,Z+3
    0111 01F1      MOVW	R30,R2
    0112 A00C      LDD	R0,Y+36
    0113 A01D      LDD	R1,Y+37
    0114 0DE0      ADD	R30,R0
    0115 1DF1      ADC	R31,R1
    0116 8240      STD	Z+0,R4
    0117 8251      STD	Z+1,R5
    0118 8262      STD	Z+2,R6
    0119 8273      STD	Z+3,R7
(0029)    dataI[i]=0; 
    011A 902000C0  LDS	R2,i
    011C 9D82      MUL	R24,R2
    011D 01F0      MOVW	R30,R0
    011E A00E      LDD	R0,Y+38
    011F A01F      LDD	R1,Y+39
    0120 0DE0      ADD	R30,R0
    0121 1DF1      ADC	R31,R1
    0122 E600      LDI	R16,0x60
    0123 E010      LDI	R17,0
    0124 940E04D3  CALL	lpm32
    0126 8300      STD	Z+0,R16
    0127 8311      STD	Z+1,R17
    0128 8322      STD	Z+2,R18
    0129 8333      STD	Z+3,R19
    012A 918000C0  LDS	R24,i
    012C 5F8F      SUBI	R24,0xFF
    012D 938000C0  STS	i,R24
    012F 918000C0  LDS	R24,i
    0131 3088      CPI	R24,0x8
    0132 F408      BCC	0x0134
    0133 CFCF      RJMP	0x0103
(0030)   }
(0031) /************** following code FFT *******************/
(0032)  for(L = 1 ; L <= 3 ; L ++ )            // for (1)  L 代表第几级
    0134 E081      LDI	R24,1
    0135 E090      LDI	R25,0
    0136 8F99      STD	Y+25,R25
    0137 8F88      STD	Y+24,R24
(0033)   { 
(0034)     b = 1 ; 
    0138 E081      LDI	R24,1
    0139 E090      LDI	R25,0
    013A 8B9F      STD	Y+23,R25
    013B 8B8E      STD	Y+22,R24
(0035)     i = L - 1 ;          
    013C 8D88      LDD	R24,Y+24
    013D 8D99      LDD	R25,Y+25
    013E 9701      SBIW	R24,1
    013F 938000C0  STS	i,R24
    0141 C00D      RJMP	0x014F
(0036)     while ( i > 0 )           //计算第L层旋转因子的个数,即输入口间距 b= 2^(L-1)  
(0037)      {
(0038)        b=b*2; 
    0142 E002      LDI	R16,2
    0143 E010      LDI	R17,0
    0144 892E      LDD	R18,Y+22
    0145 893F      LDD	R19,Y+23
    0146 940E0492  CALL	empy16s
    0148 8B1F      STD	Y+23,R17
    0149 8B0E      STD	Y+22,R16
(0039)        i--;
    014A 918000C0  LDS	R24,i
    014C 5081      SUBI	R24,1
    014D 938000C0  STS	i,R24
    014F 2422      CLR	R2
    0150 903000C0  LDS	R3,i
    0152 1423      CP	R2,R3
    0153 F370      BCS	0x0142
(0040)      }                        
(0041)    
(0042)    for ( j = 0 ; j <= b - 1 ; j ++ )    // for (2)  j 用来控制计算第几个旋转因子
    0154 24AA      CLR	R10
    0155 24BB      CLR	R11
    0156 C223      RJMP	0x037A
(0043)     {
(0044)        p = 1 ;
    0157 E081      LDI	R24,1
    0158 E090      LDI	R25,0
    0159 017C      MOVW	R14,R24
(0045)        i = 3 - L ;     
    015A E083      LDI	R24,3
    015B 8C08      LDD	R0,Y+24
    015C 8C19      LDD	R1,Y+25
    015D 1980      SUB	R24,R0
    015E 0991      SBC	R25,R1
    015F 938000C0  STS	i,R24
    0161 C00B      RJMP	0x016D
(0046)        
(0047)       while ( i > 0 )                           /* p=pow(2,3-L)*j; */
(0048)          {
(0049)           p = p * 2 ; 
    0162 E002      LDI	R16,2
    0163 E010      LDI	R17,0
    0164 0197      MOVW	R18,R14
    0165 940E0492  CALL	empy16s
    0167 0178      MOVW	R14,R16
(0050)           i -- ;
    0168 918000C0  LDS	R24,i
    016A 5081      SUBI	R24,1
    016B 938000C0  STS	i,R24
    016D 2422      CLR	R2
    016E 903000C0  LDS	R3,i
    0170 1423      CP	R2,R3
    0171 F380      BCS	0x0162
(0051)          }
(0052)       p=p*j;
    0172 0195      MOVW	R18,R10
    0173 0187      MOVW	R16,R14
    0174 940E0492  CALL	empy16s
    0176 0178      MOVW	R14,R16
(0053)        
(0054)         for ( k = j ; k < 8 ; k = k + 2 * b )  /* for (3) */
    0177 0165      MOVW	R12,R10
    0178 C1F8      RJMP	0x0371
(0055)            {  p=2*PI*p/8;
    0179 E50C      LDI	R16,0x5C
    017A E010      LDI	R17,0
    017B 940E04D3  CALL	lpm32
    017D 933A      ST	R19,-Y
    017E 932A      ST	R18,-Y
    017F 931A      ST	R17,-Y
    0180 930A      ST	R16,-Y
    0181 0187      MOVW	R16,R14
    0182 940E053B  CALL	int2fp
    0184 933A      ST	R19,-Y
    0185 932A      ST	R18,-Y
    0186 931A      ST	R17,-Y
    0187 930A      ST	R16,-Y
    0188 940E06C4  CALL	empy32fs
    018A E508      LDI	R16,0x58
    018B E010      LDI	R17,0
    018C 940E04D3  CALL	lpm32
    018E 933A      ST	R19,-Y
    018F 932A      ST	R18,-Y
    0190 931A      ST	R17,-Y
    0191 930A      ST	R16,-Y
    0192 940E05F9  CALL	div32f
    0194 940E04F3  CALL	fp2int
    0196 0178      MOVW	R14,R16
(0056)               TR = dataR [ k ] ;
    0197 E004      LDI	R16,4
    0198 E010      LDI	R17,0
    0199 0196      MOVW	R18,R12
    019A 940E0492  CALL	empy16s
    019C 01F8      MOVW	R30,R16
    019D A00C      LDD	R0,Y+36
    019E A01D      LDD	R1,Y+37
    019F 0DE0      ADD	R30,R0
    01A0 1DF1      ADC	R31,R1
    01A1 8020      LDD	R2,Z+0
    01A2 8031      LDD	R3,Z+1
    01A3 8042      LDD	R4,Z+2
    01A4 8053      LDD	R5,Z+3
    01A5 01FE      MOVW	R30,R28
    01A6 8220      STD	Z+0,R2
    01A7 8231      STD	Z+1,R3
    01A8 8242      STD	Z+2,R4
    01A9 8253      STD	Z+3,R5
(0057)               TI = dataI [ k ] ; 
    01AA E004      LDI	R16,4
    01AB E010      LDI	R17,0
    01AC 0196      MOVW	R18,R12
    01AD 940E0492  CALL	empy16s
    01AF 01F8      MOVW	R30,R16
    01B0 A00E      LDD	R0,Y+38
    01B1 A01F      LDD	R1,Y+39
    01B2 0DE0      ADD	R30,R0
    01B3 1DF1      ADC	R31,R1
    01B4 8020      LDD	R2,Z+0
    01B5 8031      LDD	R3,Z+1
    01B6 8042      LDD	R4,Z+2
    01B7 8053      LDD	R5,Z+3
    01B8 01FE      MOVW	R30,R28
    01B9 8224      STD	Z+4,R2
    01BA 8235      STD	Z+5,R3
    01BB 8246      STD	Z+6,R4
    01BC 8257      STD	Z+7,R5
(0058)               temp = dataR [ k + b ] ;
    01BD 0196      MOVW	R18,R12
    01BE 880E      LDD	R0,Y+22
    01BF 881F      LDD	R1,Y+23
    01C0 0D20      ADD	R18,R0
    01C1 1D31      ADC	R19,R1
    01C2 E004      LDI	R16,4
    01C3 E010      LDI	R17,0
    01C4 940E0492  CALL	empy16s
    01C6 01F8      MOVW	R30,R16
    01C7 A00C      LDD	R0,Y+36
    01C8 A01D      LDD	R1,Y+37
    01C9 0DE0      ADD	R30,R0
    01CA 1DF1      ADC	R31,R1
    01CB 8020      LDD	R2,Z+0
    01CC 8031      LDD	R3,Z+1
    01CD 8042      LDD	R4,Z+2
    01CE 8053      LDD	R5,Z+3
    01CF 01FE      MOVW	R30,R28
    01D0 8620      STD	Z+8,R2
    01D1 8631      STD	Z+9,R3
    01D2 8642      STD	Z+10,R4
    01D3 8653      STD	Z+11,R5
(0059)               dataR[k]=dataR[k]+dataR[k+b]*cos(p)+dataI[k+b]*sin(p);
    01D4 0187      MOVW	R16,R14
    01D5 940E053B  CALL	int2fp
    01D7 940E076B  CALL	_cos
    01D9 0118      MOVW	R2,R16
    01DA 0129      MOVW	R4,R18
    01DB 0187      MOVW	R16,R14
    01DC 940E053B  CALL	int2fp
    01DE 922F      PUSH	R2
    01DF 923F      PUSH	R3
    01E0 924F      PUSH	R4
    01E1 925F      PUSH	R5
    01E2 940E0A27  CALL	_sin
    01E4 905F      POP	R5
    01E5 904F      POP	R4
    01E6 903F      POP	R3
    01E7 902F      POP	R2
    01E8 0138      MOVW	R6,R16
    01E9 0149      MOVW	R8,R18
    01EA E004      LDI	R16,4
    01EB E010      LDI	R17,0
    01EC 0196      MOVW	R18,R12
    01ED 940E0492  CALL	empy16s
    01EF 01C8      MOVW	R24,R16
    01F0 A00C      LDD	R0,Y+36
    01F1 A01D      LDD	R1,Y+37
    01F2 0D80      ADD	R24,R0
    01F3 1D91      ADC	R25,R1
    01F4 01FC      MOVW	R30,R24
    01F5 8140      LDD	R20,Z+0
    01F6 8151      LDD	R21,Z+1
    01F7 8162      LDD	R22,Z+2
    01F8 8173      LDD	R23,Z+3
    01F9 937A      ST	R23,-Y
    01FA 936A      ST	R22,-Y
    01FB 935A      ST	R21,-Y
    01FC 934A      ST	R20,-Y
    01FD 0196      MOVW	R18,R12
    01FE 8C0A      LDD	R0,Y+26
    01FF 8C1B      LDD	R1,Y+27
    0200 0D20      ADD	R18,R0
    0201 1D31      ADC	R19,R1
    0202 E004      LDI	R16,4
    0203 E010      LDI	R17,0
    0204 940E0492  CALL	empy16s
    0206 01F8      MOVW	R30,R16
    0207 A408      LDD	R0,Y+40
    0208 A419      LDD	R1,Y+41
    0209 0DE0      ADD	R30,R0
    020A 1DF1      ADC	R31,R1
    020B 8140      LDD	R20,Z+0
    020C 8151      LDD	R21,Z+1
    020D 8162      LDD	R22,Z+2
    020E 8173      LDD	R23,Z+3
    020F 937A      ST	R23,-Y
    0210 936A      ST	R22,-Y

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -