背景:

  临近毕业整理毕业论文的资料时,看到了写论文时仿真的各类常见通信信号,当时每种信号的仿真的都找了挺久的,因为网上有的代码实现太复杂看不太懂,有的代码呈现的效果不太好,所以现在把这些MATLAB代码整理总结一下方便大家直接使用。本文仿真的信号类型有:高斯白噪声、噪声调幅信号、噪声调频信号、单音信号、多音信号、扫频信号、2ASK信号、2FSK信号、BPSK信号、16QAM信号。仿真时主要针对时域波形和频谱进行展示,并对当时的代码加注释方便大家理解。

1、高斯白噪声

  在分析通信系统的抗噪声性能时,因为通信系统中常见的热噪声近似为白噪声,且热噪声的取值恰好服从高斯分布,
所以常用高斯白噪声作为通信信道中的噪声模型。其中噪声的统计均值为 0,统计方差为1,并且高斯白噪声的幅值-频次统计直方图服从正态分布。仿真结果如图所示,图1是高斯白噪声的时域波形,图2是高斯白噪声的归一化功率,图3是高斯白噪声的统计信息和幅值用来验证高斯白噪声分布的特点,其中程序的最后两行分别计算了噪声的均值和方差验证是否均值=0方差=1,本次仿真的均值=5.3547e-4,接近于0,方差=0.9987,接近于1。

length = 1000000;
ff = 0:length-1;
noise = wgn(length,1,0);%生成100000*1个高斯白噪声,功率为0dBW(分贝瓦)
y1 = fft(noise,length);%采样点个数100000个
p1 = y1.*conj(y1);%conj()得到相应的复共轭数,y1.*conj(y1)就是模的平方
max_P=max(p1);%求功率的最大值
p1 =p1/(max_P);%除以最大值把功率谱归一化

subplot(2,2,1),plot(ff,noise(1:length)),axis([0 (length) -5 5]),xlabel('时间(s)'),ylabel('幅值(V)'),title('高斯白噪声波形');
subplot(2,2,2),plot(ff,p1(1:length)),axis([0 length 0 1]);xlabel('频率(Hz)');ylabel('功率');title('高斯白噪声归一化功率谱');
set(gca,'YTick',0:1:1);%设置逻辑值坐标轴为0和1,这样子就不会出现0-0.1-0.2^0.8-0.9-1的坐标,影响美观
subplot(2,2,3),hist(noise,40);axis([ -5 5 0 110000]);xlabel('幅值(V)');ylabel('频次');title('幅值-频次直方图');
mean_value = mean(noise)%计算噪声的均值,理论上应该是0
variance = var(noise)%计算噪声的方差,理论上应该为1,功率为0dBW(10*log1=0)

2、噪声调幅信号

  噪声调幅信号是是利用噪声作为调制信号,对载波信号进行AM调制,使得载波信号的振幅随基带噪声做随机变化,这里的噪声使用了上面的高斯白噪声进行调制。其中这里的上包络和下包络只是噪声信号的变形,不是噪声调幅信号真正的包络,只是为了便于理解调幅信号的本质所构造的辅助曲线。
  噪声调幅信号的公式为:J ( t ) = ( U 0 + U n ( t ) ) cos ⁡ ( w j t + φ ) , J(t)=\left(U_{0}+U_{n}(t)\right) \cos \left(w_{j} t+\varphi\right),J(t)=(U0​+Un​(t))cos(wj​t+φ),其中,U 0 U_{0}U0​是载波振幅,w j w_{j}wj​是载波角频率,U n ( t ) U_{n}(t)Un​(t)是基带噪声,φ φφ在[0,2π]内均匀分布。
  通过分析图中噪声信号和噪声调幅干扰信号的波形与功率谱,可以发现噪声调幅干扰信号具有以下特点:

  1) 噪声调幅干扰信号的功率谱由载波谱和对称旁瓣谱构成,旁瓣谱的形状与基带噪声功率谱的形状相似。

  2) 噪声调幅干扰信号的带宽为基带噪声带宽的两倍

fj=20e6;fs=4*fj; Tr=520e-6;
t1=0:1/fs:3*Tr-1/fs; N=length(t1);
u=wgn(1,N,0);%生成N*1个高斯白噪声,功率为0dBW(分贝瓦)
df1=fs/N;n=0:N/2;f=n*df1;
wp=10e6;ws=14e6;rp=1; rs=60;
[n1,wn1]=buttord(wp/(fs/2),ws/(fs/2),rp,rs);
[b,a]=butter(n1,wn1);
u1=filter(b,a,u);
p=0.1503*mean((u1.^2));
figure;subplot(2,2,1),plot(t1,u1),title('噪声信号波形'); axis([0,0.02e-4,-2,2]);xlabel('时间(s)');ylabel('幅度(V)');
subplot(2,2,2), j2=fft(u1);plot(f,10*log10(abs(j2(n+1)*2/N)));xlabel('频率(Hz)');ylabel('功率(dBW)');axis([0,4e7,-70,0]);title( '噪声信号功率谱');
u0=1;y=(u1+u0).*cos(2*pi*fj*t1+2);%噪声调幅信号的波形
u2=u1+u0;%上包络的波形
u3=-u0-u1;%下包络的波形
subplot(2,2,3), plot(t1,y,t1,u2,t1,u3),title( '噪声调幅信号时域波形'); axis([0,0.02e-4,-2,2]);xlabel('时间(s)');ylabel('幅度(V)');
subplot(2,2,4), J=fft(y);plot(f,10*log10(abs(J(n+1))));xlabel('频率(Hz)');ylabel('功率(dBW)');axis([0,4e7,-20,50]);title( '噪声调幅信号功率谱');

uj=1;mf=2;wpp=10;
fj=20e6;fs=8*fj;Tr=520e-6;
t1=0:1/fs:3*Tr-1/fs;N=length(t1);
u=wgn(1,N,0);
wp=10e6;ws=16e6;rp=1;rs=60;
[n1,wn1]=buttord(wp/(fs/2),ws/(fs/2),rp,rs);
[b,a]=butter(n1,wn1);
u1=filter(b,a,u);
p=0.8503*mean((u1.^2)) ;
fj=20e6;fs=8*fj;Tr=520e-6;bj=5e6;
t1=0:1/fs:3*Tr-1/fs;N=length(t1);
u=wgn(1,N,wpp);
df1=fs/N;n=0:N/2;f=n*df1;
wp=10e6;ws=14e6;rp=1;rs=60;
[Nn,wn]=buttord(wp/(30e6/2),ws/(30e6/2),rp,rs);
[b,a]=butter(Nn,wn);
figure;subplot(2,2,1),plot(t1,u1),title('噪声信号波形');axis([0,2e-6,-2,2]);xlabel('时间(s)');ylabel('幅度(V)');
subplot(2,2,2),j2=fft(u1); plot(f,10*log10(abs(j2(n+1)*2/N)));xlabel('频率(Hz)');ylabel('功率(dBW)');axis([0,4e7,-20,50]);title( '噪声信号功率谱');axis([0,4e7,-80,0]);
i=1:N-1;ss=cumsum([0 u1(i)])
ss=ss*Tr/N;
y=uj*cos(2*pi*fj*t1+2*pi*mf*bj*ss*10);%uj=1 是输出的噪声调频信号的幅度  fj是调制信号中心频率是20M    增加调制指数*10 让波形明显
subplot(2,2,3), plot(t1,y),title( '噪声调频信号波形'),axis([0,2e-6,-1.5,1.5]);xlabel('时间(s)');ylabel('幅度(V)');
y=uj*cos(2*pi*fj*t1+2*pi*mf*bj*ss);%uj=1 是输出的噪声调频信号的幅度  fj是调制信号中心频率是20M  
subplot(2,2,4),J=fft(y);plot(f,10*log10(abs(J(n+1))));axis([0,4e7,-20,60]);xlabel('频率(Hz)');ylabel('功率(dBW)');axis([0,4e7,-20,50]);title( '噪声调频信号功率谱')

 

Fs=20000;  %采样频率
N=20000;    %采样点
n=0:N-1;t=n/Fs;  %时间序列
fc=1000;  %载波信号频率 
f=n*Fs/N;  %频率 
Uc=1*sin(2*fc*pi*t);     %载波信号 
C1=fft(Uc);             %对载波信号进行傅里叶变换 
cxf=abs(C1);           %进行傅里叶变换  
cxf=cxf/max(cxf);%归一化
subplot(3,1,1);plot(t,Uc);title('载波信号波形');xlabel('时间(s)');ylabel('幅度(V)');title('单音干扰信号波形');axis([0 0.009 -1 1]);
subplot(3,1,2); plot(f(1:N/2),cxf(1:N/2));title('载波信号频谱'); axis([0 2000 0 1]);xlabel('频率(Hz)');ylabel('功率');title('单音干扰信号归一化功率谱');
set(gca,'YTick',0:1:1);%设置功率谱坐标轴只有0和1

 

Fs=200000;  %采样频率
N=200000;    %采样点
n=0:N-1;t=n/Fs;  %时间序列
A0=1;  %信号振幅 
fc=1000;  %信号中间频率 
f=n*Fs/N;  %信号步进频率
w0=2*fc*pi; 
step=2*pi*50;
Uc=A0*cos(w0*t)+A0*cos((w0+step)*t)++A0*cos((w0+2*step)*t)++A0*cos((w0+3*step)*t)+A0*cos((w0-step)*t)++A0*cos((w0-2*step)*t)++A0*cos((w0-3*step)*t);%多音信号 
C1=fft(Uc);      %对信号进行傅里叶变换 
cxf=abs(C1);     %求绝对值
cxf=cxf/max(cxf);%归一化
subplot(2,1,1);plot(t,Uc);xlabel('时间(s)');ylabel('幅度(V)');title('多音信号波形');axis([0 0.1 -8 8]);
subplot(2,1,2);plot(f(1:N/2),cxf(1:N/2));title('载波信号频谱');axis([0 2000 0 1]);xlabel('频率(Hz)');ylabel('功率');title('多音信号归一化功率谱');
set(gca,'YTick',0:1:1);%设置功率谱坐标轴只有0和1

t=0:0.00001:3-0.00001;%3对应3个周期,0.00001为精度
f0=5;%扫频起始频率
fe=100;%扫频截止频率
x=chirp(mod(t,1),f0,1,fe);%1代表的是单周期时间
subplot(3,1,1);plot(t,x);title('三个周期的线性扫频信号波形');xlabel('时间(s)');ylabel('幅度(V)');

ft=f0+(fe-f0)*mod(t,1);
subplot(3,1,2);plot(t,ft);title('线性扫频信号频率-时间图');xlabel('时间(s)');ylabel('频率(Hz)');

t=0:0.00001:1-0.00001;%求频谱时不能对多周期的求,对1个周期进行FFT
x=chirp(t,f0,1,fe);
C1=fft(x);     %对载波信号进行傅里叶变换 
cxf=abs(C1);    %求绝对值
cxf=cxf/max(cxf);%归一化
subplot(3,1,3);plot(cxf); axis([0 150 0 1]);title('线性扫频信号归一化频谱');xlabel('频率(Hz)');ylabel('功率');

N=10;%仿真10S的时间
xn=[];
x=[1 0 1 1 0 0 1 0 1 0];%每秒一个逻辑值,一共10个
t=0.001:0.001:N;%以1ms为步进
for i=1:N
if x(i)==1
xn(i*1000-999:i*1000)=ones(1,1000);
else
xn(i*1000-999:i*1000)=zeros(1,1000);
end
end
y=cos(2*pi*3*t);%载波波形 频率为3Hz
z=xn.*y;%载波调制
subplot(3,1,1);plot(xn);title(' 基带信号');xlabel('时间(ms)');ylabel('逻辑值');axis([0 10000 -0.2 1.2]);
set(gca,'YTick',-1:1:1);%设置逻辑值坐标轴只有0和1
subplot(3,1,2);plot(y);title(' 载波波形');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);
subplot(3,1,3);plot(z);title(' 2ASK信号');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);

 

N=10;%仿真10S的时间
xn=[];xn1=[];
x=[1 0 1 1 0 0 1 0 1 0];%%每秒一个逻辑值,一共10个
t=0.001:0.001:N;%以1ms为步进
for i=1:N
if x(i)==1
xn(i*1000-999:i*1000)=ones(1,1000);%xn都置为0
xn1(i*1000-999:i*1000)=zeros(1,1000);%xn1都置为1
else
xn(i*1000-999:i*1000)=zeros(1,1000);%xn都置为1
xn1(i*1000-999:i*1000)=ones(1,1000);%xn1都置为0
end
end
y=cos(2*pi*2*t);%载波波形1 频率为2Hz
y2=cos(2*pi*6*t);%载波波形2 频率为6Hz
F1=xn.*y; %加入载波1
F2=xn1.*y2; %加入载波2
e_fsk=F1+F2;%叠加
figure(1);heigth=160;width=160;set(gcf,'Position',[0 0 width/0.277 heigth/0.277]);%前面是图片在屏幕的位置,后面是图片大小为20*20
subplot(4,1,1);plot(xn);title(' 基带信号');xlabel('时间(ms)');ylabel('逻辑值');axis([0 10000 -0.2 1.2]);
set(gca,'YTick',-1:1:1);%设置逻辑值坐标轴只有0和1
subplot(4,1,2);plot(y);title(' 载波波形');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);
subplot(4,1,3);plot(y2);title(' 2ASK信号');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);
subplot(414);plot(e_fsk);title('2FSK信号');axis([0 10000 -1 1]);xlabel('时间(ms)');ylabel('幅度(V)');

N=10;%仿真10S的时间
xn=[];xn1=[];
x=[1 0 1 1 0 0 1 0 1 0];%每秒一个逻辑值,一共10个
t=0.001:0.001:N;%以1ms为步进
for i=1:N
if x(i)==1
xn(i*1000-999:i*1000)=ones(1,1000);
xn1(i*1000-999:i*1000)=ones(1,1000);%码元值都为1
else
xn(i*1000-999:i*1000)=-ones(1,1000);
xn1(i*1000-999:i*1000)=zeros(1,1000);%码元值都为0
end
end
y=sin(2*pi*1*t);%载波波形 频率为3Hz   与前面的不一样,为正弦波
z=xn.*y;%载波调制
subplot(3,1,1);plot(xn1);title(' 基带信号');xlabel('时间(ms)');ylabel('逻辑值');axis([0 10000 -0.2 1.2]);
set(gca,'YTick',-1:1:1);%设置逻辑值坐标轴只有0和1
subplot(3,1,2);plot(y);title(' 载波波形');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);
subplot(3,1,3);plot(z);title(' 2ASK信号');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);

 

在这里插入图片描述

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐