python数字信号处理之基于随机白噪声生成任意带宽信号

原理

  1. 使用随机白噪声生成全带宽频谱
  2. 使用滤波器对全带宽频谱进行滤波,得到带限信号
  3. 控制滤波器的带宽实现信号的带宽控制

滤波器生成

使用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....')

运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值