原理
- 使用随机白噪声生成全带宽频谱
- 使用滤波器对全带宽频谱进行滤波,得到带限信号
- 控制滤波器的带宽实现信号的带宽控制
滤波器生成
使用Matlab的滤波器设计工具进行低通滤波器设计
导出滤波器系数,存储为Mat文件,以便Python调用。
Mat文件读取代码见:Python实现Mat数据文件读取,若仅存在一组数据,则输出这组数据
代码
"""任意带宽信号的生成"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plt_basic as nplt
import matplotlib
from readmat import readmat
matplotlib.use('qtAgg')
# plt.ion()
fs = 1e3
sigLen = 16384
# %% 生成随机全带宽信号
sig = 2000 * (np.random.randn(sigLen) + 1j * np.random.randn(sigLen))
nplt.plt_psd(sig, Fs=fs, figNew=1, NFFT=4096)
# %% 滤波(低通滤波器)
fil = readmat('fil\\fs1000_fpass200_fstop210.mat').flatten()
sig_fil = np.convolve(sig, fil, mode='same')
nplt.plt_psd(sig_fil, Fs=fs, figNew=0, NFFT=4096, labStr='filtered')
# %% 峰均比计算
def cal_pow_avg(sig, mode='dB'):
pavg = np.mean(np.abs(sig) ** 2)
if mode == 'dB':
pavg = 10 * np.log10(pavg)
return pavg
def cal_abs_peak(sig, mode='normal'):
peak = np.max(abs(sig))
if mode == 'dB':
peak = 20 * np.log10(peak)
return peak
def cal_par(sig):
pavg = cal_pow_avg(sig, mode='dB')
peak = cal_abs_peak(sig, mode='dB')
par = peak - pavg
return par, (pavg, peak)
par, (pavg, peak) = cal_par(sig)
df = pd.DataFrame({'Pavg': [pavg], 'Peak': [peak], 'PAR': [par]})
print(df)
plt.show()
print('GoodLuck!-----END....')
运行结果