利用蝶形算法实现fft,以及ifft:我的算法还不太完整,只能输入图片长宽为2**n的图片,要改进只需要根据输入的长宽进行补0,使得长宽都为2的整数倍:
import math
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 复数类
class complex:
def __init__(self):
self.real = 0.0 # 实部
self.imag = 0.0j # 虚部 必须为int或者float类
# 复数乘法
def mul_ee(complex0, complex1):
complex_ret = complex()
complex_ret.real = complex0.real * complex1.real - complex0.imag * complex1.imag # 实*实-虚*虚
complex_ret.imag = complex0.real * complex1.imag + complex0.imag * complex1.real # 实*虚+实*虚
return complex_ret
# 复数加法
def add_ee(complex0, complex1):
complex_ret = complex()
complex_ret.real = complex0.real + complex1.real
complex_ret.imag = complex0.imag + complex1.imag
return complex_ret
# 复数减法
def sub_ee(complex0, complex1):
complex_ret = complex()
complex_ret.real = complex0.real - complex1.real
complex_ret.imag = complex0.imag - complex1.imag
return complex_ret
# 对输入数据进行按位倒叙排列(雷德算法)
def forward_input_data(input_data, num):
j = num // 2
for i in range(1, num - 2):
if (i < j):
complex_tmp = input_data[i]
input_data[i] = input_data[j]
input_data[j] = complex_tmp
# print ("forward x[%d] <==> x[%d]" % (i, j))
k = num // 2
while (j >= k):
j = j - k
k = k // 2
j = j + k
# 实现一维FFT
def fft_1d(in_data, num):