【问题标题】:How to generate a complex gaussian white noise signal in python(or numpy/scipy)?如何在 python(或 numpy/scipy)中生成复杂的高斯白噪声信号?
【发布时间】:2023-04-02 08:10:02
【问题描述】:

我正在做一些关于 DSP(数字信号处理)的工作,需要生成一个离散的复数高斯白噪声信号。我知道我可以使用numpy.random.normal(0, 1, n) 来生成离散序列,但它是在实数字段中。用matlab模拟很容易,但是我在想如何用python替换matlab代码?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    这是您可以做到的一种方法。这会生成一个形状为 (n, 2) 的标准正态变量数组,然后使用.view() 方法将该数组视为形状为 (n,) 的复数值数组。

    In [26]: n = 10                                                                                                     
    
    In [27]: z = np.random.randn(n, 2).view(np.complex128)                                                              
    
    In [28]: z                                                                                                          
    Out[28]: 
    array([[ 0.90179497-0.14081956j],
           [-2.17633115+0.88782764j],
           [ 0.94807348+0.27575325j],
           [-1.25452512+0.64883484j],
           [-0.58886548+0.15419947j],
           [ 0.58296574+1.45711421j],
           [ 0.803825  +0.6197812j ],
           [ 0.09225137+0.38012939j],
           [ 0.5017482 -0.39747648j],
           [-1.00186317+1.02918796j]])
    

    如果您更喜欢使用 np.random.normal(size=(n, 2)),可以将 np.random.randn(n, 2) 替换为该功能。

    根据complex normal distribution 上的维基百科文章,一个复数标准正态随机变量的实部和虚部的方差应该是1/2(所以复数样本的方差是1)。这次我将使用np.random.normal,但您也可以适当地缩放np.random.rand

    创建一个大样本,以便我们可以验证方差接近 1:

    In [19]: n = 100000                                                                                                                                                               
    
    In [20]: z = np.random.normal(loc=0, scale=np.sqrt(2)/2, size=(n, 2)).view(np.complex128)                                                                                         
    
    In [21]: z[:10]                                                                                                                                                                   
    Out[21]: 
    array([[ 0.31439115+1.39059186j],
           [ 0.18306617+1.19364778j],
           [ 0.20281354+0.31695626j],
           [ 0.27230747+1.18380383j],
           [-0.71353935-0.11587812j],
           [-0.2371236 +0.91542372j],
           [ 0.04254323+1.50538309j],
           [ 0.23024067+0.96947144j],
           [ 0.6954942 +0.20933687j],
           [-0.66853093+2.00389192j]])
    

    不出所料,方差接近1:

    In [22]: np.var(z)                                                                                                                                                                
    Out[22]: 0.9998204444495904
    

    或者,您可以使用np.random.multivariate_normal,并使用0.5*np.eye(2) 作为协方差矩阵:

    In [31]: z = np.random.multivariate_normal(np.zeros(2), 0.5*np.eye(2), size=n).view(np.complex128)                                                                                
    
    In [32]: z[:10]                                                                                                                                                                   
    Out[32]: 
    array([[-0.25012362+0.80450233j],
           [-0.85853563+0.05350865j],
           [ 0.36715694-0.10483562j],
           [ 1.0740756 +0.081779j  ],
           [-1.04655701+0.15211247j],
           [ 0.18248473+0.49350875j],
           [ 0.6152102 +0.08037717j],
           [ 0.12423999+0.56175553j],
           [-1.05282963-0.60113989j],
           [-0.01340098+0.80751573j]])
    
    In [33]: np.var(z)                                                                                                                                                                
    Out[33]: 1.0001327524747319
    

    【讨论】:

    • 所以这仅适用于circularly-symmetric complex normal。还有更通用的方法吗?
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 2016-02-07
    • 2012-12-18
    • 2014-09-23
    • 2011-09-12
    • 2019-12-11
    • 2021-01-12
    • 2013-10-14
    相关资源
    最近更新 更多