kendryte / k230_canmv

77 stars 5 forks source link

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

Open huayue0405 opened 8 months ago

huayue0405 commented 8 months ago

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

wangjianxin-canaan commented 7 months ago

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