Python: Spectrum模块介绍与使用
·
文章目录
Python Spectrum模块介绍与使用
Spectrum是一个用于信号处理的Python模块,专门用于频谱分析和谱估计。它提供了多种经典和现代的谱估计方法。
安装
pip install spectrum
主要功能
1. 经典谱估计方法
import spectrum
import numpy as np
import matplotlib.pyplot as plt
from spectrum import data_cosine, arma2psd
# 生成测试信号
N = 1024
fs = 1000 # 采样频率
t = np.arange(N) / fs
f1, f2 = 50, 120
signal = np.sin(2*np.pi*f1*t) + 0.5*np.sin(2*np.pi*f2*t) + 0.1*np.random.randn(N)
# 周期图法 (Periodogram)
from spectrum import Periodogram
p = Periodogram(signal, sampling=fs)
p.plot()
plt.title('Periodogram')
plt.show()
# Welch方法
from spectrum import pwelch
pw = pwelch(signal, sampling=fs)
pw.plot()
plt.title('Welch Method')
plt.show()
2. 现代谱估计方法
# AR模型谱估计
from spectrum import aryule, arma2psd, marple_data
# 使用Yule-Walker方法估计AR参数
order = 30 # AR模型阶数
ar_params, variance, coeffs = aryule(signal, order)
psd = arma2psd(ar_params, NFFT=1024)
frequencies = np.linspace(0, fs/2, len(psd)//2)
plt.figure()
plt.plot(frequencies, 10*np.log10(psd[:len(psd)//2]))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power Spectral Density (dB)')
plt.title('AR Model Spectrum (Yule-Walker)')
plt.grid(True)
plt.show()
3. 多 taper谱估计
from spectrum import pmtm
# 多锥形谱估计
[psd, weights, eigenvalues] = pmtm(signal, NW=4, NFFT=1024, sampling=fs)
frequencies = np.linspace(0, fs/2, len(psd)//2)
plt.figure()
plt.plot(frequencies, 10*np.log10(psd[:len(psd)//2]))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power Spectral Density (dB)')
plt.title('Multitaper Spectrum')
plt.grid(True)
plt.show()
4. 参数化方法
# MUSIC算法
from spectrum import music
# 生成包含多个频率成分的信号
freqs = [50, 120, 200]
signal_music = sum([np.sin(2*np.pi*f*t) for f in freqs]) + 0.1*np.random.randn(N)
psd_music, weights = music(signal_music, 15, 4, NFFT=1024, sampling=fs)
frequencies = np.linspace(0, fs/2, len(psd_music)//2)
plt.figure()
plt.plot(frequencies, 10*np.log10(psd_music[:len(psd_music)//2]))
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power Spectral Density (dB)')
plt.title('MUSIC Algorithm')
plt.grid(True)
plt.show()
5. 时频分析
from spectrum import STFT
# 短时傅里叶变换
stft = STFT(signal, 256, 128, sampling=fs)
stft.run()
stft.plot()
plt.title('Short-Time Fourier Transform')
plt.show()
完整示例
import numpy as np
import matplotlib.pyplot as plt
from spectrum import *
# 设置参数
fs = 1000 # 采样频率
N = 2000 # 数据点数
t = np.arange(N) / fs
# 创建测试信号:两个正弦波加噪声
f1, f2 = 50, 150
signal = (np.sin(2*np.pi*f1*t) +
0.5*np.sin(2*np.pi*f2*t) +
0.2*np.random.randn(N))
# 比较不同的谱估计方法
methods = [
('Periodogram', Periodogram(signal, sampling=fs)),
('Welch', pwelch(signal, sampling=fs)),
]
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 绘制原始信号
axes[0,0].plot(t[:500], signal[:500])
axes[0,0].set_xlabel('Time (s)')
axes[0,0].set_ylabel('Amplitude')
axes[0,0].set_title('Original Signal (first 500 points)')
axes[0,0].grid(True)
# 绘制经典谱估计方法
for i, (name, method) in enumerate(methods):
ax = axes[0,1] if i == 0 else axes[1,0]
method.plot(ax=ax)
ax.set_title(f'{name} Spectrum')
ax.grid(True)
# AR模型谱估计
order = 30
ar_params, variance, coeffs = aryule(signal, order)
psd_ar = arma2psd(ar_params, NFFT=1024)
freqs = np.linspace(0, fs/2, len(psd_ar)//2)
axes[1,1].plot(freqs, 10*np.log10(psd_ar[:len(psd_ar)//2]))
axes[1,1].set_xlabel('Frequency (Hz)')
axes[1,1].set_ylabel('Power (dB)')
axes[1,1].set_title('AR Model Spectrum')
axes[1,1].grid(True)
plt.tight_layout()
plt.show()
# 性能比较
print("谱估计方法比较完成")
主要类和函数
- Periodogram: 经典周期图法
- pwelch: Welch方法(改进的周期图法)
- aryule: Yule-Walker AR参数估计
- pmtm: 多锥形谱估计
- music: MUSIC算法
- STFT: 短时傅里叶变换
- arma2psd: 将ARMA参数转换为功率谱密度
优点
- 算法丰富: 提供多种经典和现代谱估计方法
- 易于使用: 简单的API设计
- 可视化支持: 内置绘图功能
- 文档完善: 提供详细的文档和示例
注意事项
- 选择合适的模型阶数对参数化方法很重要
- 不同方法适用于不同的信号特性
- 对于非平稳信号,考虑使用时频分析方法
Spectrum模块是信号处理领域非常有用的工具,特别适合频谱分析和谱估计任务。
更多推荐
所有评论(0)