基于python的FFT

import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']   #显示中文
mpl.rcParams['axes.unicode_minus']=False       #显示负号
N = 255 #采样点的个数

x = np.arange(0,2*np.pi,2*np.pi/N)
#长生频率为50、7、100hz的信号
y = 7 * np.sin(50*x) + 5.5 * np.sin(7 * x) + 3 * np.sin(100 * x)+10

fft_y = fft(y)  # 快速傅里叶变换
fft_y = fft_y[range(N//2)] #折半,丢掉镜像对称的信号
fft_a = np.abs(fft_y) #求复数的模值
fft_a = fft_a*2/N   #幅值的N/2倍就是对应模值
fft_a[0] /= 2 #直流分量的模值为幅值的N倍
w = np.arange(0,N//2,1) #频率分辨率=采样率/采样点的个数,但这里做了折半处理
plt.figure()
plt.title("时域波形")
plt.plot(x,y)

plt.figure()
plt.title("频域波形")
plt.plot(w,fft_a)

plt.show()


效果图:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
FFT 滤波(Fast Fourier Transform Filtering)是一种基于频域的图像滤波方法,可以通过对图像进行 Fourier 变换,然后在频域上进行滤波,最后再进行反 Fourier 变换得到处理后的图像。在 Python 中可以使用 OpenCV 库提供的函数 `cv2.dft()` 和 `cv2.idft()` 来实现 FFT 滤波。 函数原型如下: ```python cv2.dft(src[, dst[, flags[, nonzeroRows]]]) → dst cv2.idft(src[, dst[, flags[, nonzeroRows]]]) → dst ``` 其中,参数含义如下: - `src`:输入图像,必须为浮点型; - `dst`:输出数组,与输入数组具有相同的大小和类型; - `flags`:变换的标志,可以是以下值之一: - `cv2.DFT_COMPLEX_OUTPUT`:输出为双通道复数数组; - `cv2.DFT_REAL_OUTPUT`:输出为单通道实数数组; - `cv2.DFT_INVERSE`:进行反 Fourier 变换; - `cv2.DFT_SCALE`:对结果进行缩放; - `cv2.DFT_ROWS`:对每一行独立进行变换; - `cv2.DFT_COMPLEX_INPUT`:输入为双通道复数数组; - `cv2.DFT_COMPLEX_OUTPUT`:输出为双通道复数数组; - `cv2.DFT_REAL_INPUT`:输入为单通道实数数组; - `cv2.DFT_INVERSE_SCALE`:对结果进行反缩放; - `nonzeroRows`:当输入数组的行数大于零时,可以指定需要变换的行数。 下面是一个简单的例子,使用 FFT 滤波对图像进行高通滤波: ```python import cv2 import numpy as np img = cv2.imread('image.jpg', 0) rows, cols = img.shape crow, ccol = rows // 2, cols // 2 # 创建一个掩膜,中心为 0,其余为 1 mask = np.ones((rows, cols), np.uint8) mask[crow - 30: crow + 30, ccol - 30: ccol + 30] = 0 # 进行 Fourier 变换,得到频域图像 dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) # 对频域图像进行滤波 dft_shift *= mask # 进行反 Fourier 变换,得到处理后的图像 idft_shift = np.fft.ifftshift(dft_shift) idft = cv2.idft(idft_shift) img_filtered = cv2.magnitude(idft[:, :, 0], idft[:, :, 1]) cv2.imshow('Original Image', img) cv2.imshow('Filtered Image', img_filtered) cv2.waitKey(0) ``` 其中,`image.jpg` 是待处理的图像文件名,首先创建一个掩膜,中心为 0,其余为 1,然后对输入图像进行 Fourier 变换,得到频域图像。对频域图像进行滤波后,再进行反 Fourier 变换,得到处理后的图像。 运行代码后,会弹出一个名为 `Original Image` 的窗口,显示原始图像,和一个名为 `Filtered Image` 的窗口,显示处理后的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值