#include"gauss void arma(a, b, p, q; mean, sigma, seed, xn) double mean, sigma, aL],b[i,xiii w = malloc(n sizeof(double )) for (k=0; k<n:k++) i gauss(mean, sigma, seed);) x[0]=b[0]*wL0 for (k=1; k<=p: k++) for (i=l: i<=k: i++) s=b[O]*w[k-s if (q continue i (k >g)?g:k for (i=; i<=m: i++) bli]*wk-il for(k=(p+1);k<n;k++) for (i=l; i<=p; i++) isi=ali]*x[k-il; y =bl0wwlk1-s if (x[k]=s; for(i=1<=q;i++) [k]
五、例题 ARMA(2,2)模型为 x(k)+1.45x(k-1)+0.6x(k-2)=(k)-0.2u(k)-0.1e(k) 其中v(k)是均值为0、均方差为0.5的高斯白噪声。产生200个数据,并将其存于数据文 件arma.dat中 主函数程序(文件名: arma. m): t stdio. h" #include "arma. c int i, n, p, q; double mean, sigma, x[200]: static double a[3]=(1.0, 1.45, 0.61 static double b[3]={1.0,-0.2,-0.1,}; FILE *fp; n=200; p see d=13579l sigma =0. 5: arma(a,b, p, q, mean, sigma, &seed, x, n); 10.mf%10.7f",x[i,x[i+1]); printf(" %10.71f %10.Tlf",x[计+2],x[i+3]); printf("\n") fp= fopen(" arma. dat", "w") for (i=O; i<n; i++) fprintf(印p,"%d%fn”,,x[i); fclose(fp) 运行结果 ARMA模型的前32个数据为 1.4498606 2.8466986 3.3057938
2.2301953 0.8225244 0.6761735 2.7626373 3.3902617 3.3722200 3.487030 4.1159276 4.734579 4,2331519 2.1655715 0.1262312 1.7224958 5873058 2.3757229 G5l3840 2.0335784 2.0534403 2.5926021 2.3975581 1.3792284 0.7011795 1.0376567 1.1682870 200点ARMA(2,2)数据如图1-1-1所示。 样木序号 图1-1-1ARMA(2,2)模型的序列 §1.15含有高斯白噪声的正弦组合信号的产生 功能 产生含有高斯白噪声的正弦组合信号。 方法简介 含有高斯白噪声的M个正弦信号的组合为 x(n)=∑Asn(2xf,△n+0)+N(0,02) 其中A1、f和B1(=1,2,…,M)分别是第i个正弦信号的振幅频率和相位。△T=1/f, △T是采样间隔,f是采样频率(以赫兹为单位)。N(0,a3)是高斯白噪声,它的均值为零 方差为a2。 三、使用说明 1.子函数语句 void sinwn(a,f, ph, m, fs, snr, seed, x, n)
2.形参说明 a——双精度实型一组数组,长度为m。各正弦信号的振幅。 f—双精度实型一组数组,长度为m。各正弦信号的频率。 ph双精度实型一组数组,长度为m。各正弦信号的相位。 整型变量。正弦信号的个数 fs双精度实型变量。采样频率(用赫兹表示)。 双精度实型变量。信噪比(用dB表示)。 seed——长整型变量。随机数的种子 x——双精度实型一组数组,长度为n。存放所产生的数据 n——整型变量。数据长度 四、子函数程序(文件名: SInn.c) include "math. h" #t include void sinn(a, f, ph, m, fs, snr, seed, x, n) double fs, snr, a[], fD, ph[, xD: i int i,k double z, pi,nsr; pi=4.0 z=snr/10.0; 1.0/(2关z) nsr= sqrt(z); for (i=0;i<m;i++) (fi]=2* Ri*f[il/fs; [i]=ph[ij]≠pi/1 for (k=0; k<n;k++) or (i=0; i<m; i++) i xLk]=xLk]+ ali]* sin(k *f[i]+ phDi]; y [k]=x[k]+nsr*gaus(0.0,1.0,8see6);
五、例题 例1:单正弦信号的振幅为1,频率为5Iz,相位为45度,无噪声干扰。产生200 个数据,并将其存于数据文件 sinwa.dat中。 主函数程序(文件名: sinn1m): # include" SInn,c〃 s int 1,m,n1 double fs, snr, x[200]; static double a[l1=(1): static double f[l=< 51 static double ph[1j=( 153; FILE fp sed=13579l; 「s=150 snr=10c0.0 sinwn(a, f, ph, m, fs, snr, seed,x,n) printf("n Single Sinusoidal Signal \n"); or(i=0;i<32;i++) %10.7f",x[i); if (i%4==3)printf("\n") fp=fopen("sinwnl dat", "w"); for (i=0; i<n; i+-+) i printf(fp, "%3d %12.fn",,x[i]); 运行结果: 正弦信号的前32个数据为 0.7071068 0.8386706 0.9876883 0.9986295 0.9659258 0.8910065 0.7771460 0.6293204 0.2588190 0.1564345 0.3583679 …0.5446390 0.7071068 0.8386706 0.9335804 、9876883 0.9986295