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 |
| NFFT | FFT 点数,影响频率分辨率 |
| 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()
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()
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")
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 参考文档