?? fft2.s
字號:
.module fft2.c
.area text(rom, con, rel)
.dbfile D:\HJN\Design\AVR\fft\fft2.c
.dbfunc e FFT _FFT fV
; l0 -> y+36
; vi -> y+32
; vr -> y+28
; is -> y+26
; i -> y+24
; poddi -> y+20
; poddr -> y+16
; q -> y+12
; p -> y+8
; s -> y+4
; m -> y+2
; nv -> y+0
; it -> R20,R21
; j -> R10,R11
; il -> y+70
; l -> y+68
; fi -> R12,R13
; fr -> R14,R15
; k -> y+62
; n -> y+60
; pi -> y+58
; pr -> y+56
.even
_FFT::
xcall push_arg4
xcall push_gset5
sbiw R28,46
movw R30,R28
subi R30,192 ; addi 64
sbci R31,255
ldd R14,z+0
ldd R15,z+1
movw R30,R28
subi R30,190 ; addi 66
sbci R31,255
ldd R12,z+0
ldd R13,z+1
.dbline -1
.dbline 10
; #include<math.h>
;
; /*pr:輸入實部
; pi:輸入虛部
; n為2^k,n不小于數據個數
; l:為0表示正變換,1表示反變換
; il:1表示fr為取模結果。0表示fr輸出實部fi輸出虛部
; */
; void FFT(double* pr, double* pi, int n, int k, double* fr, double* fi, int l, int il)
; {
.dbline 13
; int it,m,is,i,j,nv,l0;
; double p,q,s,vr,vi,poddr,poddi;
; for(it = 0;it <= n - 1;it ++)
clr R20
clr R21
xjmp L5
L2:
.dbline 14
; {
.dbline 15
; m = it;
std y+3,R21
std y+2,R20
.dbline 16
; is = 0;
clr R2
clr R3
std y+27,R3
std y+26,R2
.dbline 17
; for(i = 0;i <= k - 1;i ++)
std y+25,R3
std y+24,R2
xjmp L9
L6:
.dbline 18
.dbline 19
ldi R18,2
ldi R19,0
ldd R16,y+2
ldd R17,y+3
xcall div16s
movw R10,R16
.dbline 20
ldi R16,2
ldi R17,0
movw R18,R10
xcall empy16s
ldd R2,y+2
ldd R3,y+3
sub R2,R16
sbc R3,R17
ldd R18,y+26
ldd R19,y+27
ldi R16,2
ldi R17,0
xcall empy16s
movw R4,R16
add R4,R2
adc R5,R3
std y+27,R5
std y+26,R4
.dbline 21
std y+3,R11
std y+2,R10
.dbline 22
L7:
.dbline 17
ldd R24,y+24
ldd R25,y+25
adiw R24,1
std y+25,R25
std y+24,R24
L9:
.dbline 17
ldd R24,y+62
ldd R25,y+63
sbiw R24,1
ldd R2,y+24
ldd R3,y+25
cp R24,R2
cpc R25,R3
brge L6
.dbline 23
ldd R18,y+26
ldd R19,y+27
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
ldd R0,y+56
ldd R1,y+57
add R30,R0
adc R31,R1
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R30,R16
add R30,R14
adc R31,R15
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 24
ldd R18,y+26
ldd R19,y+27
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
ldd R0,y+58
ldd R1,y+59
add R30,R0
adc R31,R1
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R30,R16
add R30,R12
adc R31,R13
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 25
L3:
.dbline 13
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 13
ldd R24,y+60
ldd R25,y+61
sbiw R24,1
cp R24,R20
cpc R25,R21
brlt X3
xjmp L2
X3:
.dbline 26
; {
; j = m / 2;
; is = 2 * is + (m - 2 * j);
; m = j;
; }
; fr[it] = pr[is];
; fi[it] = pi[is];
; }
; pr[0] = 1.0;
ldi R16,<L10
ldi R17,>L10
xcall lpm32
movw R2,R16
movw R4,R18
ldd R30,y+56
ldd R31,y+57
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 27
; pi[0] = 0.0;
ldi R16,<L11
ldi R17,>L11
xcall lpm32
movw R2,R16
movw R4,R18
ldd R30,y+58
ldd R31,y+59
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 28
; p = 6.283185306 / (1.0 * n);
ldi R16,<L12
ldi R17,>L12
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L10
ldi R17,>L10
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
; stack offset 8
movw R30,R28
subi R30,188 ; addi 68
sbci R31,255
ldd R16,z+0
ldd R17,z+1
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall empy32fs
xcall div32f
movw R30,R28
std z+8,R16
std z+9,R17
std z+10,R18
std z+11,R19
.dbline 29
; pr[1] = cos(p);
movw R30,R28
ldd R16,z+8
ldd R17,z+9
ldd R18,z+10
ldd R19,z+11
xcall _cos
movw R2,R16
movw R4,R18
ldd R30,y+56
ldd R31,y+57
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
.dbline 30
; pi[1] = -sin(p);
movw R30,R28
ldd R16,z+8
ldd R17,z+9
ldd R18,z+10
ldd R19,z+11
xcall _sin
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall neg32f
ldd R30,y+58
ldd R31,y+59
std z+4,R16
std z+5,R17
std z+6,R18
std z+7,R19
.dbline 31
; if(l != 0)
movw R30,R28
subi R30,188 ; addi 68
sbci R31,255
ldd R0,z+0
ldd R1,z+1
tst R0
brne X0
tst R1
breq L13
X0:
.dbline 32
; pi[1] = -pi[1];
ldd R24,y+58
ldd R25,y+59
adiw R24,4
movw R2,R24
movw R30,R24
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall neg32f
movw R30,R2
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
L13:
.dbline 33
; for(i = 2;i <= n - 1;i ++)
ldi R24,2
ldi R25,0
std y+25,R25
std y+24,R24
xjmp L18
L15:
.dbline 34
.dbline 35
ldd R18,y+24
ldd R19,y+25
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
sbiw R30,4
ldd R0,y+56
ldd R1,y+57
add R30,R0
adc R31,R1
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R30,R0
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32f
movw R30,R28
std z+8,R16
std z+9,R17
std z+10,R18
std z+11,R19
.dbline 36
ldd R18,y+24
ldd R19,y+25
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
sbiw R30,4
ldd R0,y+58
ldd R1,y+59
add R30,R0
adc R31,R1
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R30,R0
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32f
movw R30,R28
std z+12,R16
std z+13,R17
std z+14,R18
std z+15,R19
.dbline 37
ldd R18,y+24
ldd R19,y+25
ldi R16,4
ldi R17,0
xcall empy16s
movw R24,R16
sbiw R24,4
movw R30,R24
ldd R0,y+56
ldd R1,y+57
add R30,R0
adc R31,R1
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
movw R30,R24
; stack offset 4
ldd R0,y+62
ldd R1,y+63
add R30,R0
adc R31,R1
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall add32fs
; stack offset 4
ldd R30,y+60
ldd R31,y+61
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R5
st -y,R4
st -y,R3
st -y,R2
; stack offset 8
movw R26,R28
subi R26,190 ; addi 66
sbci R27,255
ld R30,x+
ld R31,x
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall add32fs
xcall empy32f
movw R30,R28
std z+4,R16
std z+5,R17
std z+6,R18
std z+7,R19
.dbline 38
ldd R18,y+24
ldd R19,y+25
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
ldd R0,y+56
ldd R1,y+57
add R30,R0
adc R31,R1
movw R26,R28
adiw R26,8
ld R2,x+
ld R3,x+
ld R4,x+
ld R5,x
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R26,R28
; stack offset 4
adiw R26,16
ld R2,x+
ld R3,x+
ld R4,x+
ld R5,x
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall sub32f
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 39
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R30,R28
; stack offset 4
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall sub32fs
movw R30,R28
; stack offset 4
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall sub32f
ldd R18,y+24
ldd R19,y+25
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
ldd R0,y+58
ldd R1,y+59
add R30,R0
adc R31,R1
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 40
L16:
.dbline 33
ldd R24,y+24
ldd R25,y+25
adiw R24,1
std y+25,R25
std y+24,R24
L18:
.dbline 33
ldd R24,y+60
ldd R25,y+61
sbiw R24,1
ldd R2,y+24
ldd R3,y+25
cp R24,R2
cpc R25,R3
brlt X4
xjmp L15
X4:
.dbline 41
; {
; p = pr[i - 1] * pr[1];
; q = pi[i - 1] * pi[1];
; s = (pr[i - 1] + pi[i - 1]) * (pr[1] + pi[1]);
; pr[i] = p - q;
; pi[i] = s - p - q;
; }
; for(it = 0;it <= n - 2;it = it + 2)
clr R20
clr R21
xjmp L22
L19:
.dbline 42
.dbline 43
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R30,R16
add R30,R14
adc R31,R15
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+28,R2
std z+29,R3
std z+30,R4
std z+31,R5
.dbline 44
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R30,R16
add R30,R12
adc R31,R13
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+32,R2
std z+33,R3
std z+34,R4
std z+35,R5
.dbline 45
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R2,R16
add R2,R14
adc R3,R15
movw R30,R28
ldd R4,z+28
ldd R5,z+29
ldd R6,z+30
ldd R7,z+31
st -y,R7
st -y,R6
st -y,R5
st -y,R4
movw R30,R2
ldd R4,z+4
ldd R5,z+5
ldd R6,z+6
ldd R7,z+7
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall add32f
movw R30,R2
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 46
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R2,R16
add R2,R12
adc R3,R13
movw R30,R28
ldd R4,z+32
ldd R5,z+33
ldd R6,z+34
ldd R7,z+35
st -y,R7
st -y,R6
st -y,R5
st -y,R4
movw R30,R2
ldd R4,z+4
ldd R5,z+5
ldd R6,z+6
ldd R7,z+7
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall add32f
movw R30,R2
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 47
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R24,R16
add R24,R14
adc R25,R15
adiw R24,4
movw R2,R24
movw R30,R28
ldd R4,z+28
ldd R5,z+29
ldd R6,z+30
ldd R7,z+31
st -y,R7
st -y,R6
st -y,R5
st -y,R4
movw R30,R24
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall sub32f
movw R30,R2
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 48
ldi R16,4
ldi R17,0
movw R18,R20
xcall empy16s
movw R24,R16
add R24,R12
adc R25,R13
adiw R24,4
movw R2,R24
movw R30,R28
ldd R4,z+32
ldd R5,z+33
ldd R6,z+34
ldd R7,z+35
st -y,R7
st -y,R6
st -y,R5
st -y,R4
movw R30,R24
ldd R4,z+0
ldd R5,z+1
ldd R6,z+2
ldd R7,z+3
st -y,R7
st -y,R6
st -y,R5
st -y,R4
xcall sub32f
movw R30,R2
std z+0,R16
std z+1,R17
std z+2,R18
std z+3,R19
.dbline 49
L20:
.dbline 41
subi R20,254 ; offset = 2
sbci R21,255
L22:
.dbline 41
ldd R24,y+60
ldd R25,y+61
sbiw R24,2
cp R24,R20
cpc R25,R21
brlt X5
xjmp L19
X5:
.dbline 50
; {
; vr = fr[it];
; vi = fi[it];
; fr[it] = vr + fr[it + 1];
; fi[it] = vi + fi[it + 1];
; fr[it + 1] = vr - fr[it + 1];
; fi[it + 1] = vi - fi[it + 1];
; }
; m = n / 2;
ldi R18,2
ldi R19,0
ldd R16,y+60
ldd R17,y+61
xcall div16s
std y+3,R17
std y+2,R16
.dbline 51
; nv = 2;
ldi R24,2
ldi R25,0
std y+1,R25
std y+0,R24
.dbline 52
; for(l0 = k - 2;l0 >= 0;l0 --)
ldd R24,y+62
ldd R25,y+63
sbiw R24,2
std y+37,R25
std y+36,R24
xjmp L26
L23:
.dbline 53
; {
.dbline 54
; m = m / 2;
ldi R18,2
ldi R19,0
ldd R16,y+2
ldd R17,y+3
xcall div16s
std y+3,R17
std y+2,R16
.dbline 55
; nv = 2 * nv;
ldd R18,y+0
ldd R19,y+1
ldi R16,2
ldi R17,0
xcall empy16s
std y+1,R17
std y+0,R16
.dbline 56
; for(it = 0;it <= (m - 1) * nv;it = it + nv)
clr R20
clr R21
xjmp L30
L27:
.dbline 57
; for(j = 0;j <= (nv / 2) - 1;j ++)
clr R10
clr R11
xjmp L34
L31:
.dbline 58
.dbline 59
ldd R16,y+2
ldd R17,y+3
movw R18,R10
xcall empy16s
movw R18,R16
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
ldd R0,y+56
ldd R1,y+57
add R30,R0
adc R31,R1
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R18,2
ldi R19,0
; stack offset 4
ldd R16,y+4
ldd R17,y+5
xcall div16s
movw R18,R20
add R18,R10
adc R19,R11
add R18,R16
adc R19,R17
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
add R30,R14
adc R31,R15
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32f
movw R30,R28
std z+8,R16
std z+9,R17
std z+10,R18
std z+11,R19
.dbline 60
ldd R16,y+2
ldd R17,y+3
movw R18,R10
xcall empy16s
movw R18,R16
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
ldd R0,y+58
ldd R1,y+59
add R30,R0
adc R31,R1
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R18,2
ldi R19,0
; stack offset 4
ldd R16,y+4
ldd R17,y+5
xcall div16s
movw R18,R20
add R18,R10
adc R19,R11
add R18,R16
adc R19,R17
ldi R16,4
ldi R17,0
xcall empy16s
movw R30,R16
add R30,R12
adc R31,R13
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32f
movw R30,R28
std z+12,R16
std z+13,R17
std z+14,R18
std z+15,R19
.dbline 61
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -