当前位置:   article > 正文

Canmv k230 案例2——FFT测试(初版)_canmv ide 中machine

canmv ide 中machine

FFT函数测试

打开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])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述
这个截断的数据好奇怪,计算结果如下
在这里插入图片描述
主要的幅值不大,但还是有一些其余的影响,是数据被截断产生的其余频率。

k230计算的FFT结果如下
在这里插入图片描述
其中第4、6项的计算结果为(32,2),但幅值计算结果不同分别为2、1,奇怪
在这里插入图片描述
后续尚待研究。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/881329
推荐阅读
相关标签
  

闽ICP备14008679号