这篇博客是用MATLAB仿真观察二进制数字信号码元速率和它的带宽的关系。书上给了数字基带信号和频带信号的功率谱密度,但是我还没搞明白FFT与功率谱密度的关系,所以博客里图片的信号幅值就不要纠结啦,看包络形状和带宽就行。如果有明白FFT与功率谱密度的关系的朋友看到博客,请留言告诉我。
单极性非归零NRZ码
在表示一个码元时,二进制符号1和0分别对应基带信号的正电平和零电平,在整个码元持续时间,电平保持不变。发1和发0等概率时,单极性非归零NRZ信号的功率谱密度为
P
s
(
f
)
=
1
4
T
b
S
a
2
(
π
f
T
b
)
+
1
4
δ
(
f
)
P_s(f)=\frac{1}{4}T_{b}Sa^{2}(\pi fT_{b})+\frac{1}{4}\delta (f)
Ps(f)=41TbSa2(πfTb)+41δ(f)
T
b
(
s
)
T_b(s)
Tb(s) 是码元宽度,码元速率
R
B
=
1
T
b
(
B
a
u
d
)
R_B=\frac{1}{T_b}(Baud)
RB=Tb1(Baud)。功率谱的带宽近似为
f
b
=
1
T
b
(
H
z
)
f_b=\frac{1}{T_b}(Hz)
fb=Tb1(Hz)(Sa函数第一零点)。
下图为单极性非归零NRZ码的幅频特性,用MATLAB的fft函数计算的(下同),码元速率
R
B
=
100
B
a
u
d
R_B=100Baud
RB=100Baud,抽样频率
f
s
=
5000
H
z
f_s=5000Hz
fs=5000Hz,由于fft函数计算结果是对称的,所以只画了一半的图像。可以看到0频率处有一个冲激信号,第一个零点在100
H
z
Hz
Hz处。
双极性非归零NRZ码
二进制符号1和0分别对应基带信号的正电平和负电平, 双极性非归零NRZ码具有直流分量小、抽样判决门限为0、可以在电缆等不接地线上传输等优点。 发1和发0等概率时,双极性非归零NRZ码的功率谱密度为
P
s
(
f
)
=
T
b
S
a
2
(
π
f
T
b
)
P_s(f)=T_{b}Sa^{2}(\pi fT_{b})
Ps(f)=TbSa2(πfTb) 带宽近似为
f
b
=
1
T
b
f_b=\frac{1}{T_b}
fb=Tb1。
下图为双极性非归零NRZ码的幅频特性,也是用fft函数计算的,
R
B
=
100
B
a
u
d
R_B=100Baud
RB=100Baud,
f
s
=
5000
H
z
f_s=5000Hz
fs=5000Hz。可以看到0频率处没有冲激信号,第一个零点在100
H
z
Hz
Hz处。
二进制幅度键控(2ASK)
2ASK是利用代表数字信息的0或1的基带矩形脉冲去键控一个连续的高频载波,使载波时断时续地输出。2ASK信号可以表示为
s
2
A
S
K
(
t
)
=
s
(
t
)
c
o
s
(
ω
c
t
)
s_{2ASK}(t)=s(t)cos(\omega_ct)
s2ASK(t)=s(t)cos(ωct)
ω
c
\omega_c
ωc是载波角频率,
s
(
t
)
s(t)
s(t)为单极性非归零NRZ矩形脉冲序列。
2ASK信号的频谱类似AM信号的频谱,都是将低频信号的频谱搬移到载波频率的位置,带宽是低频信号带宽的两倍,即
B
2
A
S
K
=
2
f
b
=
2
T
b
=
2
R
B
B_{2ASK}=2f_b=\frac{2}{T_b}=2R_B
B2ASK=2fb=Tb2=2RB 2ASK的频带利用率为
η
=
R
B
B
2
A
S
K
=
1
2
B
a
u
d
/
H
z
\eta=\frac{R_B}{B_{2ASK}}=\frac{1}{2}Baud/Hz
η=B2ASKRB=21Baud/Hz
下图为2ASK信号的幅频特性,
R
B
=
100
B
a
u
d
R_B=100Baud
RB=100Baud,
f
s
=
5000
H
z
f_s=5000Hz
fs=5000Hz,
f
c
=
1000
H
z
f_c=1000Hz
fc=1000Hz。可以看到1000
H
z
Hz
Hz频率处有一冲激信号,主瓣的第一个零点在1100
H
z
Hz
Hz和900
H
z
Hz
Hz处,带宽为200
H
z
Hz
Hz。
二进制频移键控(2FSK)
2FSK信号是1对应于载频
f
1
f_1
f1,0对应载频
f
2
f_2
f2,
f
1
f_1
f1与
f
2
f_2
f2之间的改变是瞬间完成的。2FSK信号可以表示为
s
2
F
S
K
(
t
)
=
s
(
t
)
c
o
s
(
ω
1
t
+
ϕ
n
)
+
s
(
t
)
‾
c
o
s
(
ω
2
t
+
θ
n
)
s_{2FSK}(t)=s(t)cos(\omega_1t+\phi_n)+\overline{s(t)}cos(\omega_2t+\theta_n)
s2FSK(t)=s(t)cos(ω1t+ϕn)+s(t)cos(ω2t+θn)
s
(
t
)
s(t)
s(t)为单极性非归零矩形脉冲序列,
s
(
t
)
‾
\overline{s(t)}
s(t)为对
s
(
t
)
s(t)
s(t)逐码取反形成的矩形脉冲序列,
ϕ
n
\phi_n
ϕn和
θ
n
\theta_n
θn是第n个码元的初相位。
2FSK可以视为两路2ASK信号的合成,其中一路以
s
(
t
)
s(t)
s(t)为基带信号,
ω
1
\omega_1
ω1为载频,另一路以
s
(
t
)
‾
\overline{s(t)}
s(t)为基带信号,
ω
2
\omega_2
ω2为载频。因此,2FSK信号的频谱也是两个2ASK频谱之和。2FSK的带宽为为
B
2
F
S
K
=
∣
f
2
−
f
1
∣
+
2
f
b
B_{2FSK}=|f_2-f_1|+2f_b
B2FSK=∣f2−f1∣+2fb
f
b
=
1
T
b
f_b=\frac{1}{T_b}
fb=Tb1是基带信号的带宽,数值上等于码元速率。
下图为2FSK信号的幅频特 性,
R
B
=
100
B
a
u
d
R_B=100Baud
RB=100Baud,
f
s
=
5000
H
z
f_s=5000Hz
fs=5000Hz,
f
1
=
1000
H
z
f_1=1000Hz
f1=1000Hz,
f
2
=
2000
H
z
f_2=2000Hz
f2=2000Hz。可以看到1000
H
z
Hz
Hz和2000
H
z
Hz
Hz频率处各有一个冲激信号,2FSK信号带宽为
B
2
F
S
K
=
2000
−
1000
+
2
×
100
=
1200
H
z
B_{2FSK}=2000-1000+2\times100=1200Hz
B2FSK=2000−1000+2×100=1200Hz
二进制相移键控(2PSK)和二进制差分相移键控(2DPSK)
2PSK是利用载波的相位直接表示数字信息的相移方式,通常用相位0和相位π来分别表示0或1。2PSK信号可以表示为
s
2
P
S
K
(
t
)
=
s
(
t
)
c
o
s
(
ω
c
t
)
s_{2PSK}(t)=s(t)cos(\omega_ct)
s2PSK(t)=s(t)cos(ωct)
ω
c
\omega_c
ωc是载波角频率,
s
(
t
)
s(t)
s(t)为双极性非归零NRZ矩形脉冲序列。
因为
s
(
t
)
s(t)
s(t)的均值为0,2PSK可以视为抑制载波双边带调幅,2PSK的连续谱部分与2ASK的连续谱部分形状基本相同。2PSK信号的带宽为
B
2
P
S
K
=
2
f
b
=
2
T
b
=
2
R
B
B_{2PSK}=2f_b=\frac{2}{T_b}=2R_B
B2PSK=2fb=Tb2=2RB
频带利用率为
η
2
P
S
K
=
R
B
B
2
P
S
K
=
1
2
B
a
u
d
/
H
z
\eta_{2PSK}=\frac{R_B}{B_{2PSK}}=\frac{1}{2}Baud/Hz
η2PSK=B2PSKRB=21Baud/Hz
2DPSK是用前后码元的相对载波相位值传送数字信息,相对载波相位是指本码元与前一码元初相之差。2DPSK可以由原0、1序列的相对码(差分码)经过绝对相移键控(2PSK)而形成,2DPSK信号也可以表示为
s
2
D
P
S
K
(
t
)
=
s
(
t
)
c
o
s
(
ω
c
t
)
s_{2DPSK}(t)=s(t)cos(\omega_ct)
s2DPSK(t)=s(t)cos(ωct)
s
(
t
)
s(t)
s(t)为差分码数字序列。
2DPSK与2PSK有相同的带宽和频带利用率,即
B
2
D
P
S
K
=
B
2
P
S
K
B_{2DPSK}=B_{2PSK}
B2DPSK=B2PSK
η
2
D
P
S
K
=
η
2
P
S
K
\eta_{2DPSK}=\eta_{2PSK}
η2DPSK=η2PSK
下图为2PSK信号的幅频特性,
R
B
=
100
B
a
u
d
R_B=100Baud
RB=100Baud,
f
s
=
5000
H
z
f_s=5000Hz
fs=5000Hz,
f
c
=
1000
H
z
f_c=1000Hz
fc=1000Hz。可以看到1000
H
z
Hz
Hz频率处没有冲激信号,主瓣的第一个零点在1100
H
z
Hz
Hz和900
H
z
Hz
Hz处,带宽为200
H
z
Hz
Hz。2DPSK的幅频特性与2PSK相同。
MATLAB仿真
%% Parameter
fs = 5000; %sampling frequency Hz
fc1 = 1000; %carrier frequency Hz
fc2 = 2000; %carrier frequency Hz
RB = 100; %Code Rate Baud
M = 2; %Size of signal constellation
k = log2(M);%Number of bits per symbol
N = 10000; %Number of bits to process
n = 2^(ceil(log2(N*fs/RB)));
t = (0:n-1)./fs; % time vector
f = (-n/2:n/2-1)*fs/n; %frequency range
%% Generate code or signal
data_in = randi([0,k],N,1);%unipolar code
unipolar_nrz_st = zeros(1,n);
bipolar_nrz_st = zeros(1,n);
% 1 δφ=π, 0 δφ=0
differencial_st = zeros(1,n);
last_bit = -1;
for i = 0:N-1
unipolar_nrz_st((i*fs/RB+1):((i+1)*fs/RB)) = data_in(i+1);%unipolar non-zero signal
if data_in(i+1) == 1
bipolar_nrz_st((i*fs/RB+1):((i+1)*fs/RB)) = 1;%bipolar non-zero signal
last_bit = -last_bit;
differencial_st((i*fs/RB+1):((i+1)*fs/RB)) = last_bit;%differencial signal
else
bipolar_nrz_st((i*fs/RB+1):((i+1)*fs/RB)) = -1;
differencial_st((i*fs/RB+1):((i+1)*fs/RB)) = last_bit;
end
end
%% Unipolar non-zero signal
%Baseband
S = fftshift(fft(unipolar_nrz_st));
figure('Name','Unipolar non-zero signal','NumberTitle','off');
subplot(3,1,1);
plot(f,abs(S)*2/n);
grid minor;
ylim([0,0.1]);
xlabel('f/Hz');
ylabel('S(f)');
title('Baseband signal');
%2ASK
s_ask = unipolar_nrz_st.*cos(2*pi*fc1*t);
S_ask = fftshift(fft(s_ask));
subplot(3,1,2);
plot(f,abs(S_ask)*2/n);
grid minor;
ylim([0,0.1]);
xlabel('f/Hz');
ylabel('S_{2ASK}(f)');
title('2ASK');
%2FSK
s_fsk = unipolar_nrz_st.*cos(2*pi*fc1*t) + (~unipolar_nrz_st).*sin(2*pi*fc2*t);
S_fsk = fftshift(fft(s_fsk));
subplot(3,1,3);
plot(f,abs(S_fsk)*2/n);
grid minor;
ylim([0,0.1]);
xlabel('f/Hz');
ylabel('S_{2FSK}(f)');
title('2FSK');
%% Bipolar non-zero signal
%Baseband
S = fftshift(fft(bipolar_nrz_st));
figure('Name','Bipolar non-zero signal','NumberTitle','off');
subplot(3,1,1);
plot(f,abs(S)*2/n);
grid minor;
xlabel('f/Hz');
ylabel('S(f)');
title('Baseband signal');
%2PSK
s_psk = bipolar_nrz_st.*cos(2*pi*fc1*t);
S_psk = fftshift(fft(s_psk));
subplot(3,1,2);
plot(f,abs(S_psk)*2/n);
grid minor;
xlabel('f/Hz');
ylabel('S_{2PSK}(f)');
title('2PSK');
%2DPSK
s_dpsk = differencial_st.*cos(2*pi*fc1*t);
S_dpsk = fftshift(fft(s_dpsk));
subplot(3,1,3);
plot(f,abs(S_dpsk)*2/n);
grid minor;
xlabel('f/Hz');
ylabel('S_{2DPSK}(f)');
title('2DPSK');
仿真结果