產生含有高斯白噪聲的正弦組合信號。html
含有高斯白噪聲的\(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語言實現產生含有高斯白噪聲隨機數的方法以下:spa
/************************************ 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文件參見正態分佈的隨機數code