利用Pycharm实现维纳滤波、巴特沃斯滤波

一、设计指标:

三角正余弦信号:x(t)=sin(1.5πt(1-t)+2.1)+0.1sin(2.5πt+1)+0.18cos(7.6πt)

1、基于Python编程,实现上述三角函数信号,并利用随机函数为该信号添加噪声。

2、采用Python库中的维纳滤波器和巴特沃斯滤波器对1中的信号进行去噪,分别绘制出去噪前和去噪后信号的散点图和曲线。对于巴特沃斯滤波器,分析不同阶数、截止频率条件下去噪后的信号波形。

二、内容与步骤:

1.利用Pycharm编程,编写实现三角函数正余弦信号的Python语句,利用Python库中的random函数给三角正余弦信号加入随机噪声;

2.可不用定义直接利用Python库中的维纳滤波函数对已加入随机噪声的三角正余弦信号进行滤波;

3.编写实现巴特沃斯滤波的Python语句,需要自己定义巴特沃斯滤波的各个参数(如:阶数、截止频率),用自定义的巴特沃斯滤波函数对加入随机噪点的三角正余弦信号进行滤波;

4.编写绘图函数,分别绘制噪声信号,三角正余弦信号,经维纳滤波后的信号,经不同阶数、截止频率的巴特沃斯滤波后的信号。

 三、源程序:

每一句代码我都做了详细注释,就不逐句解释了

import numpy as np  # 导入numpy模块
import matplotlib.pyplot as plt  # 导入matplotlib.pyplot模块
import scipy.signal as ss  # 导入scipy.signal模块
from scipy.signal import butter, lfilter  # 从scipy.signal模块中直接导入butter和lfilter函数

# 创建一个等差数列(一维数组)作为横坐标
t = np.linspace(-1, 1, 201)
# 原始信号
clean_signal = (np.sin(1.5 * np.pi * t * (1 - t) + 2.1) + 0.1 * np.sin(2.5 * np.pi * t+ 1) + 0.18 * np.cos(7.6 * np.pi * t))

# 随机数生成器的种子,确保随机过程的可重复性。
np.random.seed(42)
# 原始信号添加噪声
noise = np.random.rand(len(t))
noisy_signal = clean_signal + noise

# 维纳滤波
wiener_filtered_signal = ss.wiener(noisy_signal, 9)


# 巴特沃斯滤波
def apply_butterworth_filter(signal, cutoff, fs, order):
    nyq = 0.5 * fs  # 将采样频率(fs)转换为奈奎斯特频率(nyq)的计算
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, analog=False)
    filtered_signal = lfilter(b, a, signal)
    return filtered_signal

fs = 1000  # 采样频率
# 第一种滤波器阶数和截止频率
cutoff_freq1 = 50  # 截止频率
order1 = 6  # 滤波器阶数

# 第二种滤波器阶数和截止频率
cutoff_freq2 = 50  # 截止频率
order2 = 4  # 滤波器阶数

# 第二种滤波器阶数和截止频率
cutoff_freq3 = 25  # 截止频率
order3 = 6  # 滤波器阶数

# 应用巴特沃斯滤波器
butter_filtered_signal1 = apply_butterworth_filter(noisy_signal, cutoff_freq1, fs, order1)
butter_filtered_signal2 = apply_butterworth_filter(noisy_signal, cutoff_freq2, fs, order2)
butter_filtered_signal3 = apply_butterworth_filter(noisy_signal, cutoff_freq3, fs, order3)

# 在一个图形窗口中创建六个子图布局,并激活第一个子图以便开始在其上绘制
plt.subplot(3, 2, 1)
# 绘制原始信号图像
plt.plot(t, clean_signal, label='Clean Signal', color='blue')
# 绘制噪声散点图像
plt.scatter(t, noisy_signal, marker='.', label='Noisy Signal', color='red')
plt.legend()  # 显示图例

# 在一个图形窗口中创建六个子图布局,并激活第二个子图以便开始在其上绘制
plt.subplot(3, 2, 2)
# 绘制去噪声后的图像
plt.plot(t, wiener_filtered_signal, label='Wiener Filtered Signal', color='green')
plt.legend()  # 显示图例

# 在一个图形窗口中创建六个子图布局,并激活第三个子图以便开始在其上绘制
plt.subplot(3, 2, 3)
# 绘制去噪声后的图像
plt.plot(t, butter_filtered_signal1, label='Butter Filtered Signal 1', color='green')
plt.legend()  # 显示图例

# 在一个图形窗口中创建六个子图布局,并激活第四个子图以便开始在其上绘制
plt.subplot(3, 2, 4)
# 绘制去噪声后的图像
plt.plot(t, butter_filtered_signal2, label='Butter Filtered Signal 2', color='green')
plt.legend()  # 显示图例

# 在一个图形窗口中创建六个子图布局,并激活第五个子图以便开始在其上绘制
plt.subplot(3, 2, 5)
# 绘制去噪声后的图像
plt.plot(t, butter_filtered_signal3, label='Butter Filtered Signal 3', color='green')
plt.legend()  # 显示图例

plt.show()  # 显示图表

四、结果:

下图为利用在线工具对三角正余弦信号拟和的图像:

edd66f3e50b44dc695b5f890e846597f.png

下图为利用维纳滤波对加入噪声的三角正余弦信号进行滤波前后的图像对比:

b616f7b8328e43028c0dd20db8060035.png

 对比绘制的图像和Python编程语句实现的图像,得出编程实现三角正余弦信号的语句无误。

下图为利用巴特沃斯滤波对加入噪声的三角正余弦信号进行滤波前后的图像对比:

815f4172231c471e8cfeb8c8a02af329.png

下图为加入噪声的三角正余弦信号及进行维纳滤波和不同阶数、截止频率巴特沃斯滤波的图像: 

06c4b2ee15f4478ea88be2aa00218aa8.png

 五、分析:

        通过对比Butter Filtered Signal 1和Butter Filtered Signal 2可以得到,滤波器阶数(order)越高滤波器的选择性更好,能够更精确地分离想要保留的频率成分和不想要的频率成分。另外,虽然巴特沃斯滤波器在设计时尽量保持相位线性,但随着阶数的增加,相位失真可能也会增大,尤其是在较高阶数时。

        通过对比Butter Filtered Signal 1和Butter Filtered Signal 3可以得到,截止频率(cutoff_freq)决定了信号中哪些频率成分被滤除或保留。对于低通滤波器,低于截止频率的信号成分被保留,而高于此频率的成分被衰减。选择不当的截止频率可能会影响到信号的主要频率成分,导致信号失真。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值