- 简介
- code
1 简介
MSK调制是调制指数为0.5的二元数字频率调制,具有很好的特性,如恒包络、相对窄的带宽、并可以相干检测。MSK【最小频移键控】信号在任一码元间隔内,其相位变化为Π/2,而在码元转换时刻保持相位连续。
然而,MSK信号的相位变化是折线,在码元转换时刻会产生尖角,从而使其频谱特性的旁瓣降缓慢,带外辐射相对较大。移动数字通信中采用高速传输速率时,要求邻道带外辐射低于-(60~80)dB,而MSK信号不能满足功率谱在相邻信道的取值低于主瓣峰值60dB以上的要求,所以需寻求进一步压缩带宽的方法。
为了进一步改善MSK【最小频移键控】的频谱特性,有效的办法是对基带信号进行平滑处理,使调制后的信号相位在码元转换时刻不仅连续而且变化平滑,从而达到改善频谱特性的目的。
GMSK作为MSK的改进型,即是以高斯低通滤波器作为预调滤波基带滤波器的MSK方式,所以称为高斯MSK或GMSK。
2 code【附详尽注释】
-
% 附录:MATLAB程序
-
%绘制调制波形
00101010
-
%
-
clear all;
-
close all;
-
-
%******************** Preparation part ************************************
-
% Ts=
1/
16000; %基带信号周期为
1/
16000
s,即为
16KHz
-
-
Tb=
1/
32000; %[码元]输入信号周期为Ts/
2=
1/
32000
s,即
32KHz【奈奎斯特采样】
-
BbTb=
0.
5; %取BbTb为
0.
5,调制指数为
0.
5的二元数字频率调制
-
Bb=BbTb/Tb; %3dB带宽 -
_-半带宽=码元频率一半-
_-!
-
Fc=
32000; %载波频率为
32KHz -
_-载波频率=码元频率-
_-!
-
Fc_sample=
64; %每载波采样
64个点
-
B_num=
8; %基带信号为
8个码元
-
Dt=
1/(Fc*Fc_sample); %采样间隔[载波周期/采样点数][
4.88281250000000e-
07]
-
B_sample=Tb/Dt; %每基带码元采样点数 B_sample=Tb/Dt[输入信号/采样间隔]
-
t=
0:Dt:B_num*Tb-Dt; %仿真时间离散点[采样间隔,码元数*(时间/码元)]
-
T=Dt*
length(t); %仿真时间值[采样间隔*
512个采样点]
-
Ak=[
0
0
1
0
1
0
1
0]; %产生
8个基带信号[
8个比特]
-
Ak=
2*Ak-
1; %[多此一举] %单极性码元—>双极性码元
-
gt=ones(
1,B_sample); %每码元对应的载波信号[
1*
64]
-
Akk=sigexpand(Ak,B_sample); %码元扩展[
64*
8->
1*
512]
-
temp=conv(Akk,
gt); %码元扩展[卷积向量Akk和
gt
512+
64-
1]
-
Akk=temp(
1:
length(Akk)); %码元扩展[取出temp变量中前
512个,类似于银行存款,第一年存入的钱会一直享受利息值最后一年,第二年存入的钱会一直享受利息值最后一年]
-
-
%************************* Filter initialization **************************
-
-
tt=-
2.5*Tb:Dt:
2.5*Tb-Dt; %{
2.5*码元周期}/{采样间隔=[载波周期/采样点数]}
-
%g(t)=Q[
2*pi*Bb*(t-Tb/
2)/
sqrt(
log(
2))]-Q[
2*pi*Bb*(t+Tb/
2)/
sqrt(
log(
2))];
-
%Q(t)=erfc(t/
sqrt(
2))/
2;
-
gaussf=erfc(
2*pi*Bb*(tt-Tb/
2)/
sqrt(
log(
2))/
sqrt(
2))/
2-erfc(
2*pi*Bb*(tt+Tb/
2)/
sqrt(
log(
2))/
sqrt(
2))/
2;
-
%the complementary error function erfc(X) is
defined as
-
%erfc=
2/
sqrt(pi)
int
_
{x}^{+\infty}
exp{-t^
2}dt
-
J_g=zeros(
1,
length(gaussf)); %使J_g 的长度和Gaussf的一样
-
%************************ SUM GMSK ****************************************
-
-
for i=
1:
length(gaussf) %320个点
-
if i==
1
-
J_g(i)=gaussf(i)*Dt; %若不乘以Dt,则最后结果要出错?
-
else
-
J_g(i)=J_g(i-
1)+gaussf(i)*Dt; %若不乘以Dt,则最后结果要出错?
-
end;
-
end;
-
-
J_g=J_g/
2/Tb; %若先前循环不乘以Dt,则最后结果要出错?
-
-
%******************** START CALCULATION ***********************************
-
-
%计算相位Alpha
-
Alpha=zeros(
1,
length(Akk));
-
k=
1; %计算第
1个码元的相位
-
L=
0;
-
for j=
1:B_sample %采样点数为
64
-
J_Alpha=Ak(k+
2)*J_g(j); %第
3码元对应乘以J_g矢量第j[
1-
64]个值
-
Alpha((k-
1)*B_sample+j)=pi*J_Alpha+L*pi/
2;% 刷新 Alpha512 中
1-
64
-
end;
-
-
k=
2;%计算第
2个码元的相位
-
L=
0;
-
for j=
1:B_sample%采样点数为
64
-
J_Alpha=Ak(k+
2)*J_g(j)+Ak(k+
1)*J_g(j+B_sample);%第
3码元对应乘以J_g矢量第j[
65-
128]个值
-
%第
4码元对应乘以J_g矢量第j[
1-
64]个值
-
Alpha((k-
1)*B_sample+j)=pi*J_Alpha+L*pi/
2;% 刷新 Alpha512 中
65-
128
-
end;
-
-
k=
3;%计算第
3个码元的相位
-
L=
0;
-
for j=
1:B_sample%采样点数为
64
-
J_Alpha=Ak(k+
2)*J_g(j)+Ak(k+
1)*J_g(j+B_sample)+Ak(k)*J_g(j+
2*B_sample);
-
%第
3码元对应乘以J_g矢量第j[
129-
192]个值
-
%第
4码元对应乘以J_g矢量第j[
65-
128]个值
-
%第
5码元对应乘以J_g矢量第j[
1-
64]个值
-
Alpha((k-
1)*B_sample+j)=pi*J_Alpha+L*pi/
2;% 刷新 Alpha512 中
129-
192
-
end;
-
-
k=
4;%计算第
4个码元的相位
-
L=
0;%level为
0,表示二进制相位轨迹,因而单位递增pi
-
for j=
1:B_sample%采样点数为
64
-
J_Alpha=Ak(k+
2)*J_g(j)+Ak(k+
1)*J_g(j+B_sample)+Ak(k)*J_g(j+
2*B_sample)+Ak(k-
1)*J_g(j+
3*B_sample);
-
%第
3码元对应乘以J_g矢量第j[
193-
256]个值
-
%第
4码元对应乘以J_g矢量第j[
129-
192]个值
-
%第
5码元对应乘以J_g矢量第j[
65-
128]个值
-
%第
6码元对应乘以J_g矢量第j[
1-
64]个值
-
Alpha((k-
1)*B_sample+j)=pi*J_Alpha+L*pi/
2;% 刷新 Alpha512 中
193-
256
-
end;
-
-
L=
0;%level为
0,表示二进制相位轨迹,因而单位递增pi
-
for k=
5:B_num-
2
-
if k==
5 %计算第
5个码元的相位
-
L=
0;
-
else %计算第
6个码元的相位
-
L=L+Ak(k-
3);
-
end;
-
for j=
1:B_sample%采样点数为
64
-
J_Alpha=Ak(k+
2)*J_g(j)+Ak(k+
1)*J_g(j+
1*B_sample)+Ak(k)*J_g(j+
2*B_sample)+Ak(k-
1)*J_g(j+
3*B_sample)+Ak(k-
2)*J_g(j+
4*B_sample);
-
%第
3码元对应乘以J_g矢量第j[
257-
64*
5]个值 |%第
4码元对应乘以J_g矢量第j[
64*
4+
1-
64*
5]个值|
-
%第
4码元对应乘以J_g矢量第j[
193-
64*
4]个值 |%第
5码元对应乘以J_g矢量第j[
193-
64*
4]个值 |
-
%第
5码元对应乘以J_g矢量第j[
129-
64*
3]个值 |%第
6码元对应乘以J_g矢量第j[
129-
64*
3]个值 |
-
%第
6码元对应乘以J_g矢量第j[
65-
64*
2]个值 |%第
7码元对应乘以J_g矢量第j[
65-
64*
2]个值 |
-
%第
7码元对应乘以J_g矢量第j[
1-
64*
1]个值 |%第
8码元对应乘以J_g矢量第j[
1-
64*
1]个值 |
-
Alpha((k-
1)*B_sample+j)=pi*J_Alpha+mod(L,
4)*pi/
2;% 刷新 Alpha512 中
64*
4+
1 -
64*
5
-
%相位变化+
1*pi/
2 % 刷新 Alpha512 中
64*
5+
1 -
64*
6
-
end;
-
end;
-
-
%B_num-
1;
-
k=B_num-
1;%计算第
7个码元的相位
-
L=L+Ak(k-
3); %level=
0 此时L=
1+Ak(
4)=
1-
1=
0
-
for j=
1:B_sample%采样点数为
64
-
J_Alpha=Ak(k+
1)*J_g(j+B_sample)+Ak(k)*J_g(j+
2*B_sample)+Ak(k-
1)*J_g(j+
3*B_sample)+Ak(k-
2)*J_g(j+
4*B_sample);
-
%第
5码元对应乘以J_g矢量第j[
64*
4+
1-
64*
5]个值 |
-
%第
6码元对应乘以J_g矢量第j[
64*
3+
1-
64*
4]个值 |
-
%第
7码元对应乘以J_g矢量第j[
64*
2+
1-
64*
3]个值 |
-
%第
8码元对应乘以J_g矢量第j[
64*
1+
1-
64*
2]个值 |
-
Alpha((k-
1)*B_sample+j)=pi*J_Alpha+mod(L,
4)*pi/
2;%相位变化+
0*pi/
2 刷新 Alpha512 中
64*
6+
1-
64*
7
-
end;
-
-
%B_num;
-
k=B_num;%计算第
8个码元的相位
-
L=L+Ak(k-
3);%level=
1 此时L=
0+Ak(
4)=
0+
1=
1
-
for j=
1:B_sample%采样点数为
64
-
J_Alpha=Ak(k)*J_g(j+
2*B_sample)+Ak(k-
1)*J_g(j+
3*B_sample)+Ak(k-
2)*J_g(j+
4*B_sample);
-
%第
6码元对应乘以J_g矢量第j[
64*
4+
1-
64*
5]个值 |
-
%第
7码元对应乘以J_g矢量第j[
64*
3+
1-
64*
4]个值 |
-
%第
8码元对应乘以J_g矢量第j[
64*
2+
1-
64*
3]个值 |
-
Alpha((k-
1)*B_sample+j)=pi*J_Alpha+mod(L,
4)*pi/
2;%相位变化+
1*pi/
2 刷新 Alpha512 中
64*
7+
1-
64*
8
-
end;
-
-
% 基带波形+相位波形+GMSK波形
-
x=
0;
-
subplot(
311)
-
plot(t/Tb,Akk,t/Tb,
x,
’r:’);% [t/Tb] %单极性码元—>双极性码元 Tb=
64*Dt
-
%Tb:[码元]输入信号周期为Ts/
2=
1/
32000
s,即
32KHz【奈奎斯特采样】
-
% t=
0:Dt:B_num*Tb-Dt; %仿真时间离散点[采样间隔,码元数*(时间/码元)]
-
% Dt=
1/(Fc*Fc_sample); %采样间隔[载波周期/采样点数][
4.88281250000000e-
07]
-
axis([
0
8 -
1.5
1.5]);
-
title(
’基带波形’);
-
-
subplot(
312)
-
plot(t/Tb,Alpha*
2/pi);
-
axis([
0
8 min(Alpha*
2/pi)-
1 max(Alpha*
2/pi)+
1]);
-
title(
’相位波形’);
-
-
S_Gmsk=
cos(
2*pi*Fc*t+Alpha);%载波频率+相位
-
subplot(
313)
-
plot(t/Tb,S_Gmsk,t/Tb,
x,
’r:’);
-
axis([
0
8 -
1.5
1.5]);
-
title(
’GMSK波形’);
-
-
%解调 % 延迟
1bt,移相pi/
2 GMSK波形 + 相位波形 + GMSK波形
-
for n=
1:
512; %延迟
1bt,移相pi/
2 GMSK波形
-
if n<=B_sample % n<
64
-
Alpha1(n)=
0; % Alpha 前
64 置
0
-
else
-
Alpha1(n)=Alpha(n-B_sample);%右移
64
-
end
-
end
-
a=[
0
1
1
1
1
1
1
1 ];
-
ak=sigexpand(a,B_sample); %码元扩展[
8*
64->
1*
512]
-
% Ak=[
0
0
1
0
1
0
1
0]; %产生
8个基带信号[
8个比特]
-
% Akk=sigexpand(Ak,B_sample); %码元扩展[
8*
64->
1*
512]
-
temp=conv(ak,
gt); %码元扩展[卷积向量ak和
gt
512+
64-
1]
-
ak=temp(
1:
length(ak)); %码元扩展[取出temp变量中前
512个]
-
S_Gmsk1=
cos(
2*pi*Fc*(t-Tb)+Alpha1+pi/
2).*ak; %延迟
1Tb[一个码元周期],移相pi/
2
-
figure
-
subplot(
311)
-
plot(t/Tb,S_Gmsk1);
-
axis([
0
8 -
1.5
1.5]);
-
title(
’延迟1Tb,移相pi/2 GMSK波形’);
-
-
xt=S_Gmsk1.*S_Gmsk;
-
subplot(
312)
-
plot(t/Tb,xt);
-
axis([
0
8 -
1.5
1.5]);
-
title(
’相乘后波形’);
-
-
%低通滤波
-
Fs=
10000; %采样频率【奈奎斯特准则】
-
rp=
3; rs=
50; %通带纹波不超过rp dB
-
%阻带衰减至少rs dB
-
wp=
2*pi*
50; ws=
2*pi*
800;% Passband corner frequency 通带截止频率
-
% Stopband corner frequency 阻带截止频率
-
[n,wn]=buttord(wp,ws,rp,rs,
’s’) %巴特沃斯滤波器的阶数和截止频率
-
% 这个函数返回满足性能所需通带波纹和阻带衰减条件下的最低阶N及截止频率
-
% in which case Wp
and Ws are in radians/second
-
-
% *****设计一个n阶巴特沃斯模拟低通滤波器。画出其幅度和相位响应*************
-
[z,p,k]=buttap(n); %Butterworth滤波器原型,返回零点、极点和增益
-
% H(
s) = z(
s)/p(
s) = k/( (
s-p(
1))(
s-p(
2))(
s-p(
3))…(
s-p(
1)))
-
[bp,ap]=zp2tf(z,p,k); %convert to transfer function form
-
[bs,as]=lp2lp(bp,ap,wn);
-
[b,a]=bilinear(bs,as,Fs);
-
y=filter(b,a,xt);
-
subplot(
313)
-
plot(t/Tb,
y,t/Tb,
x,
’r:’);
-
axis([
0
8 -
1.5
1.5]);
-
title(
’经过低通滤波器后波形’);
-
-
for i=
1:
8
-
if
y(i*B_sample)>
0 %
8*
64 =
512
-
bt(i)=
1
-
else
-
bt(i)=
0
-
end
-
end
-
bt=
2*bt-
1; %解调,反向解码
-
btt=sigexpand(bt,B_sample); %码元扩展
-
temp1=conv(btt,
gt); %码元扩展
-
btt=temp1(
1:
length(btt)); %码元扩展
-
figure
-
subplot(
311)
-
plot(bt)
-
title(
’抽样值’);
-
axis([
0
8 -
1.5
1.5]);
-
subplot(
312)
-
plot(t/Tb,Akk,t/Tb,
x,
’r:’);
-
axis([
0
8 -
1.5
1.5]);
-
title(
’原基带波形’);
-
subplot(
313)
-
plot(t/Tb,btt,t/Tb,
x,
’r:’);
-
axis([
0
8 -
1.5
1.5]);
-
title(
’解调后波形’);
-
title(
’抽样值’);
-
axis([
0
8 -
1.5
1.5]);
-
subplot(
312)
-
plot(t/Tb,Akk,t/Tb,x,
’r:’);
-
axis([
0
8 -
1.5
1.5]);
-
title(
’原基带波形’);
-
subplot(
313)
-
plot(t/Tb,btt,t/Tb,x,
’r:’);
-
axis([
0
8 -
1.5
1.5]);
-
title(
’解调后波形’);
转载自https://blog.csdn.net/u013346007/article/details/62917617