含有高斯白噪声的正弦组合信号的产生

浪子不回头ぞ 提交于 2019-12-01 13:18:54

一、功能

产生含有高斯白噪声的正弦组合信号。

二、方法简介

含有高斯白噪声的\(M\)个正弦信号的组合为
\[ x(n)=\sum_{i=1}^{M}A_{i}sin(2\pi f_{i}\Delta Tn + \theta_{i} ) + N(0,\sigma ^{2}) \]
其中\(A_i\)\(f_i\)\(\theta_i(i=1,2,...,M)\)分别是第\(i\)个正弦信号的振幅、频率和相位。\(\Delta T=1/f_s\)是采样间隔,\(f_s\)是采样频率(以赫兹为单位)。\(N(0,\sigma^2)\)是高斯白噪声,它的均值为零,方差为\(\sigma^2\)

三、使用说明

是用C语言实现产生含有高斯白噪声随机数的方法如下:

/************************************
    a       ---一维数组,长度为m,各正弦信号振幅。
    f       ---一维数组,长度为m,各正弦信号频率。
    ph      ---一维数组,长度为m,各正弦信号相位。
    m       ---正弦信号个数。
    fs      ---采样频率(用赫兹表示)。
    snr     ---信噪比(用dB表示)。
    seed    ---随机数种子
    x       ---一维数组,长度n,存放所产生的数据。
    n       ---数据长度。
************************************/
#include "math.h"
#include "gauss.c"

void sinwn(double *a, double *f, double *ph, int m, double fs, double snr, long int seed, double *x, int n)
{
    int i;
    int k;
    double z;
    double pi;
    double snr;

    pi = 4.0 * atan(1.0);
    z = snr / 10.0;
    z = pow(10.0, z);
    z = 1.0 / (2 * z);
    snr = sqrt(z);
    for(i = 0; i < m; i++) {
        f[i] = 2 * pi * f[i] / fs;
        ph[i] = ph[i] * pi / 180;
    }
    for(k = 0; k < n; k++) {
        x[k] = 0.0;
        for(i = 0; i < m; i++)
            x[k] = x[k] + a[i] * sin(k * f[i] + ph[i]);
        x[k] = x[k] + snr * gauss(0.0, 1.0, &seed);
    }
}

gauss.c文件参见正态分布的随机数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!