python实现FFT,IFFT
利用蝶形算法实现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相关推荐
- python numpy.fft.fft和ifft
python numpy.fft.fft和ifft(离散傅里叶变换和反傅里叶变换) numpy.fft 的fft和ifft是相逆变换操作,这里用ECG信号做演示. 1.傅里叶转换是将时域信号转化为频域 ...
- python fft ifft
文章目录 条件 代码 实例 条件 任何一个满足狄利克雷条件的函数都可以通过傅里叶基数展开. numpy和scipy中都有fft变换,且效果都是一样的. 代码 import numpy as np fr ...
- 基于python的FFT演示程序
本章详细介绍如何综合利用之前所学习的numpy,traits,traitsUI和Chaco等多个库,编写一个FFT演示程序.此程序可以帮助你理解FFT是如何将时域信号转换为频域信号的,在开始正式的程序 ...
- 频谱分析:c和python对比FFT的效率并画出幅度谱
一.c语言编写的FFT程序 c语言程序 正弦波表达式为: s(t) = 0.6 sin( 2π 50t ) 和s(t) = 0.6 sin( 2π 500t ) 频率为8000Hz,近似为8192 F ...
- 基于vivado实现FFT/IFFT
文章目录 前言 一.基本过程 二.vivado配置 1.新建工程 2.调用DDS的IP核 2.调用FFT的IP核 三.编写Verilog程序 1.顶层文件fft.v 2.仿真文件fft_tb.v 四. ...
- fftw3/gsl/kissfft/OouraFFT库中傅里叶变换/反傅里叶变换函数和Matlab中的fft/ifft的对应关系
先分析一维度的 一.fftw_plan_dft_1d 正变换: fftw_complex *in = fftw_malloc ( sizeof ( fftw_complex ) * n ); fftw ...
- Armadillo使用介绍(十二):fft / ifft
fft / ifft 用途:fft / ifft函数用于一维快速傅里叶变换/快速傅里叶逆变换. 该函数重载有cx_mat Y = fft( X ).cx_mat Y = fft( X, n ).cx_ ...
- 离散傅里叶变换(DFT/IDFT、FFT/IFFT)运算量的讨论
前言:关于为什么要写这个博客 最近在重新看<合成孔径雷达成像 算法与实现>这本书,看到"离散傅里叶变换记其逆变换的运算量级为"这句话,就想起当初在学<数字信号处理 ...
- 用 python 实现FFT,绘制频谱图
用 python 实现FFT,绘制频谱图 关键词 :fft , scipy 库, fftshift ,单边谱,双边谱,频谱泄露 目录 用 python 实现FFT,绘制频谱图 前言 代码 结果 总结和 ...
- 图像的变换——fft/ ifft、fftn、fft2、dct2、dict2、dctmtx
文章目录 一.离散傅立叶变换 1.fft/ ifft--快速傅立叶变换/反变换 2.fftn-进行n维快速傅里叶变换 3.fft2-进行2维快速傅里叶变换 二.离散余弦变换 1.dct2 函数 2.d ...
最新文章
- 干货,Wireshark使用技巧-过滤规则
- 离散型随机变量的分布律
- iOS瀑布流实现(Swift)
- java去除字符串的html标签
- sap 发送mesage_SAP的message机制
- python3线程gil_python3爬虫GIL修改多线程实例讲解
- 微软python免费课程_微软再推免费在线Python教程 面向数据科学和机器学习初学者...
- 小程序文章怎么导出来_宠物小程序怎么进行盈利
- 看了这个视频都想辞职了
- java读取图片画布大小_在html5中,为什么最好不要用css去修改画布的大小?
- 从ISSCC2021论文看未来技术发展趋势
- 机器人操作系统、自动驾驶等研发工具整理
- FCC拆解诺基亚808 PureView 内部细节全曝光
- Windows server 2003 安装步骤
- 中国版Second Life前途难料
- Eclipse工具工作环境配置/统一风格
- html onload状态事件,HTML onload事件用法及代码示例
- ubuntu下如何查看opencv的版本
- Toasts官方教程
- 大白话解析Context中的cancelCtx
热门文章
- 山寨机需要规范,中国需要山寨机
- Django 项目编码问题1UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd2 in position 0: invalid contin
- 《人工智能的未来》摘录
- 美大联盟中国小将3年年薪翻60倍 从第7前锋到赢新合同
- 台湾大学教授洪士灏对产业前景的讨论
- Oracle Coherence 3.5 读书笔记之3 - 满足性能,可扩展和可用性目标
- 神州租车还有这些新玩法?打造了行业新标杆
- 拼团系统开发|全民拼购商业模式解读
- PR和AE有什么区别?
- 相机平面与工作平面带夹角下的坐标换算