- _jisuanfudu: [url=home.php?mod=space&uid=72445]@[/url] 计算幅度
- [url=home.php?mod=space&uid=72445]@[/url] 入r0= 实部,r1= 虚部
- @ 出r0 = 幅度
- @ Mag ~=Alpha * max(|I|, |Q|) + Beta * min(|I|, |Q|)
- @ Alpha * Max + Beta * Min
- push {r1-r3,lr}
- movs r0, r0
- bpl _shibubushifushu
- mvns r0, r0 @ 是负数转成正数
- adds r0, r0, # 1
- _shibubushifushu: @ 实部不是负数
- movs r1, r1
- bpl _xububushifushu
- mvns r1, r1 @ 是负数转成正数
- adds r1, r1, # 1
- _xububushifushu: @ 虚部不是负数
- cmp r0, # 0
- bne _panduanxubushibushi0
- mov r0, r1
- pop {r1-r3,pc}
- _panduanxubushibushi0:
- cmp r1, # 0
- bne _jisuanfudu1
- pop {r1-r3,pc}
- _jisuanfudu1:
- ldr r2, = 31066 @ Alpha q15 0.948059448969
- ldr r3, = 12867 @ Beta q15 0.392699081699
- cmp r1, r0
- bhi _alpha_min_beta_max
- _alpha_max_beta_min:
- muls r0, r0, r2
- muls r1, r1, r3
- asrs r0, r0, # 15
- asrs r1, r1, # 15
- adds r0, r0, r1
- movs r1, # 1
- pop {r1-r3,pc}
- _alpha_min_beta_max:
- muls r0, r0, r3
- muls r1, r1, r2
- asrs r0, r0, # 15
- asrs r1, r1, # 15
- adds r0, r0, r1
- movs r1, # 0
- pop {r1-r3,pc}
- _lvboqi:
- @滤波器
- @R0=地址,R1=长度,r2=表指针地址,r3=ADC数值
- @出R0=结果
- push {r1-r7,lr}
- ldr r5, [r2] @读出表指针
- lsls r6, r1, # 1
- strh r3, [r0, r5] @数值写到滤波器缓冲区
- adds r5, r5, # 2
- cmp r5, r6
- bne _lvboqimeidaohuanchongquding
- movs r5, # 0
- _lvboqimeidaohuanchongquding:
- str r5, [r2]
- movs r7, # 0
- _lvboqixunhuan:
- cmp r5, r6
- bne _lvbozonghe
- movs r5, # 0
- _lvbozonghe:
- ldrh r4, [r0, r5]
- adds r5, r5, # 2
- adds r7, r7, r4
- subs r1, r1, # 1
- bne _lvboqixunhuan
- asrs r0, r7, # 10 @修改
- pop {r1-r7,pc}
-
- _fftjisuan:
- @ 入口 R0=数据地址
- @ 输出实部=0X20000000-0X20000400
- @ 输出虚部=0X20000400-0X20000800
- @ 结果左移6位(乘64)
- push {r0-r7,lr}
- _fft1:
- ldr r1, = 0x20000000 @ 输出地址
- movs r2, # 128 @ 蝴蝶数量
- ldr r3, = hudieweifanzhuan @ 蝴蝶位反转表
- _fft1xunhuan:
- ldr r6, [r3] @ 取出位反转表里的地一个数据
- ldr r7, [r3, # 0x04] @ 取出第二个
- ldr r6, [r0, r6] @ 根据位反转表找到对应的输入数据
- ldr r7, [r0, r7] @ 第二个
- adds r4, r6, r7 @ 求出蝴蝶上
- subs r5, r6, r7 @ 求出蝴蝶下
- str r4, [r1]
- str r5, [r1, # 0x04] @ 把反过来的顺序排列
- adds r1, r1, # 0x08 @ 输出的地址自增
- adds r3, r3, # 0x08 @ 反转表自增
- subs r2, r2, # 1 @ 蝴蝶数减1
- bne _fft1xunhuan @ 蝴蝶数不到
- _fft2:
- ldr r0, = 0x20000000 @ 实部输出地址0x20000000
- movs r4, # 1
- lsls r4, r4, # 10
- adds r4, r4, r0 @ 虚部输出地址 0x20000400
- mov r8, r4 @ 实部和虚部中间
- _fft2xunhuan:
- ldr r4, [r0] @ 取出数据0
- ldr r5, [r0, # 0x08] @ 取出数据2
- ldr r6, [r0, # 0x04] @ 取出数据1
- ldr r7, [r0, # 0x0c] @ 取出数据3
- adds r1, r4, r5 @ 计算蝴蝶上
- subs r2, r4, r5 @ 计算蝴蝶下
- mov r3, r6 @ 0 r 蝴蝶上实部
- movs r4, # 0
- subs r4, r4, r7 @ 0i 蝴蝶上虚部
- mov r5, r6 @ 3r 蝴蝶下实部
- mov r6, r7 @ 3i 蝴蝶下虚部
- movs r7, # 1
- lsls r7, r7, # 10 @ 内存实部和虚部中间
- adds r7, r7, r0 @ R7等于虚部首地址
- str r1, [r0] @ 蝴蝶上保存实部
- str r2, [r0, # 0x08] @ 蝴蝶下实部
- str r3, [r0, # 0x04] @ 第二组蝴蝶上实部
- str r4, [r7, # 0x04] @ 第二组蝴蝶上虚部
- str r5, [r0, # 0x0c] @ 第二组蝴蝶下实部
- str r6, [r7, # 0x0c] @ 第二组下虚部
- adds r0, r0, # 0x10 @ 蝴蝶组自增
- cmp r0, r8
- bne _fft2xunhuan @ 地址不到循环
- _fft3:
- ldr r6, = xuanzhuanyinzi @ 旋转因子自增变量
- ldr r2, = fft3xuanzhuanyinzi @ 旋转因子第三步的表
- ldr r0, = 0x20000000 @ 实部输出地址
- str r2, [r6] @ 旋转因子表首地址写到变量
- movs r1, # 1
- lsls r1, r1, # 10
- adds r1, r1, r0 @ 虚部输出地址
- mov r8, r1 @ R8虚部地址自增变量
- mov r9, r0 @ R9实部地址自增变量
- mov r10, r2 @ 旋转因子地址写到R10
- movs r5, # 0x10 @ 两组蝴蝶的距离
- mov r11, r5 @ 写到R11
- movs r5, # 4 @ 旋转因子数量
- mov r12, r5 @ 旋转因子数量写到R12
- bl _fftg
- _fft4:
- ldr r6, = xuanzhuanyinzi @ 旋转因子自增变量
- ldr r2, = fft4xuanzhuanyinzi @ 旋转因子第四步表
- ldr r0, = 0x20000000 @ 实部地址
- str r2, [r6] @ 第四步旋转因子表写到自增变量
- movs r1, # 1
- lsls r1, r1, # 10
- adds r1, r1, r0 @ r1 = 虚部地址
- mov r8, r1 @
- mov r9, r0
- mov r10, r2
- movs r5, # 0x20
- mov r11, r5
- movs r5, # 8
- mov r12, r5
- bl _fftg
- _fft5:
- ldr r6, = xuanzhuanyinzi
- ldr r2, = fft5xuanzhuanyinzi
- ldr r0, = 0x20000000
- str r2, [r6]
- movs r1, # 1
- lsls r1, r1, # 10
- adds r1, r1, r0
- mov r8, r1
- mov r9, r0
- mov r10, r2
- movs r5, # 0x40
- mov r11, r5
- movs r5, # 16
- mov r12, r5
- bl _fftg
- _fft6:
- ldr r6, = xuanzhuanyinzi
- ldr r2, = fft6xuanzhuanyinzi
- ldr r0, = 0x20000000
- str r2, [r6]
- movs r1, # 1
- lsls r1, r1, # 10
- adds r1, r1, r0
- mov r8, r1
- mov r9, r0
- mov r10, r2
- movs r5, # 0x80
- mov r11, r5
- movs r5, # 32
- mov r12, r5
- bl _fftg
- _fft7:
- ldr r6, = xuanzhuanyinzi
- ldr r2, = fft7xuanzhuanyinzi
- ldr r0, = 0x20000000
- str r2, [r6]
- movs r1, # 1
- lsls r1, r1, # 10
- adds r1, r1, r0
- mov r8, r1
- mov r9, r0
- mov r10, r2
- movs r5, # 1
- lsls r5, r5, # 8
- mov r11, r5
- movs r5, # 64
- mov r12, r5
- bl _fftg
- _fft8:
- ldr r6, = xuanzhuanyinzi
- ldr r2, = fft8xuanzhuanyinzi
- ldr r0, = 0x20000000
- str r2, [r6]
- movs r1, # 1
- lsls r1, r1, # 10
- adds r1, r1, r0
- mov r8, r1
- mov r9, r0
- mov r10, r2
- movs r5, # 1
- lsls r5, r5, # 9
- mov r11, r5
- movs r5, # 128
- mov r12, r5
- bl _fftg
- pop {r0-r7,pc}
- _fftg:
- push {lr} @ LR保存到堆栈
- movs r4, # 0
- mov lr, r4
- _fftxunhuan:
- mov r0, r9 @ R0实部地址自增变量地址
- mov r1, r8 @ R1虚部地址自增变量地址
- mov r2, r10 @ 旋转因子表地址地址
- mov r3, r11 @ 两组蝴蝶的距离
- ldr r4, [r0] @ r4=蝴蝶上实部
- ldr r5, [r1] @ r5=蝴蝶上虚部
- ldr r6, [r0, r3] @ r6=蝴蝶下实部
- ldr r7, [r1, r3] @ r7=蝴蝶下虚部
- ldr r3, [r2] @ SR
- ldr r2, [r2, # 0x04] @ SI
- push {r4,r5} @ R4 R5保存到堆栈
- @ (a+bi)(c+di)=(ac-bd)+(ad+bc)i
- mov r4, r6 @ r4=蝴蝶下实部
- muls r4, r4, r3 @ 乘旋转因子 ac
- mov r5, r7 @ R5=蝴蝶下虚部
- muls r5, r5, r2 @ 乘旋转因子 bd
- subs r4, r4, r5 @ ac-bd
- asrs r4, r4, # 15 @ 截断Q15
- mov r5, r6
- muls r5, r5, r2 @ ad
- muls r7, r7, r3 @ bc
- adds r7, r7, r5 @ ad+bc
- asrs r7, r7, # 15 @ 截断Q15
- pop {r2,r5} @ R2= 蝴蝶上实部
- @ r5= 蝴蝶上虚部
- adds r3, r2, r4 @ 上实部加下实部=结果上实部
- subs r2, r2, r4 @ 下实部减上实部=结果下实部
- adds r4, r5, r7 @ 上虚部加下虚部=结果上虚部
- subs r5, r5, r7 @ 上虚部减下虚部=结果下虚部
- mov r6, r11 @ r6=蝴蝶距离
- asrs r3, r3, # 1 @ 右移一位防止溢出
- asrs r4, r4, # 1 @ 右移一位防止溢出
- asrs r2, r2, # 1 @ 右移一位防止溢出
- asrs r5, r5, # 1 @ 右移一位防止溢出
- str r3, [r0] @ 保存上实部
- str r4, [r1] @ 保存上虚部
- str r2, [r0, r6] @ 保存下实部
- str r5, [r1, r6] @ 保存下虚部
- adds r0, r0, # 0x04 @ 实部地址加4
- adds r1, r1, # 0x04 @ 虚部地址加4
- mov r9, r0 @ r9=当前实部地址
- mov r8, r1 @ R8=当前虚部地址
- mov r2, r10 @ r2= 当前旋转因子地址
- adds r2, r2, # 0x08 @ R2 = 旋转因子地址加8
- mov r10, r2 @ 保存回去
- mov r4, lr @ 一个蝴蝶旋转因子变量
- adds r4, r4, # 1 @ 自增
- mov lr, r4 @ 保存回去
- mov r7, r12 @ 取出旋转因子总数量
- cmp r4, r7 @ 到没到数量
- bne _fftxunhuan @ 没到继续循环
- movs r4, # 0 @ 到了R4=0
- mov lr, r4 @ 一个蝴蝶旋转因子变量清0
- ldr r6, = xuanzhuanyinzi @ R6=旋转因子自增变量地址
- ldr r5, = 0x20000400 @ R5=虚部地址
- ldr r6, [r6] @ 取出旋转因子自增变量
- mov r7, r11 @ R7= 蝴蝶距离
- mov r10, r6 @ R10 = 旋转因子自增变量
- adds r0, r0, r7 @ 实部地址加蝴蝶距离
- adds r1, r1, r7 @ 虚部地址加蝴蝶距离
- mov r9, r0 @ R9等于当前实部地址
- mov r8, r1 @ R8等于当前虚部地址
- cmp r0, r5 @ 实部到没到虚部边界
- bne _fftxunhuan @ 没到循环计算
- pop {pc} @ 返回
- .ltorg @ 文字池