现在位置: 首页 > Matplotlib 教程 > 正文

Matplotlib 频谱分析函数


Matplotlib 参考文档 Matplotlib 参考文档

Matplotlib 提供了频谱分析和信号处理相关的绘图函数,常用于科学计算和工程可视化。

函数一览

函数功能
acorr()绘制自相关(Auto-correlation)图
xcorr()绘制互相关(Cross-correlation)图
psd()绘制功率谱密度(Power Spectral Density)
csd()绘制互谱密度(Cross Spectral Density)
specgram()绘制频谱图/时频图(Spectrogram)
cohere()绘制相干性(Coherence)
angle_spectrum()绘制角度频谱
magnitude_spectrum()绘制幅度频谱
phase_spectrum()绘制相位频谱

函数定义

acorr() / xcorr()

matplotlib.pyplot.acorr(x, *, detrend=<function detrend_none>,
    maxlags=10, **kwargs)
matplotlib.pyplot.xcorr(x, y, *, detrend=<function detrend_none>,
    maxlags=10, normed=True, **kwargs)

psd() / csd()

matplotlib.pyplot.psd(x, NFFT=None, Fs=None, Fc=None,
    detrend=None, window=None, noverlap=None, pad_to=None,
    sides=None, scale_by_freq=None, **kwargs)
matplotlib.pyplot.csd(x, y, NFFT=None, Fs=None, Fc=None,
    detrend=None, window=None, noverlap=None, pad_to=None,
    sides=None, scale_by_freq=None, **kwargs)

specgram()

matplotlib.pyplot.specgram(x, NFFT=None, Fs=None, Fc=None,
    detrend=None, window=None, noverlap=None, cmap=None,
    xextent=None, pad_to=None, sides=None, scale_by_freq=None,
    mode=None, scale=None, vmin=None, vmax=None, **kwargs)

angle_spectrum() / magnitude_spectrum() / phase_spectrum()

matplotlib.pyplot.angle_spectrum(x, Fs=None, Fc=None, **kwargs)
matplotlib.pyplot.magnitude_spectrum(x, Fs=None, Fc=None, **kwargs)
matplotlib.pyplot.phase_spectrum(x, Fs=None, Fc=None, **kwargs)
常用参数说明
Fs采样频率(Hz),默认 2
NFFTFFT 点数,影响频率分辨率
noverlap窗口重叠的点数
window窗函数,默认 hanning 窗口
detrend去趋势方法:'none'、'mean'、'linear'

使用示例

示例 1:自相关与互相关

实例

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)
t = np.linspace(0, 10, 500)
# 带噪声的正弦波
sig = np.sin(2 * np.pi * 2 * t) + np.random.randn(500) * 0.3

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4),
                                layout='constrained')

# 自相关
ax1.acorr(sig, maxlags=100, color='steelblue')
ax1.set_title('acorr() - Auto-correlation of sin(4πt) + noise')
ax1.set_xlabel('Lag')

# 互相关(信号与自身的延迟版本)
delayed = np.roll(sig, 20)
ax2.xcorr(sig, delayed, maxlags=100, color='coral')
ax2.set_title('xcorr() - Cross-correlation (lag=20)')
ax2.set_xlabel('Lag')

plt.show()

示例 2:功率谱密度

实例

import matplotlib.pyplot as plt
import numpy as np

# 生成采样率 100Hz 的信号(10Hz + 25Hz 正弦波)
Fs = 100  # 采样率
t = np.arange(0, 5, 1/Fs)
sig = np.sin(2*np.pi*10*t) + 0.5*np.sin(2*np.pi*25*t)
      + np.random.randn(len(t))*0.5

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4),
                                layout='constrained')

# PSD
ax1.psd(sig, NFFT=256, Fs=Fs, color='steelblue')
ax1.set_title('psd() - Power Spectral Density')

# 频谱图
ax2.specgram(sig, NFFT=128, Fs=Fs, noverlap=64,
             cmap='viridis')
ax2.set_title('specgram() - Spectrogram')
ax2.set_xlabel('Time (s)')
ax2.set_ylabel('Frequency (Hz)')

plt.show()

示例 3:幅度谱与相位谱

实例

import matplotlib.pyplot as plt
import numpy as np

Fs = 200
t = np.arange(0, 2, 1/Fs)
sig = np.sin(2*np.pi*20*t) + 0.5*np.sin(2*np.pi*50*t)

fig, axes = plt.subplots(2, 2, figsize=(10, 8),
                          layout='constrained')

# 原始信号
axes[0, 0].plot(t[:100], sig[:100])
axes[0, 0].set_title('Original Signal')
axes[0, 0].set_xlabel('Time (s)')

# 幅度谱
axes[0, 1].magnitude_spectrum(sig, Fs=Fs, color='steelblue')
axes[0, 1].set_title('magnitude_spectrum()')

# 角度谱
axes[1, 0].angle_spectrum(sig, Fs=Fs, color='coral')
axes[1, 0].set_title('angle_spectrum()')

# 相位谱
axes[1, 1].phase_spectrum(sig, Fs=Fs, color='green')
axes[1, 1].set_title('phase_spectrum()')

plt.show()
print("runoob: spectrum analysis displayed")

Matplotlib 参考文档 Matplotlib 参考文档