热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数字调制解调—MSK

数字调制解调—MSK1MSK时域特征2MSK产生方法3MSK调制仿真4MSK解调仿真1MSK时域特征  二进制最小频移键控(MinimumShiftKeying,MSK)信号的表示

数字调制解调—MSK

  • 1 MSK时域特征
  • 2 MSK产生方法
  • 3 MSK调制仿真
  • 4 MSK解调仿真
1 MSK时域特征

  二进制最小频移键控(Minimum Shift Keying , MSK)信号的表示式可写为:

S S S
MSK
( t ) = c o s ( w (t)=cos(w (t)=cos(w
c
t + π 2 T a t+\frac{π}{2T}a t+2Tπa
k
t + t+ t+φ
k
) ) )

  式中,wc是载波频率,T是码元宽度,ak是第k个码元的数据(取值为±1),φk是第k个码元中的相位常数,他在kT≤t≤(k+1)T中保持不变。

  当ak从+1变化到-1,传信频率从f1变化到f2,角频率Δw= π T \frac{π}{T} Tπ,由w=2πf,则Δf= 1 2 T \frac{1}{2T} 2T1,调制指数h=Δf·T=0.5.

  MSK其实就是一种FSK,只是传信频率f1和f2在一个码元周期内严格保证相位差180°,这是因为Δθ=Δw·T=2πΔf·T。

  根据SMSK(t)的表达式,将其拆开可得:

S S S
MSK
( t ) = c o s φ (t)=cosφ (t)=cosφ
k
c o s ( π t / 2 T ) c o s w cos(πt/2T)cosw cos(πt/2T)cosw
c
t − a t-a ta
k
c o s ( φ cos(φ cos(φ
k
) s i n ( π t / 2 T ) s i n w )sin(πt/2T)sinw )sin(πt/2T)sinw
c
t t t

  上式即为MSK的正交表示形式,设I支路和Q支路分别为xI(t)和xQ(t)。

x x x
I
( t ) = c o s φ (t)=cosφ (t)=cosφ
k
c o s ( π t / 2 T ) c o s w cos(πt/2T)cosw cos(πt/2T)cosw
c
t t t

  
x x x
Q
( t ) = a (t)=a (t)=a
k
c o s ( φ cos(φ cos(φ
k
) s i n ( π t / 2 T ) s i n w )sin(πt/2T)sinw )sin(πt/2T)sinw
c
t t t

  令I=cosφk,Q=akcosφk,显然I、Q、ak之间存在某种转化关系,通常以差分编码的形式对ak进行处理,奇数元素给I支路,偶数元素给Q支路,这样上下支路便错开了一个码元周期T,满足传信频率要求的相位差。

2 MSK产生方法
  1. 对输入数据序列进行差分编码。
  2. 把差分编码器输出数据用串并转换器分成两路,并且相互交错一个码元宽度T。
  3. 用加权函数cos( π t 2 T \frac{πt}{2T} 2Tπt)和sin( π t 2 T \frac{πt}{2T} 2Tπt)分别对两路数据进行加权。
  4. 用两路加权后的数据分别对正交载波coswct和sinwct进行调制
  5. 将两路输出信号进行叠加
3 MSK调制仿真

ps=1*10^6; %码速率为1MHz
Fs=16*10^6; %采样速率为16MHz
fc=3*10^6; %载波频率为3MHz
N=100; %数据码元个数
Len=N*Fs/ps; %仿真数据的长度
x = randint(N,1,2)'; % 产生随机数据做为数据码元
%x=ones(1,N);
dx=ones(1,N);
for i=1:N
if x(i)==0
x(i)=-1;
end
end
%求原码的相对码dx
for i=2:N
if x(i)==1
dx(i)=-dx(i-1);
else
dx(i)=dx(i-1);
end
end
%将相对码按奇偶序号分成两路数据,形成Ik\Qk
di=ones(1,N);
dq=ones(1,N);
%取dx的偶数位,并列两位为di
for i=2:2:N
di(i:i+1)=dx(i);
end
%取dx的奇数位,并列两位为dq
for i=1:2:N-1
dq(i:i+1)=dx(i);
end
%对原始BIT数据进行Fs/ps倍重采样
udi=ones(1,N*Fs/ps);
udq=ones(1,N*Fs/ps);
for i=1:N
udi(Fs/ps*(i-1)+1:Fs/ps*i)=di(i);
udq(Fs/ps*(i-1)+1:Fs/ps*i)=dq(i);
end
%产生MSK信号所需的载波信号
t=0:1/Fs:(Len-1)/Fs;
cf0c=cos(2*pi*fc.*t);
sf0c=sin(2*pi*fc.*t);
cfps=cos(pi*ps/2.*t);
sfps=sin(pi*ps/2.*t);
%正交调制法产生msk信号
msk=udi.*cfps.*cf0c-udq.*sfps.*sf0c;
%绘制MSK信号的频谱及时域波形
figure(2);
%求MSK信号的FFT变换
m_msk=20*log10(abs(fft(msk,2048)));
m_msk=m_msk-max(m_msk);
%设置幅频响应的横坐标单位为MHz
x_f=1:length(m_msk);
x_f=x_f*Fs/length(m_msk)/10^6;
%绘制MSK信号的频谱
subplot(211);
plot(x_f,m_msk);axis([0 Fs/2/10^6 -80 0]);
legend('MSK信号频谱');
xlabel('频率(MHz)');ylabel('幅度(dB)');grid on;
%绘制MSK信号的时域波形
subplot(212);
%设置横坐标单位为us
LT=100;
x_t=0:1/Fs:(LT-1)/Fs;
x_t=x_t*10^6;
plot(x_t,msk(100:100+LT-1))
legend('MSK信号时域波形');
xlabel('时间(us)');ylabel('幅度(V)');

  仿真结果如图所示:
《数字调制解调—MSK》
  可以看出,0dB点大约在3MHz处,正是载波频率。

4 MSK解调仿真

  本文采用平方环载波提取的MSK相干解调。已知MSK调制指数h=0.5,经过平方后,即频域相加,角频偏为0.5+0.5=1,故调制指数h=1。另一方面,MSK也属于CPFSK,而调制指数为1的CPFSK功率谱中存在离散分量,分别为二倍传号频率fH和fL。因此,可以用两个锁相环电路分别提取处这两个频率。根据MSK信号特征,可以得到载波fc和时钟fR与两个离散频率分量之间的关系为:

《数字调制解调—MSK》

  在电路中将两个锁相环锁定的2fH和2fL两个信号相乘,可得到差频分量,然后用低通滤波提取出来,就可得到时钟频率fR信号,它经脉冲形成后得到所需的时钟脉冲,再由此产生各种定时信号。

  将二分频后的fH和fL相乘,并经过低通滤波可获得fR/2,其速率与正交两路的速率相同,可用于正交两路数据的判决,信号如下:
   S S S1 ( t ) = c o s ( 2 π f (t)=cos(2πf (t)=cos(2πfH t ) = c o s ( 2 π f t)=cos(2πf t)=cos(2πfc t + π t / 2 T ) t+πt/2T) t+πt/2T)
   S S S2 ( t ) = c o s ( 2 π f (t)=cos(2πf (t)=cos(2πfL t ) = c o s ( 2 π f t)=cos(2πf t)=cos(2πfc t − π t / 2 T ) t-πt/2T) tπt/2T)

  具体代码如下

%MSK 解调
%第一种相干解调,需要同时获取fc,fb的载波频率
% demod_i=msk.*cf0c.*cfps;
% demod_q=msk.*sf0c.*sfps;
%平方环相干解调,只需获取fL、fH的载波频率
fL=cos(2*pi*fc.*t-2*pi*ps/4.*t);
fH=cos(2*pi*fc.*t+2*pi*ps/4.*t);
demod_i=msk.*(fH+fL);
demod_q=msk.*(fH-fL);
%低通滤波后,获取I、Q支路基带波形
b=fir1(30,0.5*ps*2/Fs);%设计低通滤波器
f_i=filter(b,1,demod_i);
f_q=filter(b,1,demod_q);
fb=fL.*fH;
rb=filter(b,1,fb);
%绘制解后的I、Q支路基带波形及时钟信号波形
figure(1);
num=800;
x_t=0:1/Fs:(num-1)/Fs;
x_t=x_t*10^6;
subplot(411);plot(x_t,udi(1:num));axis([0 25 -1.2 1.2]);
legend('I支路原始数据时域波形');
xlabel('时间(us)');ylabel('幅度(V)');
subplot(412);plot(x_t,f_i(1:num),'-',x_t,rb(1:num),'--');
legend('I支路解调数据','时钟信号');
xlabel('时间(us)');ylabel('幅度(V)');
subplot(413);plot(x_t,udq(1:num));axis([0 25 -1.2 1.2]);
legend('Q支路原始数据时域波形');
xlabel('时间(us)');ylabel('幅度(V)');
subplot(414);plot(x_t,f_q(1:num),'-',x_t,rb(1:num),'--');
legend('Q支路解调数据','时钟信号');
xlabel('时间(us)');ylabel('幅度(V)');

  仿真结果如图所示:

《数字调制解调—MSK》

  从图中可以看出,对于I支路而言,1/2倍码速率时钟信号与解调后的I支路完全同步,最佳判决时刻为时钟波峰处;对于Q支路而言,1/2倍码速率时钟信号与解调后的Q支路数据完全正交,最佳判决时刻在时钟波谷处。


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了如何在Jquery中通过元素的样式值获取元素,并将其赋值给一个变量。提供了5种解决方案供参考。 ... [详细]
  • 本文介绍了Python字典视图对象的示例和用法。通过对示例代码的解释,展示了字典视图对象的基本操作和特点。字典视图对象可以通过迭代或转换为列表来获取字典的键或值。同时,字典视图对象也是动态的,可以反映字典的变化。通过学习字典视图对象的用法,可以更好地理解和处理字典数据。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • plt python 画直线_机器学习干货,一步一步通过Python实现梯度下降的学习
    GradientDescent-梯度下降梯度下降法(英语:Gradientdescent)是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找 ... [详细]
author-avatar
野蛮生长
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有