利用蝶形算法实现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.realcomplex_ret.imag = complex0.imag + complex1.imagreturn complex_ret
# 复数减法
def sub_ee(complex0, complex1):complex_ret = complex()complex_ret.real = complex0.real - complex1.realcomplex_ret.imag = complex0.imag - complex1.imagreturn complex_ret# 对输入数据进行按位倒叙排列(雷德算法)
def forward_input_data(input_data, num):j = num // 2for 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 // 2while (j >= k):j = j - kk = k // 2j = j + k
# 实现一维FFT
def fft_1d(in_data, num):PI = 3.1415926forward_input_data(in_data, num) #实现将数据按位倒序# 计算蝶形级数,也就是迭代次数M = 1   #M用于记录num的二分次数tmp = num / 2;  # 满足num = 2^m,基2算法while (tmp != 1):M = M + 1tmp = tmp / 2#  print("FFT level:%d" % M)complex_ret = complex()for L in range(1, M + 1):  #二分次数B = int(math.pow(2, L - 1))  # B为指数函数返回值,为float,需要转换integerfor J in range(0, B):   #分组数P = math.pow(2, M - L) * Jfor K in range(J, num, int(math.pow(2, L))):  #控制偏移值#print("L:%d B:%d, J:%d, K:%d, P:%f" % (L, B, J, K, P))complex_ret.real = math.cos((2 * PI / num) * P)complex_ret.imag = -math.sin((2 * PI / num) * P)complex_mul = mul_ee(complex_ret, in_data[K + B])complex_add = add_ee(in_data[K], complex_mul)complex_sub = sub_ee(in_data[K], complex_mul)in_data[K] = complex_addin_data[K + B] = complex_sub#  print("A[%d] real: %f, image: %f" % (K, in_data[K].real, in_data[K].imag))#  print("A[%d] real: %f, image: %f" % (K + B, in_data[K + B].real, in_data[K + B].imag))\
#二维FFT的实现方法是先对行做FFT将结果放回该行,然后再对列做FFT结果放在该列,结果就是二维FFT
def fft_2d(in_data):  #in_data已经是属于复数的集合axis=in_data.shape   #axis的结果刚好是行和列for i in range(axis[0]):  #先对行做处理fft_1d(in_data[i,:],axis[1])for j in range(axis[1]):  #再对列做处理fft_1d(in_data[:,j],axis[0])def ifft_1d(in_data,num):#先求共轭qqfor i in range(num):in_data[i].imag = - in_data[i].imag#调用傅里叶变换fft_1d(in_data,num)#求时域点共轭for i in  range(num):in_data[i].real=in_data[i].real/num;in_data[i].imag=-in_data[i].imag/num;def ifft_2d(in_data):axis = in_data.shape  # axis的结果刚好是行和列for i in range(axis[0]):  # 先对行做处理ifft_1d(in_data[i, :], axis[1])for j in range(axis[1]):  # 再对列做处理ifft_1d(in_data[:, j], axis[0])def fft_shift(in_data):m,n=in_data.shapek = m//2t = n//2for i in range(k):for j in range(t):temp=in_data[i][j]in_data[i][j]=in_data[i+k][j+t]in_data[i+k][j+t]=tempfor j in range(t,n):temp = in_data[i][j]in_data[i][j]=in_data[i+k][j-t]in_data[i+k][j-t]=tempdef ifft_shift(in_data):fft_shift(in_data)def complex_to_realcomplex(input_data):data = []m,n=input_data.shapefor i in range(m):for j in range(n):data.append(input_data[i][j].real+input_data[i][j].imag)data = np.array(data).reshape((m,n))return datadef test_fft_1d():in_data = [2, 3, 4,4,5,8,6,4]  # 待测试的8点元素# 变量data为长度为8、元素为complex类实例的list,用于存储输入数据data = [(complex()) for i in range(len(in_data))]# 将8个测试点转换为complex类的形式,存储在变量data中for i in range(len(in_data)):data[i].real = in_data[i]data[i].imag = 0.0j# 输出FFT需要处理的数据print("The input data:")for i in range(len(in_data)):print("x[%d] real: %f, imag: %f" % (i, data[i].real, data[i].imag))fft_1d(data, 8)  #进行傅里叶变换处理# 输出经过FFT处理后的结果print("The output data:")for i in range(len(in_data)):print("X[%d] real: %f, imag: %f" % (i, data[i].real, data[i].imag))
#test_fft_1d()
def test_fft_2d():# in_data = [[2, 3, 4,4],[5,8,6,4],[7,4,3,5],[9,6,4,2]]  # 待测试的8点元素# 变量data用于存储输入数据in_data = cv.imread('7.jpg', 0)m,n=in_data.shapedata = [[(complex()) for i in range(n)] for j in range(m)]#print('data\n',np.array(data).shape)# 将测试点转换为complex类的形式,存储在变量data中for i in range(m):for j in range(n):data[i][j].real = in_data   [i][j]data[i][j].imag = 0.0j# 输出FFT需要处理的数据# print("The input data:")# for i in range(m):#     for j in range(n):#         print("x[%d][%d] real: %f, imag: %f" % (i,j,data[i][j].real, data[i][j].imag))data=np.array(data)fft_2d(data)  #进行傅里叶变换处理# 输出经过FFT处理后的结果# print("The output data:")# for i in range(4):#     for j in range(5):#         print("x[%d][%d] real: %f, imag: %f" % (i,j, data[i][j].real, data[i][j].imag))# 将频谱低频从左上角移动至中心fft_shift(data)# k = np.max(np.log(1 + np.abs(data)))# res = (255 / k) * (np.log(1 + np.abs(data)))datac=complex_to_realcomplex(data)res = np.log(np.abs(datac))# 展示结果plt.subplot(121), plt.imshow(in_data, 'gray'), plt.title('Original Fourier')plt.axis('off')plt.subplot(122), plt.imshow(res, 'gray'), plt.title('Fourier Fourier')plt.axis('off')plt.show()
#test_fft_2d()def test_ifft_2d():#in_data = [[2, 3, 4,4],[5,8,6,4],[7,4,3,5],[9,6,4,2]]# 变量data用于存储输入数据in_data = cv.imread('7.jpg', 0)m, n = in_data.shapedata = [[(complex()) for i in range(n)] for j in range(m)]# print('data\n',np.array(data).shape)# 将测试点转换为complex类的形式,存储在变量data中for i in range(m):for j in range(n):data[i][j].real = in_data[i][j]data[i][j].imag = 0.0jdata = np.array(data)fft_2d(data)  # 进行傅里叶变换处理# 将频谱低频从左上角移动至中心fft_shift(data)data_shift=data.copy()# k = np.max(np.log(1 + np.abs(data)))# res = (255 / k) * (np.log(1 + np.abs(data)))datac = complex_to_realcomplex(data)res = np.log(np.abs(datac))#傅里叶逆变换#先将低频移回原位置ifft_shift(data_shift)ifft_2d(data_shift)datac2 = complex_to_realcomplex(data_shift)res2 = np.abs(datac2)# 展示结果plt.subplot(121), plt.imshow(res, 'gray'), plt.title('Fourier Fourier')plt.axis('off')plt.subplot(122), plt.imshow(res2, 'gray'), plt.title('Fourier-to-image')plt.axis('off')plt.show()
test_ifft_2d()

python实现FFT,IFFT相关推荐

  1. python numpy.fft.fft和ifft

    python numpy.fft.fft和ifft(离散傅里叶变换和反傅里叶变换) numpy.fft 的fft和ifft是相逆变换操作,这里用ECG信号做演示. 1.傅里叶转换是将时域信号转化为频域 ...

  2. python fft ifft

    文章目录 条件 代码 实例 条件 任何一个满足狄利克雷条件的函数都可以通过傅里叶基数展开. numpy和scipy中都有fft变换,且效果都是一样的. 代码 import numpy as np fr ...

  3. 基于python的FFT演示程序

    本章详细介绍如何综合利用之前所学习的numpy,traits,traitsUI和Chaco等多个库,编写一个FFT演示程序.此程序可以帮助你理解FFT是如何将时域信号转换为频域信号的,在开始正式的程序 ...

  4. 频谱分析:c和python对比FFT的效率并画出幅度谱

    一.c语言编写的FFT程序 c语言程序 正弦波表达式为: s(t) = 0.6 sin( 2π 50t ) 和s(t) = 0.6 sin( 2π 500t ) 频率为8000Hz,近似为8192 F ...

  5. 基于vivado实现FFT/IFFT

    文章目录 前言 一.基本过程 二.vivado配置 1.新建工程 2.调用DDS的IP核 2.调用FFT的IP核 三.编写Verilog程序 1.顶层文件fft.v 2.仿真文件fft_tb.v 四. ...

  6. fftw3/gsl/kissfft/OouraFFT库中傅里叶变换/反傅里叶变换函数和Matlab中的fft/ifft的对应关系

    先分析一维度的 一.fftw_plan_dft_1d 正变换: fftw_complex *in = fftw_malloc ( sizeof ( fftw_complex ) * n ); fftw ...

  7. Armadillo使用介绍(十二):fft / ifft

    fft / ifft 用途:fft / ifft函数用于一维快速傅里叶变换/快速傅里叶逆变换. 该函数重载有cx_mat Y = fft( X ).cx_mat Y = fft( X, n ).cx_ ...

  8. 离散傅里叶变换(DFT/IDFT、FFT/IFFT)运算量的讨论

    前言:关于为什么要写这个博客 最近在重新看<合成孔径雷达成像 算法与实现>这本书,看到"离散傅里叶变换记其逆变换的运算量级为"这句话,就想起当初在学<数字信号处理 ...

  9. 用 python 实现FFT,绘制频谱图

    用 python 实现FFT,绘制频谱图 关键词 :fft , scipy 库, fftshift ,单边谱,双边谱,频谱泄露 目录 用 python 实现FFT,绘制频谱图 前言 代码 结果 总结和 ...

  10. 图像的变换——fft/ ifft、fftn、fft2、dct2、dict2、dctmtx

    文章目录 一.离散傅立叶变换 1.fft/ ifft--快速傅立叶变换/反变换 2.fftn-进行n维快速傅里叶变换 3.fft2-进行2维快速傅里叶变换 二.离散余弦变换 1.dct2 函数 2.d ...

最新文章

  1. 干货,Wireshark使用技巧-过滤规则
  2. 离散型随机变量的分布律
  3. iOS瀑布流实现(Swift)
  4. java去除字符串的html标签
  5. sap 发送mesage_SAP的message机制
  6. python3线程gil_python3爬虫GIL修改多线程实例讲解
  7. 微软python免费课程_微软再推免费在线Python教程 面向数据科学和机器学习初学者...
  8. 小程序文章怎么导出来_宠物小程序怎么进行盈利
  9. 看了这个视频都想辞职了
  10. java读取图片画布大小_在html5中,为什么最好不要用css去修改画布的大小?
  11. 从ISSCC2021论文看未来技术发展趋势
  12. 机器人操作系统、自动驾驶等研发工具整理
  13. FCC拆解诺基亚808 PureView 内部细节全曝光
  14. Windows server 2003 安装步骤
  15. 中国版Second Life前途难料
  16. Eclipse工具工作环境配置/统一风格
  17. html onload状态事件,HTML onload事件用法及代码示例
  18. ubuntu下如何查看opencv的版本
  19. Toasts官方教程
  20. 大白话解析Context中的cancelCtx

热门文章

  1. 山寨机需要规范,中国需要山寨机
  2. Django 项目编码问题1UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd2 in position 0: invalid contin
  3. 《人工智能的未来》摘录
  4. 美大联盟中国小将3年年薪翻60倍 从第7前锋到赢新合同
  5. 台湾大学教授洪士灏对产业前景的讨论
  6. Oracle Coherence 3.5 读书笔记之3 - 满足性能,可扩展和可用性目标
  7. 神州租车还有这些新玩法?打造了行业新标杆
  8. 拼团系统开发|全民拼购商业模式解读
  9. PR和AE有什么区别?
  10. 相机平面与工作平面带夹角下的坐标换算