单片机c语言fft函数,单片机ADC采样FFT计算试验
_jisuanfudu:? ?? ???[url=home.php?mod=space&uid=72445]@[/url] 計(jì)算幅度
[url=home.php?mod=space&uid=72445]@[/url] 入r0= 實(shí)部,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? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???@ 是負(fù)數(shù)轉(zhuǎn)成正數(shù)
adds r0, r0, # 1
_shibubushifushu:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???@ 實(shí)部不是負(fù)數(shù)
movs r1, r1
bpl _xububushifushu
mvns r1, r1? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???@ 是負(fù)數(shù)轉(zhuǎn)成正數(shù)
adds r1, r1, # 1
_xububushifushu:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???@ 虛部不是負(fù)數(shù)
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=長(zhǎng)度,r2=表指針地址,r3=ADC數(shù)值
@出R0=結(jié)果
push {r1-r7,lr}
ldr r5, [r2]? ?? ?? ?? ?? ? @讀出表指針
lsls r6, r1, # 1
strh r3, [r0, r5]? ?? ???@數(shù)值寫到濾波器緩沖區(qū)
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=數(shù)據(jù)地址
@ 輸出實(shí)部=0X20000000-0X20000400
@ 輸出虛部=0X20000400-0X20000800
@ 結(jié)果左移6位(乘64)
push {r0-r7,lr}
_fft1:
ldr r1, = 0x20000000? ?? ? @ 輸出地址
movs r2, # 128? ?? ?? ?? ? @ 蝴蝶數(shù)量
ldr r3, = hudieweifanzhuan @ 蝴蝶位反轉(zhuǎn)表
_fft1xunhuan:
ldr r6, [r3]? ?? ?? ?? ?? ?@ 取出位反轉(zhuǎn)表里的地一個(gè)數(shù)據(jù)
ldr r7, [r3, # 0x04]? ?? ? @ 取出第二個(gè)
ldr r6, [r0, r6]? ?? ?? ???@ 根據(jù)位反轉(zhuǎn)表找到對(duì)應(yīng)的輸入數(shù)據(jù)
ldr r7, [r0, r7]? ?? ?? ???@ 第二個(gè)
adds r4, r6, r7? ?? ?? ?? ?@ 求出蝴蝶上
subs r5, r6, r7? ?? ?? ?? ?@ 求出蝴蝶下
str r4, [r1]
str r5, [r1, # 0x04]? ?? ? @ 把反過(guò)來(lái)的順序排列
adds r1, r1, # 0x08? ?? ???@ 輸出的地址自增
adds r3, r3, # 0x08? ?? ???@ 反轉(zhuǎn)表自增
subs r2, r2, # 1? ?? ?? ???@ 蝴蝶數(shù)減1
bne _fft1xunhuan? ?? ?? ???@ 蝴蝶數(shù)不到
_fft2:
ldr r0, = 0x20000000? ?? ? @ 實(shí)部輸出地址0x20000000
movs r4, # 1
lsls r4, r4, # 10
adds r4, r4, r0? ?? ?? ?? ?@ 虛部輸出地址 0x20000400
mov r8, r4? ?? ?? ?? ?? ???@ 實(shí)部和虛部中間
_fft2xunhuan:
ldr r4, [r0]? ?? ?? ?? ?? ?@ 取出數(shù)據(jù)0
ldr r5, [r0, # 0x08]? ?? ? @ 取出數(shù)據(jù)2
ldr r6, [r0, # 0x04]? ?? ? @ 取出數(shù)據(jù)1
ldr r7, [r0, # 0x0c]? ?? ? @ 取出數(shù)據(jù)3
adds r1, r4, r5? ?? ?? ?? ?@ 計(jì)算蝴蝶上
subs r2, r4, r5? ?? ?? ?? ?@ 計(jì)算蝴蝶下
mov r3, r6? ?? ?? ?? ?? ? @ 0 r 蝴蝶上實(shí)部
movs r4, # 0
subs r4, r4, r7? ?? ?? ?? ?? ? @ 0i 蝴蝶上虛部
mov r5, r6? ?? ?? ?? ?? ? @ 3r 蝴蝶下實(shí)部
mov r6, r7? ?? ?? ?? ?? ? @ 3i 蝴蝶下虛部
movs r7, # 1
lsls r7, r7, # 10? ?? ? @ 內(nèi)存實(shí)部和虛部中間
adds r7, r7, r0? ?? ?? ?@ R7等于虛部首地址
str r1, [r0]? ?? ?? ?? ?@ 蝴蝶上保存實(shí)部
str r2, [r0, # 0x08]? ? @ 蝴蝶下實(shí)部
str r3, [r0, # 0x04]? ? @ 第二組蝴蝶上實(shí)部
str r4, [r7, # 0x04]? ? @ 第二組蝴蝶上虛部
str r5, [r0, # 0x0c]? ?? ???@ 第二組蝴蝶下實(shí)部
str r6, [r7, # 0x0c]? ? @ 第二組下虛部
adds r0, r0, # 0x10? ???@ 蝴蝶組自增
cmp r0, r8
bne _fft2xunhuan? ?? ???@ 地址不到循環(huán)
_fft3:
ldr r6, = xuanzhuanyinzi? ?? ? @ 旋轉(zhuǎn)因子自增變量
ldr r2, = fft3xuanzhuanyinzi? ?@ 旋轉(zhuǎn)因子第三步的表
ldr r0, = 0x20000000? ?? ?? ???@ 實(shí)部輸出地址
str r2, [r6]? ?? ?? ?? ?? ?? ? @ 旋轉(zhuǎn)因子表首地址寫到變量
movs r1, # 1
lsls r1, r1, # 10
adds r1, r1, r0? ?? ?? ?? ?? ? @ 虛部輸出地址
mov r8, r1? ?? ?? ?? ?? ?? ?? ???@ R8虛部地址自增變量
mov r9, r0? ?? ?? ?? ?? ?? ?? ?@ R9實(shí)部地址自增變量
mov r10, r2? ?? ?? ?? ?? ?? ?? ???@ 旋轉(zhuǎn)因子地址寫到R10
movs r5, # 0x10? ?? ?? ?? ?? ?? ?? ???@ 兩組蝴蝶的距離
mov r11, r5? ?? ?? ?? ?? ?? ???@ 寫到R11
movs r5, # 4? ?? ?? ?? ?? ?? ? @ 旋轉(zhuǎn)因子數(shù)量
mov r12, r5? ?? ?? ?? ?? ?? ?? ???@ 旋轉(zhuǎn)因子數(shù)量寫到R12
bl _fftg
_fft4:
ldr r6, = xuanzhuanyinzi? ?? ???@ 旋轉(zhuǎn)因子自增變量
ldr r2, = fft4xuanzhuanyinzi? ?? ???@ 旋轉(zhuǎn)因子第四步表
ldr r0, = 0x20000000? ?? ?? ?? ?? ? @ 實(shí)部地址
str r2, [r6]? ?? ?? ?? ?? ?? ?? ?? ?@ 第四步旋轉(zhuǎn)因子表寫到自增變量
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實(shí)部地址自增變量地址
mov r1, r8? ?? ?? ?? ?? ? @ R1虛部地址自增變量地址
mov r2, r10? ?? ?? ?? ?? ? @ 旋轉(zhuǎn)因子表地址地址
mov r3, r11? ?? ?? ?? ?? ? @ 兩組蝴蝶的距離
ldr r4, [r0]? ?? ?? ?? ?? ? @ r4=蝴蝶上實(shí)部
ldr r5, [r1]? ?? ?? ?? ?? ? @ r5=蝴蝶上虛部
ldr r6, [r0, r3]? ?? ???@ r6=蝴蝶下實(shí)部
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=蝴蝶下實(shí)部
muls r4, r4, r3? ?? ?? ?? ?? ? @ 乘旋轉(zhuǎn)因子? ?? ???ac
mov r5, r7? ?? ?? ?? ?? ? @ R5=蝴蝶下虛部
muls r5, r5, r2? ?? ?? ?? ?? ? @ 乘旋轉(zhuǎn)因子? ?? ???bd
subs r4, r4, r5? ?? ?? ?? ?? ? @ ac-bd
asrs r4, r4, # 15? ?? ???@ 截?cái)郠15
mov r5, r6
muls r5, r5, r2? ?? ?? ?? ?? ? @ ad
muls r7, r7, r3? ?? ?? ?? ?? ? @ bc
adds r7, r7, r5? ?? ?? ?@ ad+bc
asrs r7, r7, # 15? ?? ???@ 截?cái)郠15
pop {r2,r5}? ?? ?? ?? ?? ? @ R2= 蝴蝶上實(shí)部
@ r5= 蝴蝶上虛部
adds r3, r2, r4? ?? ?? ?? ?@ 上實(shí)部加下實(shí)部=結(jié)果上實(shí)部
subs r2, r2, r4? ?? ?? ?? ?@ 下實(shí)部減上實(shí)部=結(jié)果下實(shí)部
adds r4, r5, r7? ?? ?? ?? ?? ? @ 上虛部加下虛部=結(jié)果上虛部
subs r5, r5, r7? ?? ?? ?? ?? ? @ 上虛部減下虛部=結(jié)果下虛部
mov r6, r11? ?? ?? ?? ?? ? @ r6=蝴蝶距離
asrs r3, r3, # 1? ?? ???@ 右移一位防止溢出
asrs r4, r4, # 1? ?? ???@ 右移一位防止溢出
asrs r2, r2, # 1? ?? ???@ 右移一位防止溢出
asrs r5, r5, # 1? ?? ???@ 右移一位防止溢出
str r3, [r0]? ?? ?? ?? ?? ? @ 保存上實(shí)部
str r4, [r1]? ?? ?? ?? ?? ? @ 保存上虛部
str r2, [r0, r6]? ?? ???@ 保存下實(shí)部
str r5, [r1, r6]? ?? ???@ 保存下虛部
adds r0, r0, # 0x04? ?? ???@ 實(shí)部地址加4
adds r1, r1, # 0x04? ?? ???@ 虛部地址加4
mov r9, r0? ?? ?? ?? ?? ? @ r9=當(dāng)前實(shí)部地址
mov r8, r1? ?? ?? ?? ?? ? @ R8=當(dāng)前虛部地址
mov r2, r10? ?? ?? ?? ?? ? @ r2= 當(dāng)前旋轉(zhuǎn)因子地址
adds r2, r2, # 0x08? ?? ???@ R2 = 旋轉(zhuǎn)因子地址加8
mov r10, r2? ?? ?? ?? ? @ 保存回去
mov r4, lr? ?? ?? ?? ?? ? @ 一個(gè)蝴蝶旋轉(zhuǎn)因子變量
adds r4, r4, # 1? ?? ???@ 自增
mov lr, r4? ?? ?? ?? ?? ???@ 保存回去
mov r7, r12? ?? ?? ?? ? @ 取出旋轉(zhuǎn)因子總數(shù)量
cmp r4, r7? ?? ?? ?? ???@ 到?jīng)]到數(shù)量
bne _fftxunhuan? ?? ?? ?@ 沒(méi)到繼續(xù)循環(huán)
movs??r4, # 0? ?? ?? ?? ?? ? @ 到了R4=0
mov lr, r4? ?? ?? ?? ?? ? @ 一個(gè)蝴蝶旋轉(zhuǎn)因子變量清0
ldr r6, = xuanzhuanyinzi @ R6=旋轉(zhuǎn)因子自增變量地址
ldr r5, = 0x20000400? ?? ?? ?@ R5=虛部地址
ldr r6, [r6]? ?? ?? ?? ?? ???@ 取出旋轉(zhuǎn)因子自增變量
mov r7, r11? ?? ?? ?? ?? ? @ R7= 蝴蝶距離
mov r10, r6? ?? ?? ?? ???@ R10 = 旋轉(zhuǎn)因子自增變量
adds r0, r0, r7? ?? ?? ?? ?? ? @ 實(shí)部地址加蝴蝶距離
adds r1, r1, r7? ?? ?? ?? ?? ? @ 虛部地址加蝴蝶距離
mov r9, r0? ?? ?? ?? ?? ? @ R9等于當(dāng)前實(shí)部地址
mov r8, r1? ?? ?? ?? ?? ? @ R8等于當(dāng)前虛部地址
cmp r0, r5? ?? ?? ?? ?? ? @ 實(shí)部到?jīng)]到虛部邊界
bne _fftxunhuan? ?? ?? ?? ?? ? @ 沒(méi)到循環(huán)計(jì)算
pop {pc}? ?? ?? ?? ?? ? @ 返回
.ltorg? ?? ?? ?? ?? ?? ?? ?? ?@ 文字池
總結(jié)
以上是生活随笔為你收集整理的单片机c语言fft函数,单片机ADC采样FFT计算试验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: elasticsearch 匹配发音相同
- 下一篇: [css] 你知道CSS中的字母“C“