赞
踩
打开canmv内置的FFT的例子(官网代码可能在测试中)进行参数修改。
# 基础示例(修改版)
# 欢迎使用CanMV IDE, 点击IDE左下角的绿色按钮开始执行脚本
from machine import FFT #导入FFT
import array # 数据,列表数据等转换,为啥呢?
import math
from ulab import numpy as np # 包含array?
PI = 3.14159265358979323846264338327950288419716939937510
rx = [] # 定义待处理数据
def input_data():
for i in range(64):
data0 = 1 * math.cos(1 * 2 * PI * i / 64)
data1 = 1 * math.cos(3 * 2 * PI * i / 64)
data2 = 1 * math.cos(5 * 2 * PI * i / 64)
data3 = 1 * math.cos(7 * 2 * PI * i / 64)
data4 = 1 * math.cos(9 * 2 * PI * i / 64)
rx.append((int(data0 + data1 + data2 + data3 + data4)))
input_data() #初始化需要进行FFT的数据,列表类型
print(rx)
data = np.array(rx,dtype=np.int16) # 原本为uint16,负数会变成大数,帮助文件说支持 int16 #把列表数据转换成数组
#print(data[1:20])
fft1 = FFT(data, 64, 0) # 有符号整型,偏移量为0 #创建一个FFT对象,运算点数为64,偏移是0
res = fft1.run() #获取FFT转换后的数据
print(res)
#datar = np.array(res,dtype=np.int16)
#print(datar)
resA = fft1.amplitude(res) #获取各个频率点的幅值
print(resA)
#resF = fft1.freq(64,6400) #获取所有频率点的频率值
#print(resF[1])
k230采用的int16,那么对于生成的数据存在截断的误差,在MATLAB里绘制可看出差异,讲输出的列表数据导入到MATLAB并定义为k230
for i=1:64
cos(1 * 2 * pi * i / 64);
data1 = 1 * cos(3 * 2 * pi * i / 64);
data2 = 1 * cos(5 * 2 * pi * i / 64);
data3 = 1 * cos(7 * 2 * pi * i / 64);
data4 = 1 * cos(9 * 2 * pi * i / 64);
data(i) = data1 + data2 + data3 + data4;
end
plot(data)
hold on
plot(k230)
hold off
legend('浮点数据','int16数据')
dF=fft(data)
dFk230=fft((k230))
stem(abs(dF)/32)
hold on
stem(abs(dFk230)/32)
legend('浮点数据FFT幅值结果','int16数据FFT幅值结果')
hold off
这个截断的数据好奇怪,计算结果如下
主要的幅值不大,但还是有一些其余的影响,是数据被截断产生的其余频率。
k230计算的FFT结果如下
其中第4、6项的计算结果为(32,2),但幅值计算结果不同分别为2、1,奇怪
后续尚待研究。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。