python模拟二阶循环平稳信号
时间: 2024-09-22 21:00:19 浏览: 41
在Python中,模拟二阶循环平稳信号通常用于研究信号处理、通信系统分析等领域,这类信号的特点是其统计特性随时间的变化率较低。一种常见的方法是利用随机过程理论生成自相关函数(Autocorrelation Function, ACF)和功率谱密度(Power Spectral Density, PSD)来构造信号。
以下是一个简单的例子,展示如何使用numpy和scipy库生成一个二阶循环平稳的白噪声信号:
```python
import numpy as np
from scipy.signal import welch
# 定义一些参数
fs = 1000 # 采样频率 (Hz)
t = np.arange(0, 1, 1/fs) # 时间序列
noise_power = 0.5 # 白噪声功率
acf_len = int(fs * 1) # 自相关函数长度
lag = np.arange(-acf_len//2, acf_len//2 + 1) # 延迟点
# 创建白噪声
white_noise = np.random.normal(0, np.sqrt(noise_power), len(t))
# 计算并设置自相关函数
acorr = white_noise * np.correlate(white_noise, white_noise, mode='full') / noise_power
# 设置衰减速度(二阶矩)
alpha = 0.9 # 越接近1,衰减越慢,代表二阶循环更平缓
acorr = alpha**np.abs(lag) * acorr[acf_len//2:]
# 将ACF转换为PSD,这里简化为单位方差的正态分布
psd = np.fft.fftshift(np.abs(np.fft.fft(acorr)) ** 2)
# 使用Welch's method近似连续的PSD
frequencies, psd_estimated = welch(white_noise, fs=fs, nperseg=acf_len, noverlap=None, scaling='spectrum')
# 可视化结果
import matplotlib.pyplot as plt
plt.figure()
plt.plot(frequencies, psd_estimated, label='Estimated PSD')
plt.plot(frequencies, psd, 'r--', label='True PSD')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Power/Frequency [dB/Hz]')
plt.legend()
plt.show()
阅读全文