傅里叶变换实现高通滤波
时间: 2023-08-29 21:05:58 浏览: 91
傅里叶变换可以用于实现高通滤波,具体步骤如下:
1. 对信号进行傅里叶变换,得到信号的频域表示。
2. 根据要实现的高通滤波器的特性,设计一个滤波器函数,用于削弱或抑制低频信号,保留高频信号。常见的高通滤波器函数有理想高通滤波器、巴特沃斯高通滤波器、切比雪夫高通滤波器等。
3. 将滤波器函数从频域表示转换为时域表示。
4. 将滤波器函数与原始信号的频域表示相乘,得到滤波后的信号的频域表示。
5. 对滤波后的信号的频域表示进行傅里叶逆变换,得到滤波后的时域信号。
需要注意的是,滤波器函数的设计和选择会影响滤波器的性能和效果。例如,理想高通滤波器具有非常陡峭的截止频率,但会引入严重的振铃效应;巴特沃斯高通滤波器具有较平滑的截止频率,但也会引入一定的幅频响应误差。因此,在实际应用中需要根据具体情况选择合适的滤波器函数,并进行参数调整和优化。
相关问题
np.fft 傅里叶变换 图像高通滤波代码演示
好的,以下是使用 np.fft 进行图像高通滤波的 Python 代码演示:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import misc
# 读取 Lena 图像
lena = misc.face(gray=True)
# 进行傅里叶变换
F = np.fft.fft2(lena)
# 将低频成分置零
Fshift = np.fft.fftshift(F)
rows, cols = lena.shape
crow, ccol = int(rows/2), int(cols/2)
Fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
F_ishift = np.fft.ifftshift(Fshift)
# 进行傅里叶逆变换
lena_filtered = np.fft.ifft2(F_ishift).real
# 绘制原始图像和滤波后的图像
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.imshow(lena, cmap='gray')
plt.title('Original Image')
plt.subplot(1, 2, 2)
plt.imshow(lena_filtered, cmap='gray')
plt.title('Filtered Image')
plt.tight_layout()
plt.show()
```
这段代码中,我们首先读取了一张灰度图像 Lena,然后使用 np.fft.fft2 函数对其进行二维傅里叶变换得到频域图像 F。接着,我们将频域图像中心化后将低频成分置零,最后使用 np.fft.ifft2 函数进行傅里叶逆变换得到滤波后的图像 lena_filtered。最后,我们使用 matplotlib 库将原始图像和滤波后的图像绘制出来,以便进行比较。
生成序列点(x , y)加随机噪声 计算傅里叶变换 计算高通滤波 计算低筒滤波 画出原图 傅里叶变换图 高通图 低通图 ,X轴 Y轴 标题 线的颜色不同
以下是一个 Python 的实现,用到了 numpy、matplotlib 和 scipy 库:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
from scipy import ndimage
# 生成序列点 (x, y)
x = np.linspace(0, 2 * np.pi, 64)
y = np.sin(x)
# 加随机噪声
np.random.seed(1234)
y += 0.1 * np.random.randn(64)
# 计算傅里叶变换
y_fft = fftpack.fft(y)
# 计算高通滤波
y_fft_highpass = y_fft.copy()
y_fft_highpass[:10] = 0 # 将前 10 个频率的分量设为 0
y_highpass = fftpack.ifft(y_fft_highpass).real
# 计算低通滤波
y_fft_lowpass = y_fft.copy()
y_fft_lowpass[10:] = 0 # 将第 10 个频率之后的分量设为 0
y_lowpass = fftpack.ifft(y_fft_lowpass).real
# 画出原图、傅里叶变换图、高通图、低通图
fig, axs = plt.subplots(2, 2, figsize=(12, 8))
axs = axs.flatten()
# 原图
axs[0].plot(x, y, color='blue')
axs[0].set_title('Original Signal', fontsize=16)
axs[0].set_xlabel('X', fontsize=12)
axs[0].set_ylabel('Y', fontsize=12)
axs[0].grid(True)
# 傅里叶变换图
y_fft_abs = np.abs(y_fft)
axs[1].plot(np.arange(len(y_fft)), y_fft_abs, color='green')
axs[1].set_title('FFT of Signal', fontsize=16)
axs[1].set_xlabel('Frequency', fontsize=12)
axs[1].set_ylabel('Amplitude', fontsize=12)
axs[1].grid(True)
# 高通图
axs[2].plot(x, y_highpass, color='red')
axs[2].set_title('High-pass Filtered Signal', fontsize=16)
axs[2].set_xlabel('X', fontsize=12)
axs[2].set_ylabel('Y', fontsize=12)
axs[2].grid(True)
# 低通图
axs[3].plot(x, y_lowpass, color='purple')
axs[3].set_title('Low-pass Filtered Signal', fontsize=16)
axs[3].set_xlabel('X', fontsize=12)
axs[3].set_ylabel('Y', fontsize=12)
axs[3].grid(True)
plt.show()
```
运行代码后,会得到一幅图像,包含了原始信号、傅里叶变换图、高通滤波后的信号、低通滤波后的信号,如下所示:
![signal_processing_demo.png](https://i.loli.net/2021/10/08/lFJ4PZ2vX3wqWfN.png)
其中,原始信号用蓝色的线表示,傅里叶变换图用绿色的线表示,高通滤波后的信号用红色的线表示,低通滤波后的信号用紫色的线表示。可以看出,傅里叶变换图中的高频分量被高通滤波去掉了,低频分量被低通滤波保留了下来。在滤波后的信号中,高通滤波后的信号更加“尖锐”,而低通滤波后的信号更加“平滑”。
阅读全文