Matlab系列之信号调制

2021-09-15 11:17:22 浏览数 (1)

前言

本来是打算弄下simulink的,但是吧,考虑了下大概的使用情况,会有挺多部分和之前的system generator系列相重,就不写了(主要还是懒~),打算接下来几篇开始对Matlab进行一些应用,比如本篇的信号调制,还有后面的信号解调以及一些图像处理的应用。

介绍

信号调制使用到的载波信号,通常可以用下方的公式表示:

a(t)表示幅度,ω为频率,φ代表相位,所以载波信号可改变的就是该三变量,根据不同变量的改变,可以分为幅度调制、频率调制以及相位调制三大类。

更多原理性的学习可以找本通信原理的书籍看看,就不多述了。

幅度调制

BASK调制

BASK调制即二进制幅度调制又称二进制幅度键控(2ASK),设调制信号的公式为:

公式中ak为0或1,特点::"1"码期间有等幅余弦波输出,相当与开关开通, "0"码期间无输出,相当与开关切断,因此称为幅移键控。

示例

代码语言:javascript复制
%一秒传10bit的信号
close all
clear
t=0:1/1e3:1-1/1e3;%1s
a=randi([0,1],1,10);个随机数 非0即1 
s=a(ceil(10*t 0.01)).*cos(2*pi*100*t);%调制信号

subplot(211)
plot(t,a(ceil(10*t 0.01)));
axis([0,1-1/1e3,-0.2,1.2]);
subplot(212)
plot(t,s);
axis([0,1-1/1e3,-1.2,1.2]);

结果

此外还可以进行频域的分析,原理如下图。

调制后的功率谱表达如下图

然后我们对示例的基带信号和调制信号进行频域的分析。

代码

代码语言:javascript复制
%一秒传10bit的信号
close all
clear
t=0:1/1e3:1-1/1e3;%1s
%a=randi([0,1],1,10);个随机数 非0即1 
a=[1,1,1,0,1,0,0,1,1,1];%与上面生成的保持一致
s1=a(ceil(10*t 0.01));%基带信号
s2=s1.*cos(2*pi*100*t);%调制信号

%分析功率谱
L=512;%做512点的FFT
fs=1e3;
%f=fs*(0:L/2)/L;
f=(-L/2:L/2-1)*(fs/L);
%f=(0:L-1)*(1e3/L); 
S1=fftshift(fft(s1,L));
S2=fftshift(fft(s2,L));

P1=abs(S1).^2/L;
P2=abs(S2).^2/L;


subplot(211)
plot(f,P1)
subplot(212)
plot(f,P2)

结果

可以从结果很明显的看出来,基带信号被搬移到了载波频率处(100Hz)。

MASK调制

BASK是输入的二进制比特流的调制,而MASK则是输入M进制比特流的幅度调制,M=2N,其中N≥2,N代表同时发送的比特数,假设N=2,则以2bit为一组同时发送,同组的比特则称为一个码元;MASK对应的振幅值A表达式为:

表达式中,d用来控制幅度之间的差值,值为幅度间差值的一半。

示例

代码语言:javascript复制
%4进制比特幅度调制
close all
clear
M=4;
d=1;
fs=1e3;
t=0:1/fs:1-1/fs;%时常
a=randi(2,1,20)-1;%产生随机比特流 限制幅度最大为2
for n=0:9
  sym(n 1)=a(2*n 1)*2 a(2*n 2);
end

%MASK
s=sym(ceil(10*t 0.01)).*cos(2*pi*100*t);
subplot(311);
plot(t,a(ceil(10*t 0.01)));
axis([0,1,-0.3,1.3])
subplot(312);
plot(t,sym(ceil(10*t 0.01)));
axis([0,1,-0.3,5])
subplot(313);
plot(t,s);

结果

假设MASK和BASK采用相同的码元速率,两者的带宽会相同,很显然在空间中,BASK只要两个信号点0和1,而MASK则有多个信号点,可以想到MASK将会有更高的带宽利用率;由于功率会受限,因而误码率也会相应的增大。

QAM调制

以上介绍的BASK和MASK都是属于单载波的情况,而QAM则拥有两个载波,即相互正交的两个分量,cosωt和sinωt,因而满足在一个周期内正交,所以该调制被称为正交幅度调制,信号表达式为:

Ai g(t)cos(ωt)为同相分量,Aq g(t)sin(ωt)则是正交分量,Ai和Aq分别被称为通向载波分量幅度和正交载波分量幅度。

示例

代码语言:javascript复制
close all
clear
fs=1e5;
t=0:1/fs:1-1/fs;
%脉冲
a=randi(2,1,60)-1;
%幅度分量
Ai=2*a(1:2:30)-1;
Aq=2*a(2:2:30)-1;
%调制
s=Ai(ceil(10*t 1/1e4)).*cos(2*pi*20*t)...
 Aq(ceil(10*t 1/1e4)).*sin(2*pi*20*t);

subplot(221)
plot(t,Ai(ceil(10*t 1/1e4)));
subplot(222)
plot(t,Aq(ceil(10*t 1/1e4)));
subplot(2,2,3)
plot(t,a(ceil(10*t 1/1e4)));
subplot(224);
plot(t,s);%QAM波形
scatterplot(Ai 1j*Aq);%QAM星座图

结果

可以看到在幅度跳变的时候,调制波形有所变化。

星座图用来表示QAM发射的信号集,星座上的每一个星座点都对应发射信号集中的那一点

频率调制

频率调制是一种使得发射信号的频率按调制信号的规律进行变化,且振幅保持不变的调制方式。

BFSK调制

BFSK调制即二进制频率调制,发射信号可表示成

其中∆f是相对与f的频偏,m是输入比特流,通常由0和1组成。

示例

代码语言:javascript复制
close all
clear
fs=1e3;
t=0:1/fs:1-1/fs;
df=100;%频偏
a=randi(2,1,10)-1;
m=a(ceil(10*t 0.01));
s=cos(2*pi*(50 m*df).*t);�=50Hz 

L=512;
f=(-L/2:L/2-1)*(fs/L);
S=fft(s,512);
P=abs(fftshift(S)).^2;

subplot(311)
plot(t,a(ceil(10*t 0.01)));

subplot(312)
plot(t,s);
subplot(313);
plot(f,P)

结果

从频谱中可以看出,具有两个频率峰,50Hz和150Hz,与设定的一致。整个信号的带宽BBFSK=∆f±2B,∆f为固定频偏,本例为100Hz,B是基带信号的带宽。图中50Hz和150Hz处的功率都比较大,但是50Hz处的相对大些,这是由于产生的信号序列中,0的数量比1多,即未调制的部分(50Hz的部分)要多,自然功率就高了。

重新运行程序,找到一组1的数量较多的进行比较,可以看到150Hz处的功率明显比50Hz的高。

MFSK调制

MFSK的“M”与MASK中的“M”是一样的意思,代表输入多比特,即MFSK称为M进制频率调制。M=2N,N≥1,N是每次输入到调制器的比特数。

发射信号可用公式表示:

示例

代码语言:javascript复制
%假设M=4,4进制FSK调制
close all
clear
fs=1e3;
t=0:1/fs:1-1/fs;
df=50;

a=randi(2,1,20)-1;
sym=2*a(1:2:20) a(2:2:20);
m=sym(ceil(10*t 0.01));

s=cos(2*pi*(50 m*df).*t);

L=512;
f=(-L/2:L/2-1)*(fs/L);
S=fft(s,L);
P=abs(fftshift(S)).^2;

subplot(311)
plot(t,m);

subplot(312)
plot(t,s);
subplot(313);
plot(f,P)

结果

可以看到在时域的信号基带信号有四种值,调制信号也可明显看出具有4种频率,频谱中出现了四个峰,分别在中心频率50Hz、100Hz、150Hz和200Hz处。

相位调制

载波的相位相对参考相位的偏移值随调制信号的瞬时值成比例的变化的调制方式,称为相位调制即调相。调相和调频关联很紧密,调相时会有调频发生,调频时也会有调相发生,不过变化的规律不太一样,实际使用更多的还是调频.

发射信号可用以下公式表示:

在此处,M代表可能的相位个数,M=2N,N是每次输入调制的比特数,若M=2,PSK即可称为二进制相移键控即BPSK;若M=4,则PSK称为四进制相移键控即QPSK;如果输入的比特流是经过差分编码输出的,则称为差分相移键控即DPSK。

示例

代码语言:javascript复制
%QPSK
close all
clear
fs=1e3;
t=0:1/fs:1-1/fs;
a=randi(2,1,20)-1;
sym=a(1:2:20) a(2:2:20);
m=sym(ceil(10*t 0.01));

%调制
M=4;
s=cos(2*pi*50*t 2*m*pi/M);

L=512;
f=(-L/2:L/2-1)*(fs/L);
S=fft(s,512);
P=abs(fftshift(S)).^2;

figure;
subplot(311)
plot(t,a(ceil(10*t 0.01)));
axis([0,1,-0.2,1.2]);
subplot(312)
plot(t,s);
subplot(313)
plot(f,P);

结果

OQPSK调制

这部分介绍引用wiki的说明

再对比下QPSK的时序图

两者的主要差别就是相位跳变的限制,QPSK最大可达180°,OQPSK则不会超过90°。

示例

代码语言:javascript复制
%QPSK
close all
clear
fs=1e3;
t=0:1/fs:1-1/fs;
a=randi(2,1,20);
m=2*a-1;
I=m(1:2:20);
Q=m(2:2:20);
I=[I(ceil(10*t 0.01)),ones(1,50)];
Q=[ones(1,50),Q(ceil(10*t 0.01))];

t=0:1/fs:1-1/fs 50/fs;
s=I.*cos(2*pi*50*t)-Q.*sin(2*pi*50*t);

L=512;
f=(-L/2:L/2-1)*(fs/L);
S=fft(s,512);
P=abs(fftshift(S)).^2;

figure;
subplot(411)
plot(t,I);
axis([0,1.05,-0.03,3.3])
subplot(412)
plot(t,Q);
axis([0,1.05,-0.3,3.3])
subplot(413)
plot(t,s);
axis([0,1.05 -inf inf])
subplot(414)
plot(f,P);

结果

0 人点赞