当前位置: 代码网 > it编程>编程语言>C/C++ > Matlab中产生高斯白噪声信号的方法和其功率计算

Matlab中产生高斯白噪声信号的方法和其功率计算

2024年07月28日 C/C++ 我要评论
y = awgn(x,snr,sigpower) 给信号x 加入指定的 SNR 的高斯白噪声,sigpower用于指定原信号x的功率,单位为dBw;y = awgn(x,snr) 给信号x 加入指定的 SNR 的高斯白噪声,其中默认原信号x 的功率为 0 dBw, 即 1w;y = awgn(x,snr,‘measured’) 给信号x 加入指定的 SNR 的高斯白噪声,它会先测量一个原信号x 的功率。randn产生白噪声信号的matlab代码。

matlab中产生高斯白噪声信号的方法和其功率计算

  • matlab中计算信号能量:

p o w e r = ∑ n = 1 n x 2 ( n ) power= \sum_{n=1}^nx^2(n) power=n=1nx2(n)

​ 功率为
p = 1 n ∑ n = 1 n x 2 ( n ) p= \frac{1}{n}\sqrt{\sum_{n=1}^nx^2(n)} p=n1n=1nx2(n)
对应matlab代码 p=x'*x/n,或p=sum(abs(x).^2)/length(x)

  • 在matlab中可以用randn、wgn、awgn产生功率为 $ p$ 瓦高斯白噪声信号
  1. randn函数

    randn生成信号均值为0,方差(也就是噪声概率)为1w的高斯白噪声1,randn(m,n)生成mxn个

    • 若生成的为实信号,则幅度为 p \sqrt{p} p
    • 生产复信号,则幅度为 p / 2 \sqrt{p/2} p/2
    • 若按照信噪比生成指定信号,假设噪声信号 p n = 1 pn=1 pn=1, s n r = 10 l o g 1 0 p s p n snr=10log10^{\frac{ps}{pn}} snr=10log10pnps,则信号功率 p s = 1 0 s n r 10 ps=10^{\frac{snr}{10}} ps=1010snr,则信号幅度为 u s = p s us=\sqrt{ps} us=ps

    randn产生白噪声信号的matlab代码

     n=1000;
     m=10000;
    % 仿真m次,取其平均
     for  i =1:m     
         x=randn(n,1);%信号幅度为1 ,均值为0
         y=wgn(n,1,10*log10(1));%产生噪声功率为1w的高斯白噪声
         px_randn0(i)=(x'*x)/n ;  % randn产生幅度为1的信号功率计算,第一种方式
         px_randn1(i)=sum(abs(x).^2/n);%randn产生幅度为1的信号功率计算,第二种方式
          py_wgn(i)=(y.'*y)/n; %计算wgn产生的1w的信号的功率,应该等于1 
     end 
      px=mean(px_randn0)%计算randn产生信号的功率,m次取平均
      px_2=mean(px_randn1)%计算randn产生信号的功率第二种方法,m次取平均
      py=mean(py_wgn) %计算wgn产生信号的功率第二种方法,m次取平均
    %% 验证,若x=randn(n,1)+1i*randn(n,1);则px=2py功率为2 
    
  2. wgn2

    对于高斯白噪声,其功率(单位w)和方差相等。

    若要产生一个均值0,方差为0.0965的高斯白噪声,不可直接用wgn(n,1,0.0965)产生可以采用

    • x=sqrt(0.0965)*randn(n,1)
    • y=wgn(n,1,10*log10(0.0965)) %此处要将方差对应功率,单位w,换算成dbw,即10*log10(0.0965)
  3. awgn

    %%测试验证代码1
    signal_frequency=1.2e9;
    fs=8e9; 
    pn = 1;
    n=1000;
    m=10000;
    snr=10;
    x= sqrt(10^(snr/10))*exp(1i*2*pi*(signal_frequency/fs)*[1:n]');
    for i =1:m
        noise = sqrt(pn/2)*(randn(1,n)+1i*randn(1,n));
        noise_power(i)=sum(abs(noise.^2))/n;
        noise_power_2(i)=(noise*noise')/n ;%噪声功率的第二种求法
    end
    sigpower=sum(abs(x.^2))/n
    
    noise_mean=mean(noise_power)
    noise_mean_2=mean(noise_power_2)
    s_n=10*log10(sigpower/noise_mean)
     %%测试验证代码2
    signal_frequency=1.2e9;
    fs=8e9; 
    n=200;
    %  x = randn(n,1)+1i*randn(n,1);      %产生正弦信号
    x= exp(1i*2*pi*(signal_frequency/fs)*[1:n]');
    % y = awgn(x,10,'measured');                          %加入信噪比为10db的噪声,加入前预估信号的功率(强度)
    y = awgn(x,10);
    z=y-x;%噪声信号,要求其方差
    sigpower_x = sum(abs(x).^2)/length(x)            %求出信号功率
    sigpower_x_2=abs((x'*x)/n )
    
    noisepower=sum(abs(y-x).^2)/length(y-x)   %求出噪声功率
    px=(z'*z)/n %求出噪声功率,第二种求法
    %  px=mean(abs(z))
    snr=10*log10(sigpower_x/noisepower)          %由信噪比定义求出信噪比,单位为db
    

  1. matlab产生指定功率的噪声信号、固定snr的信号 ↩︎

  2. ↩︎

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com