SciPy - 信号滤波与平滑
In SciPy 中,signal 模块提供了一套全面的信号处理工具,包括用于滤波和平滑的函数。这些工具广泛用于去除噪声、提高信号清晰度以及在音频处理、通信和传感器数据等领域分析数据。该模块包括创建、应用和分析滤波器的方法,以及平滑数据以减少波动或噪声。
SciPy 中的信号滤波
滤波是信号处理中的一种常见技术,通过去除或强调某些频率分量来修改信号。SciPy 提供了多种类型的滤波器,包括 FIR(有限脉冲响应)和 IIR(无限脉冲响应)滤波器。以下是一些用于滤波的关键函数 −
SciPy 中的 FIR 滤波器
FIR 滤波器 是一类数字滤波器,使用有限数量的样本值。这些滤波器具有固定的、非递归结构,通常用于线性相位滤波。它们通常用于从信号中滤除不需要的噪声或频率。
| 序号 | 函数 & 描述 |
|---|---|
| 1 | scipy.signal.firwin() 通过指定所需的滤波器类型(低通、高通等)、截止频率和其他滤波器参数来创建 FIR 滤波器。 |
| 2 | scipy.signal.firwin2() 使用分段线性插值设计具有指定频率响应的 FIR 滤波器,在所需的频率点之间进行插值。 |
| 3 | scipy.signal.lfilter() 使用从 firwin() 或类似方法获得的滤波器系数,将 1D FIR 滤波器应用于信号。 |
| 4 | scipy.signal.remez() 使用 Parks-McClellan 算法设计 FIR 滤波器,该算法根据所需规格优化滤波器的频率响应。 |
| 5 | scipy.signal.kaiserord() 给定所需的止带衰减和归一化截止频率,计算 Kaiser 窗的阶数,有助于 FIR 滤波器设计。 |
| 6 | scipy.signal.firls() 使用最小二乘优化设计 FIR 滤波器,最小化期望频率响应与实际频率响应之间的误差。 |
| 7 | scipy.signal.firwin2() 使用频率响应和相应幅值的分段线性插值设计 FIR 滤波器。 |
| 8 | scipy.signal.dlti() 创建离散时间线性时不变系统,用于 FIR 滤波器设计。 |
| 9 | scipy.signal.filtfilt() 使用正向和反向滤波将零相位 FIR 滤波器应用于信号,以避免相位移。 |
| 10 | scipy.signal.hamming() 创建 Hamming 窗,常用于 FIR 滤波器设计,以最小化频率响应中的旁瓣。 |
| 11 | scipy.signal.hann() 生成 Hanning 窗,有助于减少 FIR 滤波器设计中的频谱泄漏。 |
| 12 | scipy.signal.blackman() 生成 Blackman 窗,用于减少 FIR 滤波器设计中的旁瓣。 |
| 13 | scipy.signal.bartlett() 生成 Bartlett(三角形)窗,用于 FIR 滤波器设计。 |
| 14 | scipy.signal.tukey() 生成 Tukey 窗,是 Hanning 窗和矩形窗的组合。 |
| 15 | scipy.signal.peak_widths() 测量滤波器频率响应中峰值的宽度,有助于分析滤波器特性。 |
SciPy 中的 IIR 滤波器
IIR 滤波器 使用反馈,这意味着它们的输出依赖于当前和先前的输入及输出值。这些滤波器在计算方面更高效,但可能引入相位失真。它们用于平滑和噪声减少等任务。
| 序号 | 函数 & 描述 |
|---|---|
| 1 | scipy.signal.butter() 设计指定阶数和截止频率的 IIR Butterworth 滤波器。常用于低通、高通、带通和带阻滤波器。 |
| 2 | scipy.signal.cheby1() 设计通带中具有指定纹波的 Chebyshev I 型 IIR 滤波器。适用于需要比 Butterworth 滤波器更陡峭截止的应用。 |
| 3 | scipy.signal.cheby2() 设计阻带中具有指定纹波的 Chebyshev II 型 IIR 滤波器。该滤波器在阻带中提供比 Butterworth 滤波器更陡峭的滚降。 |
| 4 | scipy.signal.ellip() 设计椭圆(Cauer)IIR 滤波器,在给定阶数和通带及阻带纹波下提供最陡峭的截止。 |
| 5 | scipy.signal.iirfilter() 使用各种设计方法(如 Butterworth、Chebyshev 或 Elliptic)生成 IIR 滤波器的系数。 |
| 6 | scipy.signal.lfilter() 使用从 butter()、cheby1() 或其他 IIR 滤波器设计函数获得的滤波器系数,将 1D IIR 滤波器应用于信号。 |
| 7 | scipy.signal.bilinear() 使用双线性变换将模拟滤波器设计转换为数字滤波器。 |
| 8 | scipy.signal.sosfreqz() 计算二阶节(SOS)形式滤波器的频率响应,这种形式常用于数值稳定的滤波器设计。 |
| 9 | scipy.signal.group_delay() 计算滤波器的群延迟,这在信号处理中很重要,用于理解滤波器如何延迟不同频率分量。 |
| 10 | scipy.signal.freqs() 计算模拟滤波器的频率响应,有助于分析连续时间滤波器。 |
| 11 | scipy.signal.resample() 将信号重采样为不同数量的样本,常用于下采样或上采样。 |
| 12 | scipy.signal.causal() 从给定的传递函数生成因果 IIR 滤波器。 |
| 13 | scipy.signal.dlti() 创建离散时间线性时不变系统,以应用 IIR 滤波器系数。 |
| 14 | scipy.signal.sosfreqz() 计算二阶节(SOS)格式滤波器的频率响应,这是一种数值稳定性技术。 |
| 15 | scipy.signal.sosfilt() 将二阶节(SOS)滤波器应用于信号,以在 IIR 滤波中获得更稳定的结果。 |
信号平滑
平滑 是另一种信号处理技术,用于减少信号中的噪声或波动。SciPy 提供了多种平滑信号的方法,如移动平均、Gaussian 平滑和 Savitzky-Golay 滤波器。这些方法可应用于 1D 和 2D 信号。
移动平均
移动平均 是一种通过在滑动窗口内平均值来平滑数据的方法。SciPy 提供了 uniform_filter1d() 函数来计算移动平均 —
| 序号 | 函数 & 描述 |
|---|---|
| 1 | scipy.ndimage.uniform_filter1d() 对信号应用一维移动平均滤波器。它用指定窗口大小内邻近点的平均值替换每个数据点。 |
| 2 | scipy.ndimage.uniform_filter() 对数组应用均匀滤波器,常用于多维数据中的移动平均平滑。 |
| 3 | scipy.ndimage.median_filter1d() 应用一维中值滤波器来平滑数据,用邻点的中值替换每个值。 |
| 4 | scipy.ndimage.median_filter() 对多维数组应用中值滤波器,以去除噪声同时保留边缘。 |
| 5 | scipy.ndimage.gaussian_filter1d() 应用一维高斯滤波器,通过为窗口中心附近的数值赋予更高权重来平滑信号。 |
| 6 | scipy.ndimage.gaussian_filter() 应用高斯滤波器来平滑多维信号,有助于模糊和噪声减少。 |
| 7 | scipy.signal.savgol_filter() 应用 Savitzky-Golay 滤波器,通过对数据的小窗口拟合连续多项式来平滑数据。 |
| 8 | scipy.signal.wiener() 应用 Wiener 滤波器来减少信号中的噪声。它根据数据中的局部方差调整滤波参数。 |
| 9 | scipy.signal.medfilt() 对一维信号应用中值滤波器进行噪声减少,常用于保留信号中的边缘。 |
| 10 | scipy.ndimage.correlate1d() 计算输入信号与指定滤波核的一维相关,常用于平滑操作。 |
| 11 | scipy.ndimage.convolve1d() 应用滤波核进行一维卷积,有助于各种平滑和滤波任务。 |
| 12 | scipy.ndimage.laplace() 计算信号的拉普拉斯算子,可用于边缘检测和噪声减少。 |
| 13 | scipy.signal.boxcar() 生成箱车窗函数,有助于信号的简单平均或平滑。 |
| 14 | scipy.ndimage.zoom() 按指定因子调整数组大小,可用于上采样或下采样信号并在过程中平滑它。 |
| 15 | scipy.ndimage.prewitt() 对信号应用 Prewitt 滤波器,主要用于边缘检测,但也可用于基本平滑目的。 |
信号滤波和平滑是信号处理中的基本技术,SciPy 提供了一组丰富的工具来执行这些操作。无论我们需要去除噪声、强调特定频率分量还是平滑我们的数据,scipy.signal 模块都提供了高效且易于使用的函数来实现这些任务。