Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: FFT计算幅值是实际的2倍,偏移量问题 #4

Open
huayue0405 opened this issue Feb 28, 2024 · 1 comment
Open

[Bug]: FFT计算幅值是实际的2倍,偏移量问题 #4

huayue0405 opened this issue Feb 28, 2024 · 1 comment
Assignees
Labels
bug Something isn't working

Comments

@huayue0405
Copy link

What happened

FFT计算
实际幅值为[0,10,20,30,0.2,1000]
计算幅值为[0, 19, 40, 59, 0, 1998]
考虑到0.2被整数量化为0,但其余幅值均差2倍

Reproduction steps

基础示例

欢迎使用CanMV IDE, 点击IDE左下角的绿色按钮开始执行脚本

from machine import FFT
import array
import math
from ulab import numpy as np
PI = 3.14159265358979323846264338327950288419716939937510

rx = []
def input_data():
for i in range(64):
data0 = 10 * math.cos(2 * PI * i / 64)
data1 = 20 * math.cos(2 * 2 * PI * i / 64)
data2 = 30 * math.cos(3 * 2 * PI * i / 64)
data3 = 0.2 * math.cos(4 * 2 * PI * i / 64)
data4 = 1000 * math.cos(5 * 2 * PI * i / 64)
rx.append((int(data0 + data1 + data2 + data3 + data4)))
input_data() #初始化需要进行FFT的数据,列表类型
#print(rx)
data = np.array(rx,dtype=np.int16) #把列表数据转换成数组
#print(data)
fft1 = FFT(data, 64, 0) #创建一个FFT对象,运算点数为64,偏移是0x555
res = fft1.run() #获取FFT转换后的数据
#print(res)

res = fft1.amplitude(res) #获取各个频率点的幅值
print(res)

#res = fft1.freq(64,38400) #获取所有频率点的频率值
#print(res)

Hardware board

k230 canmv

Software version

micropython v0.4

Bug frequency

all

Anything else

同时案例中的转换,为什么采用的是uint16
data = np.array(rx,dtype=np.uint16)

fft1 = FFT(data, 64, 0x555)
测试偏移量只支持16进制和8进制,是否在说明文档和案例中说明偏移的格式
同时,在进行偏移时FFT幅值为原来的1/2?

`from machine import FFT
import array
import math
from ulab import numpy as np
PI = 3.14159265358979323846264338327950288419716939937510

rx = []
def input_data():
for i in range(64):
data0 = 10 * math.sin(2 * PI * i / 64) +10
data1 = 0#20 * math.cos(2 * 2 * PI * i / 64)
data2 = 0#30 * math.cos(3 * 2 * PI * i / 64)
data3 = 0#0.2 * math.cos(4 * 2 * PI * i / 64)
data4 = 0# 1000 * math.cos(5 * 2 * PI * i / 64)
rx.append((int(data0 + data1 + data2 + data3 + data4)))
input_data() #初始化需要进行FFT的数据,列表类型
#print(rx)
data = np.array(rx,dtype=np.int16) #把列表数据转换成数组
#print(data)
fft1 = FFT(data, 64, 0xA) # 偏置10 ,16进制
res = fft1.run() #获取FFT转换后的数据
#print(res)

res = fft1.amplitude(res) #获取各个频率点的幅值
print(res)`

结果

[9, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
除直流分量接近,幅值仅为原有10的1/2

@huayue0405 huayue0405 added the bug Something isn't working label Feb 28, 2024
@wangjianxin-canaan
Copy link
Contributor

目前幅值计算确实有问题,下个版本解决

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants