资源描述:
《《am仿真程序》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、仿真程序PM首先任意给定一个已知调制信号m(t)=cos(pi*10*t),进行相位调制时要用到傅里叶变换,因此先编写傅里叶变换的m文件用作主函数调用,其m文件代码如下:%求傅里叶变换的子函数function[M,m,df]=fftseq(m,ts,df)fs=1/ts;ifnargin==2n1=0;%nargin为输入参量的个数elsen1=fs/df;endn2=length(m);n=2^(max(nextpow2(n1),nextpow2(n2)));%nextpow2(n)取n最接近的较大2次幂M=fft(m,n);%M为信号m的傅里叶变换,n为快速傅里叶变换
2、的点数,及基n-FFT变换m=[m,zeros(1,n-n2)];%构建新的m信号df=fs/n;%重新定义频率分辨率上述m文件以“fftseq.m”保存。在实现相位解调时要调用两个子函数,分述如下:%求信号相角的子函数,这是调频、调相都要用到的方法function[v,phi]=env_phas(x,ts,f0)ifnargout==2%nargout为输出变数的个数z=loweq(x,ts,f0);%产生调制信号的正交分量phi=angle(z);%angle是对一个复数求相角的函数endv=abs(hilbert(x));%abs用来求复数hilbert(x)的模上
3、述m文件以“env_phas.m”保存。%产生调制信号的正交分量functionx1=loweq(x,ts,f0)t=[0:ts:ts*(length(x)-1)];z=hilbert(x);%希尔伯特变换对的利用---通过实部来求虚部x1=z.*exp(-j*2*pi*f0*t);%产生信号z的正交分量,%并将z信号与它的正交分量加在一起上述m文件以“loweq.m”保存%主程序t0=1;%信号的持续时间,用来定义时间向量ts=0.001;%抽样间隔fs=1/ts;%抽样频率fc=100;%载波频率,fc可以任意改变t=[-t0/2:ts:t0/2];%时间向量kf=1
4、00;%偏差常数df=0.25;%所需的频率分辨率,用在求傅里叶变换时,它表示FFT的最小频率间隔m=cos(pi*10*t);%调制信号,m(t)可以任意更改int_m(1)=0;%求信号m(t)的积分fori=1:length(t)-1int_m(i+1)=int_m(i)+m(i)*ts;end[M,m,df1]=fftseq(m,ts,df);%对调制信号m(t)求傅里叶变换M=M/fs;%缩放,便于在频谱图上整体观察f=[0:df1:df1*(length(m)-1)]-fs/2;%时间向量对应的频率向量u=cos(2*pi*fc*t+2*pi*kf*int_m
5、);%调制后的信号[U,u,df1]=fftseq(u,ts,df);%对调制后的信号u求傅里叶变换U=U/fs;%缩放%通过调用子程序env_phas和loweq来实现解调功能[v,phase]=env_phas(u,ts,fc);%解调,求出u的相位phi=unwrap(phase);%校正相位角,使相位在整体上连续,便于后面对该相位角求导dem=(1/(2*pi*kf))*(diff(phi)*fs);%对校正后的相位求导%再经一些线性变换来恢复原调制信号%乘以fs是为了恢复原信号,因为前面使用了缩放subplot(2,3,1)%子图形式显示结果plot(t,m(1
6、:length(t)))%现在的m信号是重新构建的信号,%因为在对m求傅里叶变换时m=[m,zeros(1,n-n2)]axis([-0.50.5-11])%定义两轴的刻度xlabel('时间t')title('原调制信号的时域图')subplot(2,3,4)plot(t,u(1:length(t)))axis([-0.50.5-11])xlabel('时间t')title('已调信号的时域图')subplot(2,3,2)plot(f,abs(fftshift(M)))%fftshift:将FFT中的DC分量移到频谱中心axis([-60060000.05])xlab
7、el('频率f')title('原调制信号的频谱图')subplot(2,3,5)plot(f,abs(fftshift(U)))axis([-60060000.05])xlabel('频率f')title('已调信号的频谱图')subplot(2,3,3)plot(t,m(1:length(t)))axis([-0.50.5-11])xlabel('时间t')title('原调制信号的时域图')subplot(2,3,6)plot(t,m(1:length(t)))axis([-0.50.5-11])xlabel('时间t'