Matlab系列之信号解调

2021-09-15 11:17:41 浏览数 (2)

上一篇对信号调制有进行了些介绍,本篇将对调制后的信号做还原,即解调。偷个懒,只讲几组比较有代表性的解调信号。

信号的调制可以理解成是原信号“叠加”在载波信号上,所以对于解调的简单理解,就可以是:把载波信号去除,剩下的便是原信号了~

解调的方式有相关解调和使用匹配滤波器,本篇就只介绍用相干解调来对调制信号做解调。

还有个前提要说下,因为实际上,接收机接收到的被调制的信号其实会和本地用于相关的载波信号不同步,所以在去载波前或者去载波后可能会有需要做另外的处理,从而实现信号同步,然后做另外的信号处理,不过不是本篇的需求了,所以本篇用到的信号就假设是个已经同步的调制信号了。

~Show Time~

BASK信号解调

BASK属于一维的信号,解调也比较简单,直接上实例看效果吧。示例的过程大概为:先产生数据,并叠加白噪声信号模拟实际的干扰,再进行相干解调,最后通过检测器输出结果。

示例

代码语言:javascript复制
clear all 
close all 
 
fs=1e3; 
t=0:1/fs:1-1/fs;%1s 
a=randi(2,1,10)-1;%随机数 
s=a(ceil(10*t 0.01)).*cos(2*pi*100*t);%生成BASK信号 
r=awgn(s,0);%加白噪声,信噪比为0dB 
 
%开始解调 
T=0:1/fs:(1-1/fs)/10;0ms 
carrier=cos(2*pi*100*T); 
for n=0:9 
    result=trapz(T,r(n*100 1:n*100 100).*carrier);%trapz是个求积分的函数,先将信号与载波做相关,再trapz做100ms的相干积分 
    if result>0.1/4%检测器的判断阈值,即相干的阈值,可以根据情况进行设定该阈值~ 
        output(n 1)=1; 
    else 
        output(n 1)=0; 
    end 
end 
 
%绘图 
subplot(221);plot(t,a(ceil(10*t 0.01)));title('原信号'); 
subplot(222);plot(t,s);title('调制信号'); 
subplot(223);plot(t,r);title('调制信号加噪'); 
subplot(224);plot(t,output(ceil(10*t 0.01)));title('解调结果');

结果

可以看到最后的解调输出结果很好的将原信号进行了还原~

MASK也可以用同样的解调器,不过检测器就不能用多样的了,毕竟MASK是在空间上是有多个信号点的,还需要计算其他参数来判决信号,就留给你们自己折腾了~hhhhh

QAM信号解调

QAM是二维的信号,且载波有两个,因此解调时,也需要对应两个相干器,用于分别解调QAM信号的正交和同相分量,其他的操作和BASK的相似。

示例

代码语言:javascript复制
clear all 
close all 
 
fs=1e3; 
t=0:1/fs:1-1/fs;%1s 
a=randi(2,1,20)-1;%随机数 
 
%QAM调制 
Ai=2*a(1:2:20)-1; 
Aq=2*a(2:2:20)-1; 
s=Ai(ceil(10*t 0.01)).*cos(2*pi*100*t) Aq(ceil(10*t 0.01)).*sin(2*pi*100*t); 
r=awgn(s,0);%加噪,0dB 
 
T=0:1/fs:0.1-1/fs; 
%两载波 
car_I=cos(2*pi*100*T); 
car_Q=sin(2*pi*100*T); 
%QAM解调 
for n=0:9 
    result(n 1,:)=[trapz(T,r(n*100 1:n*100 100).*car_I),... 
        trapz(T,r(n*100 1:n*100 100).*car_Q)]; 
end 
%计算4个可能的载波方向的相干值,按[I,Q]的形式存储。
s0=[trapz(T,-1*ones(1,100).*cos(2*pi*100*T).*car_I),... 
    trapz(T,-1*ones(1,100).*sin(2*pi*100*T).*car_Q)]; 
s1=[trapz(T,-1*ones(1,100).*cos(2*pi*100*T).*car_I),... 
    trapz(T,1*ones(1,100).*sin(2*pi*100*T).*car_Q)]; 
s2=[trapz(T,1*ones(1,100).*cos(2*pi*100*T).*car_I),... 
    trapz(T,-1*ones(1,100).*sin(2*pi*100*T).*car_Q)]; 
s3=[trapz(T,1*ones(1,100).*cos(2*pi*100*T).*car_I),... 
    trapz(T,1*ones(1,100).*sin(2*pi*100*T).*car_Q)]; 
%检测器,取相关性最强的 
for n=0:9 
    [~,I(n 1)]=min([norm(result(n 1,:)-s0),norm(result(n 1,:)-s1),... 
        norm(result(n 1,:)-s2),norm(result(n 1,:)-s3)]); 
end 
%按IQ分布取信号 
output(1:2:20)=floor((I-1)/2); 
output(2:2:20)=mod((I-1),2); 
%绘图 
subplot(221);plot(t,a(ceil((100*t 0.1)/5)));title('原信号'); 
subplot(222);plot(t,s(ceil((100*t 0.1)/5)));title('调制信号'); 
subplot(223);plot(t,r(ceil((100*t 0.1)/5)));title('调制信号加噪'); 
subplot(224);plot(t,output(ceil((100*t 0.1)/5)));title('解调结果');

结果

BPSK信号解调

BPSK的解调和QAM的有点相似,和调制的形式有关系,可以使用IQ调制的方式来实现,再补些PSK的东西:

具体可以参考这位的博客:https://www.mobibrw.com/2018/12118

示例

代码语言:javascript复制
%BPSK 
close all 
clear 
fs=1e3; 
t=0:1/fs:1-1/fs; 
a=randi(2,1,10)-1; 
m=a(ceil(10*t 0.01)); 
 
%调制 
M=2; 
s=cos(2*pi*100*t m*pi/M); 
r=awgn(s,0);%加噪 
 
T=0:1/fs:0.1-1/fs; 
car_I=cos(2*pi*100*T); 
car_Q=cos(2*pi*100*T pi/2);%也可以写成-sin(2*pi*100*T) 
 
%QAM解调 
for n=0:9 
    result(n 1,:)=[trapz(T,r(n*100 1:n*100 100).*car_I),... 
        trapz(T,r(n*100 1:n*100 100).*car_Q)]; 
end 
 
s0=[trapz(T,cos(2*pi*100*T).*car_I),... 
    trapz(T,cos(2*pi*100*T).*car_Q)]; 
s1=[trapz(T,cos(2*pi*100*T pi/2).*car_I),... 
    trapz(T,cos(2*pi*100*T pi/2).*car_Q)]; 
 
%检测器 
for n=0:9 
    [~,I(n 1)]=min([norm(result(n 1,:)-s0),norm(result(n 1,:)-s1)]); 
end 
output=I-1; 
 
%绘图 
subplot(221);plot(t,a(ceil(10*t 0.01)));title('原信号'); 
subplot(222);plot(t,s(ceil(10*t 0.01)));title('调制信号'); 
subplot(223);plot(t,r(ceil(10*t 0.01)));title('调制信号加噪'); 
subplot(224);plot(t,I(ceil(10*t 0.01)));title('解调结果');

结果

BFSK信号解调

BFSK信号也是二维信号,解调方式和BPSK、QAM都相似,由于BFSK会拥有两个频点,因此使用两组对应频率的本地载波对其进行相关,得以解调出原信号。

示例

代码语言:javascript复制
close all 
clear 
fs=1e3; 
t=0:1/fs:1-1/fs; 
 
df=20;%频偏 
a=randi(2,1,10)-1; 
m=a(ceil(10*t 0.01)); 
s=cos(2*pi*(100 m*df).*t);�=100Hz 
 
r=awgn(s,0); 
T=0:1/fs:0.1-1/fs; 
car1=cos(2*pi*100*T); 
car2=cos(2*pi*120*T); 
 
%解调 
for n=0:9 
    result(n 1,:)=[trapz(T,r(n*100 1:n*100 100).*car1),... 
        trapz(T,r(n*100 1:n*100 100).*car2)]; 
end 
 
s0=[trapz(T,cos(2*pi*100*T).*car1),... 
    trapz(T,cos(2*pi*100*T).*car2)]; 
s1=[trapz(T,cos(2*pi*120*T).*car1),... 
    trapz(T,cos(2*pi*120*T).*car2)]; 
 
%检测器 
for n=0:9 
    [~,I(n 1)]=min([norm(result(n 1,:)-s0),norm(result(n 1,:)-s1)]); 
end 
 
%绘图 
subplot(221);plot(t,a(ceil(10*t 0.01)));title('原信号'); 
subplot(222);plot(t,s(ceil(10*t 0.01)));title('调制信号'); 
subplot(223);plot(t,r(ceil(10*t 0.01)));title('调制信号加噪'); 
subplot(224);plot(t,I(ceil(10*t 0.01)));title('解调结果');

结果

结语

对于数字信号的解调就浅尝辄止吧,如果对通信领域比较有兴趣的,可以找个通信原理之类的书,按照那些理论知识折腾吧,前后这两篇,由于能力有限,更多的介绍其实还停留在表面,具体的应用,远不止这些,就当作是一块敲门砖,让刚开始的你,有一点学习的方向吧~

0 人点赞