0.9659258 0.8910065 0.7771460 0.6293204 0.2588190 0.0523360 0.3583679 0.5446390 0.7071068 0.838670 200点正弦信号如图1-1-2所示 1.5 05 10 15 501ao 20o 样本序号 图1-1-2正弦序列 例2:三个正弦信号的振幅为A1=A2=A3=1,频率为f1=10,f2=17,f2=50,相 位为1=45度,B2=10度,03=88度,采样频率为150Hz。该正弦组合信号受到高斯白 噪声N(0,d2)的干扰,信噪比SNR=5dB。产生200个数据,并将其存于数据文件sin wn2dat中 主函数程序(文件名: SInn2.m) #include "sinn. c" maino i int i, m, ni ng seed double fs, snr, x[200]+ static double a[3=1,1,1); static double f[3]=110, 17,50); static double ph[3=(45, 10, 88) FILE *ip n seed 135791; fs=150
sinwn(a,f, ph, m, fs, snr, seed, x, n); printf("\n Three Sinusoidal Signals plus Gauss White Noise n") for(i=0;i<32;i-+) printf(” %10.7”,x[i]); if (i%4==3) printf("\n") fopen("sinwn2. dat, " w) for (i=O;i<n; i++) k fprintf(fp, "%3d 912. 71f\n",i, xi];1 fclose (fp ); 运行结果 含有高斯白噪声的正弦组合信号前32个数据为 3.0331775 0.8776595 1.5495155 2.5265747 0.0604063 0.5123042 0.51439l8 1.8987897 2.5321971 0.4085494 0.7340470 0.1641256 0.7745283 0.1492174 1.5032762 0.5202461 0.0514435 2.8173778 1.1355277 0.4828501 1.2294239 0.8140043 .3329036 0.3340085 1.9891476 1.7898424 0.9148312 0.3301306 0.9340795 1.9852839 0.1642199 200点含有高斯白噪声的正弦组合信号如图1-1-3所示。 2.0 0.0 20 4.0 150 样本序号 图1-1-3含有高斯白噪声的正弦鉅合序列 34
§1.16解析信号的产生 功能 用快速傅立叶变换技术产生解析信号。 二、方法简介 实信号x(n)的解析信号可表示为 (n)=x(n)十jx(n) 其中x(n)是x(n)的离散希尔伯待变换,它可用下式来表示 (n)=x(n)*h(n) 这里h(n)是希尔伯特变换的单位冲激响应,即 h(n)=nr Sinai nx,n 0 设信号x(n)的频谱为X(ω),解析信号z(n)的频谐为Z(a),则有 Z()={X(a) <0 因此,计算解析信号的步骤如下 1.计算x(n)的N点FFT,得到X(k)(k=0,1,…,N-1)。 2.构造z(更) X(k) z()={2x(k),k=1,2,…,,-1 ,其它 3计算z(k)的快速傅立叶反变换,从而得到解析信号z(n)。 三、使用说明 1.子函数语句 void analytic(x,y, n) 2.形参说明 x一双精度实型一维数组,长度为n。开始时存放实数输入信号,最后存放解析 信号的实部(实际上,它没有变化,与原来完全相同)。 y—双精度实型一维数组,长度为n。存放解析信号的虚部。 n——整型变量。数据长度,必须是2的整数次幂,即n=2m
四、子函数程序(文件名: analytic.c) #include"fft.c id analytic(x,y,n) double x□],y[]; f int i, nl; for (i=o: i<n: i++) (yi]=0.0;} fft(x, y,n, 1); for(i=lii<nl; i++) x[i=2“x[i]; y for (i=nl; i<n; i++) {x[i]=0.0; y fft(x, y, n,-"1) 五、例题 设序列x(i)为 (i)=sin(2ri/n),i=0,1,,n-1 它的希尔伯特变换为 cos(2ri/n),=0,1,…,n-1 因此,x(i)的解析信号为 z(i)=sin(2xi/n)-jcos(2xi/n),=0,1,…,n-1 计算序列x()的解析信号z(),并与理想值进行比较。 主函数程序(文件名: analytic.m) +t include "stdio h" #include "math. h" t include "analytic. c" main o i int i,n; double x[64],y[64],z[641; void analytic);
for (i=0:i<n; i++) p for(i=0;i<n/2;i+=4) k printf(" %10.7f %10.7f",x[i],xi+1]); printf( %10.7f%10.71n,x[i+2],x[i+3]); zi=-cos(2*3,14159265*i/n); printf("\n Ideal Discrete Hilbert Transform n"); for(i=0;i<n/2;i+=4) i printf(" %10.7f %10.7f",z[i],z[i+1]); rint("%10.7f%10.7fn”,z计+2],z{i+3]); printf("n Real Part of Analytic Signal\n"); for(i=0;<n/2;i+=4) pr %10.7f %10.7f",x[i],x[i+1]) printf(" %10.7fn",x[i+2],x[i+3]); printf( \n Imaginary Part of analytic Signal\n) %10.7f%10.7f",y[,y[i+1]) printf(" %10.7f %10.7fn",yi+2],y[i+3]); 运行结果 原始信号x(i)(前32个数据) 0.1950903 0.3826834 0.4713967 0.5555702 0.6343933 0.7071068 0.7730105 0.8819213 0.9238795 0.9569403 0.9807853 0.9951847 1.0000000 0.9951847 0.9569403 0.9238795 0.8819213 0.8314696 0.7730105 0.3826834 0.2902847 0.1950903 0.0980171 序列x(i)的理想希尔伯特变换(前32个数据)