AM仿真程序 下载本文

内容发布更新时间 : 2024/11/5 12:53:40星期一 下面是文章的全部内容请认真阅读。

仿真程序

PM

首先任意给定一个已知调制信号m(t)=cos(pi*10*t), 进行相位调制时要用到傅里叶变换,因此先编写傅里叶变换的m文件用作主函数调用,其m文件代码如下:

%求傅里叶变换的子函数

function [M,m,df]=fftseq(m,ts,df) fs=1/ts;

if nargin==2 n1=0; %nargin为输入参量的个数 else n1=fs/df; end

n2=length(m);

n=2^(max(nextpow2(n1),nextpow2(n2)));

%nextpow2(n)取n最接近的较大2次幂

M=fft(m,n);

%M为信号m的傅里叶变换,n为快速傅里叶变换的点数,及基n-FFT变

m=[m,zeros(1,n-n2)]; %构建新的m信

df=fs/n; %重新定义频率分辨率 上述m文件以“fftseq.m”保存。

在实现相位解调时要调用两个子函数,分述如下: %求信号相角的子函数,这是调频、调相都要用到的方法 function [v,phi]=env_phas(x,ts,f0)

if nargout==2 %nargout为输出变数的个数 z=loweq(x,ts,f0); %产生调制信号的正交分量 phi=angle(z); %angle是对一个复数求相角的函数

end

v=abs(hilbert(x)); ?s用来求复数hilbert(x)的模 上述m文件以“env_phas.m”保存。

%产生调制信号的正交分量 function x1=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=100; %偏差常数 df=0.25;

%所需的频率分辨率,用在求傅里叶变换时,它表示FFT的最小频率间隔 m=cos(pi*10*t); %调制信号,m(t)可以任意更

int_m(1)=0; %求信号m(t)的积分 for i=1:length(t)-1

int_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); %调制后的信号 [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:length(t))) %现在的m信号是重新构建的信号, %因为在对m求傅里叶变换时m=[m,zeros(1,n-n2)]

axis([-0.5 0.5 -1 1]) %定义两轴的刻度 xlabel('时间t') title('原调制信号的时域图') subplot(2,3,4) plot(t,u(1:length(t))) axis([-0.5 0.5 -1 1]) xlabel('时间t')

title('已调信号的时域图') subplot(2,3,2)

plot(f,abs(fftshift(M))) ?tshift:将FFT中的DC分量移到频谱中心

axis([-600 600 0 0.05]) xlabel('频率f')

title('原调制信号的频谱图')