fft模块如何提高处理速度

Viewed 54

问题描述


为啥我在测试machine的fft模块时,处理时间大约为160us,而numpy的fft模块才40us,为啥体现不出硬件加速能力,是什么原因,machine模块用的是例程程序

numpy fft的部分代码,fft_real[row_idx,:],fft_imag[row_idx,:] = np.fft.fft(input_1)这一条执行时间大约40us左右。
import time, os, sys, image
from media.sensor import *
from media.display import *
from media.media import *
import ulab.numpy as np
import utime
import math
import machine # 新增
from machine import FFT
import gc
cur_frame = sensor.snapshot()
cur_frame.histeq()
ref_bl = np.array(cur_frame.to_numpy_ref()) # 当前帧数组hanning
frame_start = utime.ticks_us() # 单帧起始时间
if ref_bl1 is None:
ref_bl1 = np.array(cur_frame.to_numpy_ref()) # 当前帧数组
hanning
continue
for row_idx in range(changdu):
input_1=ref_bl[row_idx, :]
fft_real[row_idx,:],fft_imag[row_idx,:] = np.fft.fft(input_1)
machine的fft模块为提供的案例,fft1 = FFT(data, 64, 0x555) 和res = fft1.run()两句执行时间为160us左右
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.uint16) #把列表数据转换成数组
print(data)
fft1 = FFT(data, 64, 0x555) #创建一个FFT对象,运算点数为64,偏移是0x555
res = fft1.run() #获取FFT转换后的数据
print(res)

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

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

3 Answers

请补充下你用的具体代码;补充下使用machine fft代码和 numpy fft的代码

numpy fft的部分代码,fft_real[row_idx,:],fft_imag[row_idx,:] = np.fft.fft(input_1)这一条执行时间大约40us左右。
import time, os, sys, image
from media.sensor import *
from media.display import *
from media.media import *
import ulab.numpy as np
import utime
import math
import machine # 新增
from machine import FFT
import gc
cur_frame = sensor.snapshot()
cur_frame.histeq()

    ref_bl = np.array(cur_frame.to_numpy_ref())  # 当前帧数组*hanning
    frame_start = utime.ticks_us()  # 单帧起始时间
    if ref_bl1 is None:
        ref_bl1 = np.array(cur_frame.to_numpy_ref())  # 当前帧数组*hanning
        continue
    for row_idx in range(changdu):
        input_1=ref_bl[row_idx, :]
        fft_real[row_idx,:],fft_imag[row_idx,:] = np.fft.fft(input_1)

machine的fft模块为提供的案例,fft1 = FFT(data, 64, 0x555) 和res = fft1.run()两句执行时间为160us左右
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.uint16) #把列表数据转换成数组
print(data)
fft1 = FFT(data, 64, 0x555) #创建一个FFT对象,运算点数为64,偏移是0x555
res = fft1.run() #获取FFT转换后的数据
print(res)

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

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

numpy fft的部分代码,fft_real[row_idx,:],fft_imag[row_idx,:] = np.fft.fft(input_1)这一条执行时间大约40us左右。 这是什么环境下执行的,是pc机上执行的吗?

就是在k230开发板上,micropython

目前硬件速度就是这样,估计点数(比如4096)多的时候才能体现出优势,