📄 ff.lis
字号:
.module ff.c
.area data(ram, con, rel)
0000 _dataR::
0000 .blkb 4
.area idata
0000 0000A040 .word 0x0,0x40a0
.area data(ram, con, rel)
0004 .blkb 4
.area idata
0004 0000A040 .word 0x0,0x40a0
.area data(ram, con, rel)
0008 .blkb 4
.area idata
0008 0000A040 .word 0x0,0x40a0
.area data(ram, con, rel)
000C .blkb 4
.area idata
000C 0000A040 .word 0x0,0x40a0
.area data(ram, con, rel)
0010 .blkb 4
.area idata
0010 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0014 .blkb 4
.area idata
0014 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0018 .blkb 4
.area idata
0018 00000000 .word 0x0,0x0
.area data(ram, con, rel)
001C .blkb 4
.area idata
001C 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0020 .dbfile D:\HJN\Design\AVR\fft\ff.c
0020 .dbsym e dataR _dataR A[32:8]D
0020 _dataI::
0020 .blkb 4
.area idata
0020 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0024 .dbfile D:\HJN\Design\AVR\fft\ff.c
0024 .blkb 4
.area idata
0024 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0028 .dbfile D:\HJN\Design\AVR\fft\ff.c
0028 .blkb 4
.area idata
0028 00000000 .word 0x0,0x0
.area data(ram, con, rel)
002C .dbfile D:\HJN\Design\AVR\fft\ff.c
002C .blkb 4
.area idata
002C 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0030 .dbfile D:\HJN\Design\AVR\fft\ff.c
0030 .blkb 4
.area idata
0030 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0034 .dbfile D:\HJN\Design\AVR\fft\ff.c
0034 .blkb 4
.area idata
0034 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0038 .dbfile D:\HJN\Design\AVR\fft\ff.c
0038 .blkb 4
.area idata
0038 00000000 .word 0x0,0x0
.area data(ram, con, rel)
003C .dbfile D:\HJN\Design\AVR\fft\ff.c
003C .blkb 4
.area idata
003C 00000000 .word 0x0,0x0
.area data(ram, con, rel)
0040 .dbfile D:\HJN\Design\AVR\fft\ff.c
0040 .dbsym e dataI _dataI A[32:8]D
.area text(rom, con, rel)
0000 .dbfile D:\HJN\Design\AVR\fft\ff.c
0000 .dbfunc e FFT _FFT fV
0000 ; xx -> y+12
0000 ; x2 -> R14,R15
0000 ; x1 -> R10,R11
0000 ; x0 -> R12,R13
0000 ; L -> y+24
0000 ; j -> R10,R11
0000 ; temp -> y+8
0000 ; TI -> y+4
0000 ; TR -> y+0
0000 ; b -> y+22
0000 ; p -> R14,R15
0000 ; k -> R12,R13
0000 ; dataI -> y+38
0000 ; dataR -> y+36
.even
0000 _FFT::
0000 0E940000 xcall push_arg4
0004 0E940000 xcall push_gset5
0008 6A97 sbiw R28,26
000A .dbline -1
000A .dbline 10
000A ; #include <iom128v.h>
000A ; #include <math.h>
000A ; #define PI 3.1415926
000A ;
000A ; unsigned char i,w[32];
000A ; float dataR[]={5,5,5,5,0,0,0,0};
000A ; float dataI[]={0,0,0,0,0,0,0,0};
000A ;
000A ; void FFT(float dataR[],float dataI[])
000A ; {
000A .dbline 17
000A ; int x0,x1,x2,xx;
000A ;
000A ; int L,j,k,b,p;
000A ; float TR,TI,temp;
000A ;
000A ; /********** following code invert sequence ************/
000A ; for(i=0;i<8;i++)
000A 2224 clr R2
000C 20922000 sts _i,R2
0010 55C0 xjmp L5
0012 L2:
0012 .dbline 18
0012 .dbline 19
0012 EE24 clr R14
0014 FF24 clr R15
0016 AA24 clr R10
0018 BB24 clr R11
001A CC24 clr R12
001C DD24 clr R13
001E .dbline 20
001E 80912000 lds R24,_i
0022 9927 clr R25
0024 8170 andi R24,1
0026 9070 andi R25,0
0028 6C01 movw R12,R24
002A .dbline 21
002A 22E0 ldi R18,2
002C 30E0 ldi R19,0
002E 00912000 lds R16,_i
0032 1127 clr R17
0034 0E940000 xcall div16s
0038 C801 movw R24,R16
003A 8170 andi R24,1
003C 9070 andi R25,0
003E 5C01 movw R10,R24
0040 .dbline 22
0040 24E0 ldi R18,4
0042 30E0 ldi R19,0
0044 00912000 lds R16,_i
0048 1127 clr R17
004A 0E940000 xcall div16s
004E C801 movw R24,R16
0050 8170 andi R24,1
0052 9070 andi R25,0
0054 7C01 movw R14,R24
0056 .dbline 23
0056 02E0 ldi R16,2
0058 10E0 ldi R17,0
005A 9501 movw R18,R10
005C 0E940000 xcall empy16s
0060 1801 movw R2,R16
0062 04E0 ldi R16,4
0064 10E0 ldi R17,0
0066 9601 movw R18,R12
0068 0E940000 xcall empy16s
006C 2801 movw R4,R16
006E 420C add R4,R2
0070 531C adc R5,R3
0072 4E0C add R4,R14
0074 5F1C adc R5,R15
0076 5D86 std y+13,R5
0078 4C86 std y+12,R4
007A .dbline 24
007A 20902000 lds R2,_i
007E 84E0 ldi R24,4
0080 829D mul R24,R2
0082 F001 movw R30,R0
0084 0CA0 ldd R0,y+36
0086 1DA0 ldd R1,y+37
0088 E00D add R30,R0
008A F11D adc R31,R1
008C 2080 ldd R2,z+0
008E 3180 ldd R3,z+1
0090 4280 ldd R4,z+2
0092 5380 ldd R5,z+3
0094 2C85 ldd R18,y+12
0096 3D85 ldd R19,y+13
0098 04E0 ldi R16,4
009A 10E0 ldi R17,0
009C 0E940000 xcall empy16s
00A0 F801 movw R30,R16
00A2 0EA0 ldd R0,y+38
00A4 1FA0 ldd R1,y+39
00A6 E00D add R30,R0
00A8 F11D adc R31,R1
00AA 2082 std z+0,R2
00AC 3182 std z+1,R3
00AE 4282 std z+2,R4
00B0 5382 std z+3,R5
00B2 .dbline 25
00B2 L3:
00B2 .dbline 17
00B2 80912000 lds R24,_i
00B6 8F5F subi R24,255 ; addi 1
00B8 80932000 sts _i,R24
00BC L5:
00BC .dbline 17
00BC 80912000 lds R24,_i
00C0 8830 cpi R24,8
00C2 08F4 brsh X0
00C4 A6CF xjmp L2
00C6 X0:
00C6 .dbline 26
00C6 ; {
00C6 ; x0=x1=x2=0;
00C6 ; x0=i&0x01;
00C6 ; x1=(i/2)&0x01;
00C6 ; x2=(i/4)&0x01;
00C6 ; xx=x0*4+x1*2+x2;
00C6 ; dataI[xx]=dataR[i]; //实部的数放在虚部数组中
00C6 ; }
00C6 ; for(i=0;i<8;i++)
00C6 2224 clr R2
00C8 20922000 sts _i,R2
00CC 2CC0 xjmp L9
00CE L6:
00CE .dbline 27
00CE .dbline 28
00CE 20902000 lds R2,_i
00D2 84E0 ldi R24,4
00D4 829D mul R24,R2
00D6 1001 movw R2,R0
00D8 F101 movw R30,R2
00DA 0EA0 ldd R0,y+38
00DC 1FA0 ldd R1,y+39
00DE E00D add R30,R0
00E0 F11D adc R31,R1
00E2 4080 ldd R4,z+0
00E4 5180 ldd R5,z+1
00E6 6280 ldd R6,z+2
00E8 7380 ldd R7,z+3
00EA F101 movw R30,R2
00EC 0CA0 ldd R0,y+36
00EE 1DA0 ldd R1,y+37
00F0 E00D add R30,R0
00F2 F11D adc R31,R1
00F4 4082 std z+0,R4
00F6 5182 std z+1,R5
00F8 6282 std z+2,R6
00FA 7382 std z+3,R7
00FC .dbline 29
00FC 20902000 lds R2,_i
0100 829D mul R24,R2
0102 F001 movw R30,R0
0104 0EA0 ldd R0,y+38
0106 1FA0 ldd R1,y+39
0108 E00D add R30,R0
010A F11D adc R31,R1
010C 00E0 ldi R16,<L10
010E 10E0 ldi R17,>L10
0110 0E940000 xcall lpm32
0114 0083 std z+0,R16
0116 1183 std z+1,R17
0118 2283 std z+2,R18
011A 3383 std z+3,R19
011C .dbline 30
011C L7:
011C .dbline 26
011C 80912000 lds R24,_i
0120 8F5F subi R24,255 ; addi 1
0122 80932000 sts _i,R24
0126 L9:
0126 .dbline 26
0126 80912000 lds R24,_i
012A 8830 cpi R24,8
012C 08F4 brsh X1
012E CFCF xjmp L6
0130 X1:
0130 .dbline 32
0130 ; {
0130 ; dataR[i]=dataI[i]; //将虚部保存的数传回实部
0130 ; dataI[i]=0;
0130 ; }
0130 ; /************** following code FFT *******************/
0130 ; for(L = 1 ; L <= 3 ; L ++ ) // for (1) L 代表第几级
0130 81E0 ldi R24,1
0132 90E0 ldi R25,0
0134 998F std y+25,R25
0136 888F std y+24,R24
0138 L11:
0138 .dbline 33
0138 ; {
0138 .dbline 34
0138 ; b = 1 ;
0138 81E0 ldi R24,1
013A 90E0 ldi R25,0
013C 9F8B std y+23,R25
013E 8E8B std y+22,R24
0140 .dbline 35
0140 ; i = L - 1 ;
0140 888D ldd R24,y+24
0142 998D ldd R25,y+25
0144 0197 sbiw R24,1
0146 80932000 sts _i,R24
014A 0DC0 xjmp L16
014C L15:
014C .dbline 37
014C .dbline 38
014C 02E0 ldi R16,2
014E 10E0 ldi R17,0
0150 2E89 ldd R18,y+22
0152 3F89 ldd R19,y+23
0154 0E940000 xcall empy16s
0158 1F8B std y+23,R17
015A 0E8B std y+22,R16
015C .dbline 39
015C 80912000 lds R24,_i
0160 8150 subi R24,1
0162 80932000 sts _i,R24
0166 .dbline 40
0166 L16:
0166 .dbline 36
0166 ; while ( i > 0 ) //计算第L层旋转因子的个数,即输入口间距 b= 2^(L-1)
0166 2224 clr R2
0168 30902000 lds R3,_i
016C 2314 cp R2,R3
016E 70F3 brlo L15
0170 .dbline 42
0170 ; {
0170 ; b=b*2;
0170 ; i--;
0170 ; }
0170 ;
0170 ; for ( j = 0 ; j <= b - 1 ; j ++ ) // for (2) j 用来控制计算第几个旋转因子
0170 AA24 clr R10
0172 BB24 clr R11
0174 23C2 xjmp L21
0176 L18:
0176 .dbline 43
0176 ; {
0176 .dbline 44
0176 ; p = 1 ;
0176 81E0 ldi R24,1
0178 90E0 ldi R25,0
017A 7C01 movw R14,R24
017C .dbline 45
017C ; i = 3 - L ;
017C 83E0 ldi R24,3
017E 088C ldd R0,y+24
0180 198C ldd R1,y+25
0182 8019 sub R24,R0
0184 9109 sbc R25,R1
0186 80932000 sts _i,R24
018A 0BC0 xjmp L23
018C L22:
018C .dbline 48
018C .dbline 49
018C 02E0 ldi R16,2
018E 10E0 ldi R17,0
0190 9701 movw R18,R14
0192 0E940000 xcall empy16s
0196 7801 movw R14,R16
0198 .dbline 50
0198 80912000 lds R24,_i
019C 8150 subi R24,1
019E 80932000 sts _i,R24
01A2 .dbline 51
01A2 L23:
01A2 .dbline 47
01A2 ;
01A2 ; while ( i > 0 ) /* p=pow(2,3-L)*j; */
01A2 2224 clr R2
01A4 30902000 lds R3,_i
01A8 2314 cp R2,R3
01AA 80F3 brlo L22
01AC .dbline 52
01AC ; {
01AC ; p = p * 2 ;
01AC ; i -- ;
01AC ; }
01AC ; p=p*j;
01AC 9501 movw R18,R10
01AE 8701 movw R16,R14
01B0 0E940000 xcall empy16s
01B4 7801 movw R14,R16
01B6 .dbline 54
01B6 ;
01B6 ; for ( k = j ; k < 8 ; k = k + 2 * b ) /* for (3) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -