首页 > Python资料 博客日记

python 实现信号高通、低通、带通滤波处理代码,并画出滤波后的时域频域图

2025-01-14 23:00:07Python资料围观10

这篇文章介绍了python 实现信号高通、低通、带通滤波处理代码,并画出滤波后的时域频域图,分享给大家做个参考,收藏Python资料网收获更多编程知识

Fir高通、低通、带通滤波和滤波后的时域频域简介

FIR(Finite Impulse Response,有限脉冲响应)滤波器是一种线性相位滤波器,其单位脉冲响应在时间域内有有限长度,即它在输入信号消失后会立即回到零。FIR滤波器常用于语音信号的低通、带通和高通滤波,特别是在需要无失真、稳定的频率响应和易于设计的情况下。

FIR高通、低通、带通滤波
高通滤波:保留高频信号,衰减低频信号。
低通滤波:保留低频信号,衰减高频信号。
带通滤波:仅允许某一特定频率范围内的信号通过,而衰减其他频率的信号。
时域分析
FIR滤波器的输出仅取决于当前和过去有限个输入样本,这是基于其线性结构而非递归结构的特点,也是FIR系统稳定的基础。
在时域中,FIR滤波器的输出是滤波器系数与输入信号在时域做的卷积结果。
频域分析
在频域中,FIR滤波器的输出是输入信号的频谱与滤波器频谱的乘积。
FIR滤波器可以提供平滑的频率响应,但其频率响应的陡峭程度取决于滤波器的阶数和设计。

高通、低通和带通滤波在频域中的表现就是分别对不同频率范围的信号进行加权,使得需要保留的频率范围内的信号通过,而衰减其他频率的信号。

信号高通、低通、带通滤波处理代码,并画出滤波后的时域频域图python实现样例

以下是一个使用scipy库实现信号高通、低通、带通滤波的例子,并画出滤波后的时域和频域图的示例代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# 生成测试信号
t = np.linspace(0, 1, 1000, endpoint=False)
x = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*100*t) + np.sin(2*np.pi*200*t)

# 高通滤波
highpass = signal.butter(4, 20, 'highpass', fs=1000, output='sos')
filtered_highpass = signal.sosfilt(highpass, x)

# 低通滤波
lowpass = signal.butter(4, 100, 'lowpass', fs=1000, output='sos')
filtered_lowpass = signal.sosfilt(lowpass, x)

# 带通滤波
bandpass = signal.butter(4, [40, 60], 'bandpass', fs=1000, output='sos')
filtered_bandpass = signal.sosfilt(bandpass, x)

# 绘制原始信号和滤波后的信号的时域图和频域图
fig, axs = plt.subplots(3, 2, figsize=(10, 10))
fig.suptitle('Signal Filtering')

axs[0, 0].plot(t, x)
axs[0, 0].set_title('Original Signal (Time Domain)')
axs[0, 0].set_xlabel('Time')
axs[0, 0].set_ylabel('Amplitude')

axs[0, 1].magnitude_spectrum(x, Fs=1000)
axs[0, 1].set_title('Original Signal (Frequency Domain)')
axs[0, 1].set_xlabel('Frequency')
axs[0, 1].set_ylabel('Magnitude')

axs[1, 0].plot(t, filtered_highpass)
axs[1, 0].set_title('Highpass Filtered Signal (Time Domain)')
axs[1, 0].set_xlabel('Time')
axs[1, 0].set_ylabel('Amplitude')

axs[1, 1].magnitude_spectrum(filtered_highpass, Fs=1000)
axs[1, 1].set_title('Highpass Filtered Signal (Frequency Domain)')
axs[1, 1].set_xlabel('Frequency')
axs[1, 1].set_ylabel('Magnitude')

axs[2, 0].plot(t, filtered_lowpass)
axs[2, 0].set_title('Lowpass Filtered Signal (Time Domain)')
axs[2, 0].set_xlabel('Time')
axs[2, 0].set_ylabel('Amplitude')

axs[2, 1].magnitude_spectrum(filtered_lowpass, Fs=1000)
axs[2, 1].set_title('Lowpass Filtered Signal (Frequency Domain)')
axs[2, 1].set_xlabel('Frequency')
axs[2, 1].set_ylabel('Magnitude')

plt.tight_layout()
plt.show()

这段代码首先生成了一个测试信号,然后使用scipy.signal.butter函数设计了高通、低通、带通滤波器的传递函数系数,并使用scipy.signal.sosfilt函数对原始信号进行滤波处理。最后,通过matplotlib.pyplot库绘制了原始信号和滤波后的信号的时域图和频域图。

运行代码后,会显示一个包含三行两列的图像组,每个图像组包括对应滤波结果的时域图和频域图。可以根据需要调整滤波器的阶数、截止频率等参数以及测试信号的频率成分和幅度来观察滤波效果。


版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐