📄 fft.s
字号:
.module fft.c
.area text(rom, con, rel)
.dbfile D:\HJN\Design\AVR\fft\fft.c
.dbfunc e four1 _four1 fV
; theta -> y+52
; wpi -> y+48
; wpr -> y+44
; wtemp -> y+40
; m -> y+36
; istep -> y+32
; n -> y+28
; mmax -> y+24
; wr -> y+20
; wi -> y+16
; tempi -> y+12
; tempr -> y+8
; i -> y+4
; j -> y+0
; isign -> R10,R11
; nn -> y+64
; data -> R12,R13
.even
_four1::
st -y,r19
st -y,r18
xcall push_gset4
movw R12,R16
sbiw R28,56
movw R30,R28
subi R30,188 ; addi 68
sbci R31,255
ldd R10,z+0
ldd R11,z+1
.dbline -1
.dbline 9
; /*data是输入和输出(复数),nn是FFT的点数 isign指示FFT变换方向1为正变换,
; -1为反变换,程序出自《Numerical Recipes in C》 */
;
;
; #include <math.h>
; #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
;
; void four1(float data[], unsigned long nn, int isign)
; {
.dbline 14
; unsigned long n,mmax,m,j,istep,i;
; double wtemp,wr,wpr,wpi,wi,theta;
; float tempr,tempi;
;
; n=nn << 1; //nn乘以2赋给n,作为取样点数
movw R30,R28
subi R30,192 ; addi 64
sbci R31,255
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
lsl R2
rol R3
rol R4
rol R5
movw R30,R28
std z+28,R2
std z+29,R3
std z+30,R4
std z+31,R5
.dbline 15
; j=1;
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 16
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+4,R20
std z+5,R21
std z+6,R22
std z+7,R23
xjmp L5
L2:
.dbline 16
; for (i=1;i<n;i+=2) {
.dbline 17
; if (j > i) {
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R2,R6
cpc R3,R7
cpc R4,R8
cpc R5,R9
brlo X0
xjmp L6
X0:
.dbline 17
.dbline 18
; SWAP(data[j],data[i]);
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
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+8,R2
std z+9,R3
std z+10,R4
std z+11,R5
.dbline 18
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
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
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
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 18
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
movw R30,R16
add R30,R12
adc R31,R13
movw R26,R28
adiw R26,8
ld R2,x+
ld R3,x+
ld R4,x+
ld R5,x
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 19
; SWAP(data[j+1],data[i+1]);
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
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+8,R2
std z+9,R3
std z+10,R4
std z+11,R5
.dbline 19
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
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
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R20
adc R7,R21
adc R8,R22
adc R9,R23
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R9
st -y,R8
st -y,R7
st -y,R6
movw R16,R20
movw R18,R22
xcall empy32u
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 19
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
ldi R20,4
ldi R21,0
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
movw R30,R16
add R30,R12
adc R31,R13
movw R26,R28
adiw R26,8
ld R2,x+
ld R3,x+
ld R4,x+
ld R5,x
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
.dbline 20
; }
L6:
.dbline 21
; m=n >> 1; //将n除以2的值赋给m
movw R30,R28
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
lsr R5
ror R4
ror R3
ror R2
movw R30,R28
std z+36,R2
std z+37,R3
std z+38,R4
std z+39,R5
xjmp L9
L8:
.dbline 23
.dbline 24
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
sub R6,R2
sbc R7,R3
sbc R8,R4
sbc R9,R5
movw R30,R28
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 25
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
lsr R5
ror R4
ror R3
ror R2
movw R30,R28
std z+36,R2
std z+37,R3
std z+38,R4
std z+39,R5
.dbline 26
L9:
.dbline 22
; while (m >= 2 && j > m)
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L11
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
cp R2,R6
cpc R3,R7
cpc R4,R8
cpc R5,R9
brsh X1
xjmp L8
X1:
L11:
.dbline 27
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
movw R30,R28
ldd R6,z+0
ldd R7,z+1
ldd R8,z+2
ldd R9,z+3
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R30,R28
std z+0,R6
std z+1,R7
std z+2,R8
std z+3,R9
.dbline 28
L3:
.dbline 16
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
L5:
.dbline 16
movw R30,R28
ldd R2,z+28
ldd R3,z+29
ldd R4,z+30
ldd R5,z+31
movw R30,R28
ldd R6,z+4
ldd R7,z+5
ldd R8,z+6
ldd R9,z+7
cp R6,R2
cpc R7,R3
cpc R8,R4
cpc R9,R5
brsh X2
xjmp L2
X2:
.dbline 29
; {
; j -= m;
; m >>= 1; //将m除以2的值赋给m
; }
; j += m;
; }
; mmax=2;
ldi R20,2
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+24,R20
std z+25,R21
std z+26,R22
std z+27,R23
xjmp L13
L12:
.dbline 30
; while (n > mmax) {
.dbline 31
; istep=mmax << 1;
movw R30,R28
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
lsl R2
rol R3
rol R4
rol R5
movw R30,R28
std z+32,R2
std z+33,R3
std z+34,R4
std z+35,R5
.dbline 32
; theta=isign*(6.28318530717959/mmax);
movw R16,R10
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L15
ldi R17,>L15
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L16
ldi R17,>L16
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R30,R28
; stack offset 12
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
lsr R5
ror R4
ror R3
ror R2
movw R16,R2
movw R18,R4
xcall long2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall empy32fs
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
; stack offset 12
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R16,R2
movw R18,R4
xcall long2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall add32fs
xcall div32fs
xcall empy32f
movw R30,R28
std z+52,R16
std z+53,R17
std z+54,R18
std z+55,R19
.dbline 33
; wtemp=sin(0.5*theta);
ldi R16,<L17
ldi R17,>L17
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R30,R28
; stack offset 4
ldd R2,z+56
ldd R3,z+57
ldd R4,z+58
ldd R5,z+59
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32f
xcall _sin
movw R30,R28
std z+40,R16
std z+41,R17
std z+42,R18
std z+43,R19
.dbline 34
; wpr = -2.0*wtemp*wtemp;
ldi R16,<L18
ldi R17,>L18
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R30,R28
; stack offset 4
ldd R2,z+44
ldd R3,z+45
ldd R4,z+46
ldd R5,z+47
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32fs
movw R30,R28
; stack offset 4
ldd R2,z+44
ldd R3,z+45
ldd R4,z+46
ldd R5,z+47
st -y,R5
st -y,R4
st -y,R3
st -y,R2
xcall empy32f
movw R30,R28
std z+44,R16
std z+45,R17
std z+46,R18
std z+47,R19
.dbline 35
; wpi=sin(theta);
movw R30,R28
ldd R16,z+52
ldd R17,z+53
ldd R18,z+54
ldd R19,z+55
xcall _sin
movw R30,R28
std z+48,R16
std z+49,R17
std z+50,R18
std z+51,R19
.dbline 36
; wr=1.0;
ldi R16,<L19
ldi R17,>L19
xcall lpm32
movw R30,R28
std z+20,R16
std z+21,R17
std z+22,R18
std z+23,R19
.dbline 37
; wi=0.0;
ldi R16,<L20
ldi R17,>L20
xcall lpm32
movw R30,R28
std z+16,R16
std z+17,R17
std z+18,R18
std z+19,R19
.dbline 38
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+36,R20
std z+37,R21
std z+38,R22
std z+39,R23
xjmp L24
L21:
.dbline 38
; for (m=1;m<mmax;m+=2) {
.dbline 39
movw R30,R28
ldd R2,z+36
ldd R3,z+37
ldd R4,z+38
ldd R5,z+39
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
xjmp L28
L25:
.dbline 39
.dbline 40
movw R30,R28
ldd R2,z+24
ldd R3,z+25
ldd R4,z+26
ldd R5,z+27
movw R30,R28
ldd R6,z+4
ldd R7,z+5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -