Matlab系列之信号解调

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

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

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

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

BASK信号解调

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

示例

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;%100ms
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('解调结果');

结果

image-20210912101320644

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

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

QAM信号解调

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

示例

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('解调结果');

结果

image-20210912105116272

BPSK信号解调

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

img-7f0xCWlI-1631454919255)

image-20210912114322903

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

示例

%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('解调结果');

结果

image-20210912115528098

BFSK信号解调

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

示例

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);%f0=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('解调结果');

结果

image-20210912203803371

结语

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

描述有不正确的地方欢迎指出~


更多精彩,等你发现~


### 回答1: matlab中的chirp信号是一种随时间变化频率的信号解调这种信号的主要方法是通过傅里叶变换将信号转换到频域,然后找到频率变化的规律并根据规律进行拟合。 在matlab中,可以使用fft函数进行傅里叶变换,将信号转换到频域。然后可以使用findpeaks函数寻找信号中出现的峰值,并根据峰值的位置和幅值来确定信号的频率变化规律。如果变化规律已知,可以使用polyfit函数根据峰值的位置和幅值进行拟合,得到一个多项式函数表示频率随时间变化的关系。 在知道了频率变化的规律之后,可以使用ifft函数将信号从频域转换回时域,并使用chirp函数重构出原始的信号波形。通过与原始信号进行比较,可以得到解调后的信号。 总的来说,matlab解调chirp信号的方法可以概括为傅里叶变换、寻找峰值、拟合频率变化规律、重构信号波形。掌握这些方法可以帮助我们在处理信号处理中更高效地解读和操作chirp信号。 ### 回答2: Chirp信号解调的过程是利用计算机软件MATLAB来实现的。Chirp信号是一种具有可调频率的信号,它的频率随时间线性变化。因此,解调需要首先对接收到的信号进行时域分析,得到信号的频率特征。然后,在MATLAB中使用FFT算法对信号进行傅里叶变换,得到频域分布。在频谱图上,通过寻找宽度适当的带通滤波器的中心频率,可以对信号进行滤波。通过对滤波后的信号再进行傅里叶反变换,就可以得到去掉噪声的解调信号。另外,还可以通过计算信号的包络线来实现解调,包络线的斜率即为信号频率的一半。MATLAB提供了强大的信号处理工具箱和数据分析工具,可以帮助用户快速、准确地完成Chirp信号解调工作。 ### 回答3: MATLAB中的Chirp信号解调主要包括两个方面:信号生成和信号处理。 对于信号生成,可以使用MATLAB中的chirp函数来生成一个指定起始频率和终止频率的线性调频信号。这个信号可以通过信号发射并经过各种干扰后再经过接收端接收到,接收端得到的信号就是经过多次反射、多路径传播、多信号叠加后形成的回波信号。接收端需要将回波信号中的调频信号解调出来,从而得到原始的信号。 对于信号处理,常用的解调方法是通过FFT和相关性分析来进行。首先,对收到的回波信号进行FFT得到频域信息,然后找到线性调频信号的中心频率,以这个为基准将频谱分为上下两段,分别进行相关性分析。相关性分析可以找到线性调频信号的起始时刻和终止时刻,从而得到调频信号的频率变化率,从而得到原始信号。 总体而言,MATLAB中的Chirp信号解调需要对信号进行发射、接收、信号生成、信号处理等一系列步骤。对于信号处理部分需要使用FFT和相关性分析等方法,在实际操作中需要根据信号的具体特征来选择合适的算法和参数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值