生成序列点(x , y)加随机噪声 计算傅里叶变换 计算高通滤波 计算低筒滤波 画出原图 傅里叶变换图 高通图 低通图 ,X轴 Y轴 标题 线的颜色不同
时间: 2024-05-21 20:15:37 浏览: 79
以下是一个 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)
其中,原始信号用蓝色的线表示,傅里叶变换图用绿色的线表示,高通滤波后的信号用红色的线表示,低通滤波后的信号用紫色的线表示。可以看出,傅里叶变换图中的高频分量被高通滤波去掉了,低频分量被低通滤波保留了下来。在滤波后的信号中,高通滤波后的信号更加“尖锐”,而低通滤波后的信号更加“平滑”。
阅读全文