📄 ff.lst
字号:
__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 + -