【MATLAB函数系列】fskmod函数参数及源代码详解

关注回复【fskmod】可看

在这里插入图片描述
在用matlab仿真生成fsk信号时,发现matlab库提供fskmod函数可以直接生成fsk信号,但生成的信号为复信号,于是查看其源码,结果对其原理看了好久都没明白,在网上查询资料也少得可怜,唯一有一篇也是对其中部分代码进行解释,且觉得该原函数提供的方法无法理解,然后文章作者最后进行了改动,得到了他想要的结果(笔者没仔细看,而是主要研究matlab库源码),且只是对参数和部分英文帮助进行了说明,并没有解释核心源码的含义。经过查阅相关资料后,笔者终于明白了其调制原理,现分享如下。

函数原型中重要代码如下:

function y = fskmod(x,M,freq_sep,nSamp,varargin)
  • x:输入信号01比特
  • M:调制进制数,比如2fsk调制M=2,4fsk调制M=4
  • freq_sep:Δf=|f1-f2|,即相邻频率间隔
  • nSamp:nSamp=Fs/RB,即每符号的采样点数
  • varargin:可变参数,第一个为Fs,第二个为phase_cont

核心源码解释:

if (nargin >= 6)phase_type = varargin{2};%check the phase_type stringif ~( strcmpi(phase_type,'cont') ||  strcmpi(phase_type,'discont') )error(message('comm:fskmod:phaseCont'));end
elsephase_type = 'cont';
endif (strcmpi(phase_type, 'cont'))phase_cont = 1;
elsephase_cont = 0;
end

FSK调制分为相位不连续和相位连续2种方式,不指定默认的话是相位连续调制。这几句主要使判断Fs后是否还有参数,如果有(也就是>=6),那么判断字符串是’cont’还是’discont’,从而给变量phase_cont赋值为1(连续)或0(不连续)。

[nRows, nChan] = size(x);

获取输入数据的总数,即行数和列数,因此可以是2路或多路信号比特输入。

phaseIncr = (0:nSamp-1)' * (-(M-1):2:(M-1)) * 2*pi * freq_sep/2 * samptime;

在刚看到这一句时,完全想不明白这句是如何来的,更不清楚这句代码的目的是什么。通过查资料,先来看看FSK信号调制的原理。

以2FSK调制为例,信号表达式为

S(t)=m1(t)Acos⁡(2πf1t+φ1)+m2(t)Acos⁡(2πf2t+φ2)S(t)={{m}_{1}}(t)A\cos (2\pi {{f}_{1}}t+{{\varphi }_{1}})+{{m}_{2}}(t)A\cos (2\pi {{f}_{2}}t+{{\varphi }_{2}})S(t)=m1(t)Acos(2πf1t+φ1)+m2(t)Acos(2πf2t+φ2)

式中,m1(t)=∑n=−∞∞bng(t−nTb){{m}_{1}}(t)=\sum\limits_{n=-\infty }^{\infty }{{{b}_{n}}g(t-n{{T}_{b}})}m1(t)=n=bng(tnTb)

m2(t)=∑n=−∞∞bn‾g(t−nTb){{m}_{2}}(t)=\sum\limits_{n=-\infty }^{\infty }{\overline{{{b}_{n}}}g(t-n{{T}_{b}})}m2(t)=n=bng(tnTb)

实际上,在理想情况下,载波振荡的频率是随基带信号线性变化的,此时,调频信号可表示为

s(t)=Acos⁡[2πfct+πΔf∫∞tm′(t)dt′+θc]s(t)=A\cos [2\pi {{f}_{c}}t+\pi \Delta f\int_{\infty }^{t}{{m}'(t)}d{t}'+{{\theta }_{c}}]s(t)=Acos[2πfct+πΔftm(t)dt+θc]

其中, fcf_cfc是未调载波频率,θcθ_cθc是载波的初始相位,Δf\Delta fΔf是相邻频率间隔。

频率调制是用调制信息去控制载波的频率,由于瞬时相位是瞬时频率的积分,在上式中具体体现就是生成一个瞬时相偏πΔf∫∞tm′(t)dt′\pi \Delta f\int_{\infty }^{t}{{m}'(t)}d{t}'πΔftm(t)dt,对其数字化即可变为

pi∗(0:nSamp−1)′∗(−1,+1)∗Δf/Fspi*(0:nSamp-1)'*(-1, +1)* Δf/Fspi(0:nSamp1)(1,+1)Δf/Fs

因此这一句就是初始化一个码元符号内每个采样点信号相位的变化量(正1增加,负1减少)。

phIncrSym = phaseIncr(end,:);

phIncrSym就表示在一个码元结束时相位的总变化量

phIncrSamp = phaseIncr(2,:);

phIncrSamp表示相邻采样点之间的相位变化量

Phase = zeros(nSamp*nRows, nChan);

其中nChan表示输入信号路数,一般情况都是1路。输入信号总码元数为nRowsnChan,所以最后生成的相位总数为每符号的采样点码元总数,即nSampnRowsnChan,该句就是初始化一个变量用来存储最后的相位。主要分为2种情况:

一、相位不连续,此时又可分为2种情况。

(1) 当一个码元持续时间相偏总量πΔf∫∞tm′(t)dt′\pi \Delta f\int_{\infty }^{t}{{m}'(t)}d{t}'πΔftm(t)dt为2π的整数倍即

if ( (~phase_cont) &&( floor(nSamp*freq_sep/2 * samptime) == nSamp*freq_sep/2 * samptime ) )

此时由于相位变化是周期性的,可以直接用以下2句代码生成调制信号的相位y。

exp_phaseIncr = exp(1i*phaseIncr);
y = reshape(exp_phaseIncr(:,x+1),nRows*nSamp,nChan);

(2) 当一个码元持续时间相偏总量πΔf∫∞tm′(t)dt′\pi \Delta f\int_{\infty }^{t}{{m}'(t)}d{t}'πΔftm(t)dt不是2π的整数倍时,当前符号的初始相位是:(前一符号最后采样点相位+每采样点相位变化量)mod 2π,即

OscPhase = zeros(nChan, M);

OscPhase是针对这种情况设置的变量,存放下一符号开始时(第1个采样点)的相位,初始化为0。

OscPhase(iChan,:) = rem(OscPhase(iChan,:) + phIncrSym + phIncrSamp, 2*pi);
ph1 = OscPhase(iChan, x(iSym,iChan)+1);

其中ph1中存放的就是当前符号开始时的相位。

二、相位连续

相位连续时,当前符号开始时(第1个采样点)的相位时:前一符号最后采样点相位+每采样点相位变化量,与相位不连续相比,此处少了模2π运算,即

prevPhase = Phase(nSamp*iSym,iChan) + phIncrSamp(x(iSym,iChan)+1);
ph1 = prevPhase;

综上所述,最后再用统一的方法计算每个采样点的相位

Phase(nSamp*(iSym-1)+1:nSamp*iSym,iChan) = ph1*ones(nSamp,1)+ phaseIncr(:,x(iSym,iChan)+1);

最后,再生成FSK调制信号的正交基带数据

y = exp(1i*Phase);

以上就是整个fskmod函数的关键核心代码解读,得到调制的基带数据之后,再将基带信号数据正交上变频至中频,即乘以 即可。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java数字黑洞给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字

题目描述: 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之…

Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法

LDAP身份验证是全球范围内最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft针对Windows的LDAP实现)是另一种广泛使用的LDAP服务器。 在许多项目中,我们需要通过登录屏幕中提供的凭据使用LDAP对活动目录进行身…

C语言文件读写操作之换行符处理

getc,fgetc: -1代表结束符,不但能接收键盘输入的内容,也能从文件中读取一个字符; getchar() 等价于 getc(stdin); putc,fputc: putchar© 等价于 putc(c,stdout); 文件操作 t模式 与 b模式: windo…

Java月饼月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需 求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一

题目描述: 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。 注意:销售时允许取出一部分库存。样例给出…

【各种信噪比联系与区别详解】实信号、复信号Es、N0、符号信噪比EsN0、带内信噪比、比特信噪比EbN0、SNR的含义及关系详解

引言 关于EsN0、EbN0与SNR三者关系的描述,在MATLAB帮助文档中搜索词条“AWGN Channel”有比较详细的描述,但有些细节没有讲清楚。 简单翻译解释一下,就是 SNR表示每个采样点的信号噪声比。EbN0表示每个比特能量与噪声功率谱密度的比值。EsN0表示每个符号能量与噪声功率谱密…

非科班Java尝试全国高校计算机能力挑战赛第三届计挑赛

写在前面:①大佬勿在意,小打小闹!②若不决参加与否,希望下文可以给你帮助(仅限程序设计赛项)。 文章目录一、个人真实情况二、比赛最细简介三、最全参赛准备四、比赛时候遇到不会做怎么办?一、个…

加密数据的检索_透明地持久保存并从数据库中检索加密的数据

加密数据的检索自从我在这里发表上一个帖子以来已经有两个多月了,但是今年六月和七月非常忙碌而密集。 首先, Confitura的组织(欧洲最大的Java开发人员免费会议)参加了我所有的免费晚会,然后在相当紧张的住院期间&…

微信小程序云开发日记类日记记录分享动态

微信公众号:创享日记(微信号csds992022) 发送关键词:日记类小程序 免费获取源码 1 概述 1.1 关于本手册 为了使您对研岸日记记录社交软件的使用有清晰详尽的了解,特此编写《用户手册》,为了保障您的利益&a…

使用Arquillian(远程)测试OpenLiberty

听到许多好评后,我想我会尝试一下Open Liberty 。 在这篇文章中,我将讨论以下内容: 开放自由的设置 设置JDBC连接 设置Arquillian 测试REST端点 安装开放自由 在撰写本文时,我正在使用Open Liberty 18.0.0.1,并且…

Windows编程初步(三)【说明:有敏感字眼已全删,不知道为啥还审核不通过】

第三节 设计输出及利用在线帮助 在Windows中,消息ON_PAINT是专门用来处理输出的。基本所有的输出代码应放在这里。 。其输出方式不再限于从上往下,而是全屏可控,因此每个输出都需要告知系统输出位置。典型的文字输出代码是TextOut函数。 将…

第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码

【问题描述】 你有一架天平和 N个砝码,这N个砝码重量依次是W1, W2, …, Wn。 请你计算一共可以称出多少种不同的重量?注意砝码可以放在天平两边。 【输入格式】 输入的第一行包含一个整数N。 第二行包含N个整数: W1, W2, W3, … Wn。 【输出格式】 输出…

【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导

关注公号【逆向通信猿】,口令:OM算法 信号模型 接收到的信号(PAM)或等效的低通信号(QAM,PSK)可以写为 r ( t ) = ∑ n = − ∞ ∞ a n g T (

408考研数据结构复习-时间复杂度与空间复杂度-附统考真题

文章目录一、时间复杂度二、空间复杂度三、相关题目一、时间复杂度 一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。算法中基本运算(最深…

解调去载波后均衡信道与实际信道的关系

关注公号【逆向通信猿】更精彩!!! 通常,信号经过调制后发送,会经过信道作用,示意图可以表示为 其中 x ( t ) x(t) x(t)为基带信号, e

第十二届蓝桥杯省赛A组试题:左儿子右兄弟Java

【问题描述】 对于一棵多叉树,我们可以通过 “左孩子右兄弟” 表示法,将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。换句话说,每个结点可以选任意子结点作为左孩子,并按任…

activiti脚本任务_Activiti中的高级脚本:自定义配置注入

activiti脚本任务脚本任务可能是Activiti代码库中“最古老的”类之一,但是我认为它仍然未被许多人使用。 (感知到的)缺点当然是性能(解释还是编译),并且从IDE角度来看支持较少。 但是,好处&…

【锁相环系列3】QPSK+基带+Costas锁相环载波同步(重点环路滤波器参数设置和迭代核心代码详解)

引言 假设在QPSK信号解调中,完成匹配滤波、定时抽样后的星座如下所示 而画出基带信号部分点的星座图如下所示 由以上两幅图可以看出,基带信号中还存在微小的频偏,导致星座图旋转,而这种微小的频偏很难通过FFT估计出来,由此想到了用锁相环解决,锁相环锁定后的星座如下 …

第十二届蓝桥杯Java省赛A组试题:异或数列

【题目描述】 初始时,Alice和Bob分别有一个整数a和b,有一个给定的长度为n的数列。a和b的初始值均为0。Alice和Bob轮流操作,Alice先手,每步可以从两个选项中选一种: 选项1:从数列中选一个X;给Alice的数异或上…

自动化学科前沿讲座分享,作业,自动化与人工智能

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击跳转人工智能学习资料) 现在我们都在讲智能制造,而实现智能制造,需要有传统制造的部…

线性移位寄存器序列(m序列)之MATLAB实现

移位寄存器的结构 nnn级线性移位寄存器的结构如下图 当生成多项式g(x)g(x)g(x)为本原多项式时,产生的序列为m序列。例如 g(x)x5x21g(x)x^5x^21g(x)x5x21的本原多项式,初态为10000的5级m序列,其周期为25−1312^5-13125−131,结构如…