单片机c语言fft函数,单片机ADC采样FFT计算试验
_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? ?? ?? ?? ?? ?? ?? ?? ?@ 文字池
總結
以上是生活随笔為你收集整理的单片机c语言fft函数,单片机ADC采样FFT计算试验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elasticsearch 匹配发音相同
- 下一篇: [html] 一个标签上同时出现三个或