Matlab系列之信号调制

前言

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

介绍

信号调制使用到的载波信号,通常可以用下方的公式表示:
s ( t ) = a ( t ) s i n ( ω t + φ ) s(t)=a(t)sin(ωt+φ) s(t)=a(t)sin(ωt+φ)
a(t)表示幅度,ω为频率,φ代表相位,所以载波信号可改变的就是该三变量,根据不同变量的改变,可以分为幅度调制、频率调制以及相位调制三大类。

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

幅度调制

BASK调制

BASK调制即二进制幅度调制又称二进制幅度键控(2ASK),设调制信号的公式为:
s ( t ) = a k c o s ( w t ) s(t)=a_kcos(wt) s(t)=akcos(wt)
公式中ak为0或1,特点::"1"码期间有等幅余弦波输出,相当与开关开通, "0"码期间无输出,相当与开关切断,因此称为幅移键控。

示例

%一秒传10bit的信号
close all
clear
t=0:1/1e3:1-1/1e3;%1s
a=randi([0,1],1,10);%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]);

结果

image-20210822104220830

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

image-20210822105720134

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

image-20210822105756581

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

代码

%一秒传10bit的信号
close all
clear
t=0:1/1e3:1-1/1e3;%1s
%a=randi([0,1],1,10);%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)。

image-20210822112546911

MASK调制

BASK是输入的二进制比特流的调制,而MASK则是输入M进制比特流的幅度调制,M=2N,其中N≥2,N代表同时发送的比特数,假设N=2,则以2bit为一组同时发送,同组的比特则称为一个码元;MASK对应的振幅值A表达式为:
A = ( 2 m + 1 − M ) ∗ d , m = 0 , . . . , M − 1 A=(2m+1-M)*d , m=0,...,M-1 A=(2m+1M)d,m=0,...,M1
表达式中,d用来控制幅度之间的差值,值为幅度间差值的一半。

示例

%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);

结果

image-20210822125049221

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

QAM调制

以上介绍的BASK和MASK都是属于单载波的情况,而QAM则拥有两个载波,即相互正交的两个分量,cosωt和sinωt,因而满足在一个周期内正交,所以该调制被称为正交幅度调制,信号表达式为:
s ( t ) = A i g ( t ) c o s ( ω t ) + A q g ( t ) s i n ( ω t ) s(t)=A_ig(t)cos(ωt)+A_qg(t)sin(ωt) s(t)=Aig(t)cos(ωt)+Aqg(t)sin(ωt)
Ai g(t)cos(ωt)为同相分量,Aq g(t)sin(ωt)则是正交分量,Ai和Aq分别被称为通向载波分量幅度和正交载波分量幅度。

示例

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星座图

结果

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

image-20210822132352666

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

image-20210822132645840

频率调制

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

BFSK调制

BFSK调制即二进制频率调制,发射信号可表示成
s ( t ) = A c o s ( 2 π ( f + m Δ f ) t ) , m = 0 , 1 s(t)=Acos(2\pi(f+m\Delta f)t),m=0,1 s(t)=Acos(2π(f+mΔf)t),m=0,1
其中 Δ f \Delta f Δf是相对与f的频偏,m是输入比特流,通常由0和1组成。

示例

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);%f0=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,与设定的一致。整个信号的带宽
B B F S K = Δ f ± 2 B B_{BFSK}=\Delta f±2B BBFSK=Δf±2B
Δ f \Delta f Δf为固定频偏,本例为100Hz,B是基带信号的带宽。图中50Hz和150Hz处的功率都比较大,但是50Hz处的相对大些,这是由于产生的信号序列中,0的数量比1多,即未调制的部分(50Hz的部分)要多,自然功率就高了。

image-20210822161954053

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

image-20210822162725694

MFSK调制

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

发射信号可用公式表示:
s ( t ) = A c o s ( 2 π ( f + m Δ f ) ∗ t ) , m = 0 , 1 , . . . , M − 1 s(t)=Acos(2\pi(f+m\Delta f)*t),m=0,1,...,M-1 s(t)=Acos(2π(f+mΔf)t),m=0,1,...,M1

示例

%假设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处。

image-20210822164844124

相位调制

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

发射信号可用以下公式表示:
s ( t ) = A c o s ( ω t + 2 m π M ) , m = 0 , 1 , . . . , M − 1 s(t)=Acos(ωt+{2m\pi\over M}),m=0,1,...,M-1 s(t)=Acos(ωt+M2mπ),m=0,1,...,M1
在此处,M代表可能的相位个数,M=2N,N是每次输入调制的比特数,若M=2,PSK即可称为二进制相移键控即BPSK;若M=4,则PSK称为四进制相移键控即QPSK;如果输入的比特流是经过差分编码输出的,则称为差分相移键控即DPSK。

示例

%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);

结果

image-20210822134958419

OQPSK调制

这部分介绍引用wiki的说明

image-20210822141549673

再对比下QPSK的时序图

image-20210822142530976

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

示例

%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);

结果

image-20210822141832870


更多精彩等你发现~


  • 29
    点赞
  • 264
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 基带信号是指没有经过频率调制信号,而BPSK调制是一种基带调制技术。在MATLAB中,我们可以使用一些函数和语句来生成和调制基带信号。 首先,我们可以使用MATLAB的linspace函数生成一组基带信号的采样点。假设要生成的基带信号是一个正弦波,可以使用以下语句生成: t = linspace(0, 1, 1000); % 生成从0到1的1000个等间隔采样点 baseband_signal = sin(2*pi*10*t); % 生成频率为10Hz的正弦波 接下来,我们可以使用MATLAB的randi函数生成一组随机的二进制比特序列,用于BPSK调制。假设比特序列的长度是N,可以使用以下语句生成: N = 100; % 比特序列的长度 binary_sequence = randi([0, 1], 1, N); % 生成长度为N的随机二进制比特序列 然后,我们可以使用MATLAB的pskmod函数对基带信号进行BPSK调制。假设基带信号的采样频率是Fs,可以使用以下语句进行调制: Fs = 1000; % 基带信号的采样频率 modulated_signal = pskmod(binary_sequence, 2, pi); % 进行BPSK调制 最后,我们可以使用MATLAB的plot函数将生成的基带信号调制后的信号绘制在时域上,以便进行可视化分析。可以使用以下语句进行绘制: plot(t, baseband_signal); % 绘制基带信号 hold on; plot(t, modulated_signal); % 绘制调制后的信号 xlabel('时间'); ylabel('幅度'); legend('基带信号', '调制信号'); ### 回答2: MATLAB是一种流行的编程和数值计算软件,常用于信号处理和通信系统设计。基带信号是指未经过调制信号,而BPSK调制是一种二进制相移键控调制技术。 在MATLAB中,可以使用信号处理工具箱来生成和调制基带信号。首先,可以使用sin函数生成信号的载波波形。例如,可以使用以下代码生成一个频率为f的正弦波: t = 0:0.001:1; % 生成时间序列 f = 10; % 设置载波频率 carrier = sin(2*pi*f*t); % 生成载波波形 然后,可以使用二进制数字序列来表示要传输的数据。BPSK调制将二进制0和1映射到载波的不同相位,通常将二进制0映射为0度相位,将二进制1映射为180度相位。 例如,可以使用以下代码生成一个随机的二进制数字序列: data = randi([0,1],1,100); % 生成100个随机二进制数字 接下来,可以使用上述生成的载波波形和二进制数字序列进行BPSK调制。代码如下: bpsk_signal = zeros(size(t)); % 创建空的BPSK信号向量 for i = 1:length(data) if data(i) == 0 bpsk_signal = bpsk_signal + carrier; % 映射二进制0到正弦波 else bpsk_signal = bpsk_signal - carrier; % 映射二进制1到正弦波 end end 最后,可以通过绘制波形图来查看BPSK调制后的信号。代码如下: plot(t, bpsk_signal); xlabel('Time'); ylabel('Amplitude'); title('BPSK Modulated Signal'); 这样,就可以使用MATLAB生成和调制基带信号进行BPSK调制。 ### 回答3: MATLAB是一种广泛使用的科学计算软件,可以用于各种工程和科学领域的数据处理和模拟。基带信号是指没有经过频率变换或调制信号,在MATLAB中可以通过数字信号处理工具箱来生成和处理基带信号。 BPSK(Binary Phase Shift Keying)是一种调制技术,用于将数字信息转换为模拟信号。BPSK调制的基本思想是将数字信号划分为一系列的比特,并根据每个比特的值生成对应的相位。在MATLAB中,可以使用脉冲幅度调制函数(PAM)来生成二进制信号,然后使用正弦函数生成相应的相位调制信号。 以下是一个简单的MATLAB代码示例,用于生成和调制BPSK信号: ```matlab % 生成二进制信息信号 info = [0 1 1 0 1 0 1 0 1 1 0 0 1]; % 将二进制信号转换为BPSK信号 bpsk = 2 * info - 1; % 设置采样频率和持续时间 fs = 100; % 采样频率 t = 0:(1/fs):(length(info)-1)/fs; % 时间向量 % 生成载波信号 fc = 10; % 载波频率 carrier = cos(2*pi*fc*t); % BPSK调制 modulated_signal = bpsk .* carrier; % 显示结果 subplot(2,1,1); plot(t, info, 'o-'); xlabel('时间'); ylabel('信号幅度'); title('二进制信息信号'); subplot(2,1,2); plot(t, modulated_signal, 'r'); xlabel('时间'); ylabel('调制信号幅度'); title('BPSK调制信号'); % 播放声音(可选) sound(modulated_signal, fs); ``` 这段代码首先生成了一个二进制信息信号`info`,然后将其转换为BPSK信号`bpsk`。接下来,代码设置了采样频率`fs`和时间向量`t`,用于生成载波信号`carrier`。最后,BPSK信号调制信号进行相乘得到最终的调制信号`modulated_signal`。运行代码后,可以通过绘图显示二进制信息信号和BPSK调制信号的波形,并通过可选的声音播放函数听到调制后的信号。 通过该代码示例,可以对MATLAB中BPSK调制的基本实现有一个基础的理解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值