MATLAB函数详解系列一、qammod与qamdemode函数.

目录

正文开始前的一些絮叨

一、qammod函数详解

二、不用qammod函数来写出代码

三、qamdemod的函数详解

四、不用qamdemod函数的代码实现


正文开始前的一些絮叨

本文是不使用任何matlab自带函数的方法来实现4QAM,以及更高阶MQAM的调制的调理,不使用MATLAB的qammod和qamdemod函数。

写这篇文章的原因是我在面试通信物理层算法岗的时候,说我自己做了整个OFDM模块,面试官很吃惊,表示我全都是自己写的吗?我说是的,之后我才明白他的意思是不套用网上存在的任何代码,只按照公式或者算法来写代码。这个我承认我真做不到。一般我们做科研,是在csdn或者pudn上下载别人的代码,根据代码不断地去改参数,改模块,从而写代码的。

面试官语重心长的跟我饿即使原因(此处划重点):算法研究人员应该做到不依赖库里的函数,自己去写物理层的代码。我想了想,是呀一般做物理层都是用C++,不可能会像matlab一下子有个berawgn或者pskmod函数调用的,于是这三天的时间内,我单独去学习了下QAM调制,并且想办法不依赖任何matlab函数,并用matlab自带的这些函数进行验证我写的算法是否正确。

一、qammod函数详解

我直接给出qammod函数的代码用法和结论

M=4;%M是高阶调制的阶数 M=4就是 4QAM M=64就是64QAM
A=[0 1 2 3 ];
qammod(A,M);

 这里发现MATLAB输出结果为

我直接先告诉大家结论,matlab的qammod函数输出结果是已经经过格雷码调制的,所以大家使用的时候不需要再转换为格雷了!

为什么这么说呢,我们直接画出这四个点的图,其中A矩阵的0 1 2 3二进制结果分别代表是'00','01','10','11'。 很明显的看出每个星座只相差一个1,16QAM大家可以自己去验证。

二、不用qammod函数来写出代码

这个我们就需要两个步骤了,我们以4QAM为例,

1.首先生成二进制码 A=[0 1 2 3];

2.进行格雷码转换 Gray_A=[0 1 3 2]; %这步其实也就是格雷码编码规则

M=4;
A=[0 1 2 3];
Gray_A=[0 1 3 2];%转化规则的代码我就不放出来了网上都有
sqrt(2)*exp(j*(2*pi/M*Gray_A+pi/4)) %

运行之后的结果如下, 

大家发现其实这个公式的结果与qammod函数的结果相差了 一个pi/2的相位,原因就是qammod的00是从-1+i 开始的,而我们的函数的00位置是从1+i开始的。但是它们都属于格雷码只不过是位置不同而已。符合格雷码要求相隔的码只相差一个比特。

三、qamdemod的函数详解

四、不用qamdemod函数的代码实现

第三四部分涉及到LLR进行硬判决,计算高阶QAM的LLR比较复杂,以后有时间在更新

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MATLAB 函数 `qammod` 的源代码如下: ```matlab function y = qammod(x,M,varargin) %QAMMOD Quadrature Amplitude Modulation modulation. % Y = QAMMOD(X,M) outputs the complex envelope Y of the modulation of % the message signal X using quadrature amplitude modulation. M is the % modulation order and must be an integer power of 2. If X is a matrix, % the function treats each column as a separate channel. % % Y = QAMMOD(X,M,S) uses constellation mapping specified by S. S must % be a complex column vector with M elements. The elements in S must be % unique and have unit magnitude. The default constellation mapping for % QAM is Gray-coded. % % Y = QAMMOD(X,M,S,SYMORDER) specifies the symbol order. The default % symbol order is 'gray'. Other options include 'bin' and 'sym'. % % % Example: % % Modulate a random signal using 16-QAM % % data = randi([0 3],100,1); % Random data stream % modSignal = qammod(data,16); % 16-QAM modulated signal % scatterplot(modSignal); % Plot constellation diagram % % See also QAMDEMOD, MODULATE, DEMODULATE, PAMMOD, PSKMOD, FSKMOD. % Copyright 2001-2019 The MathWorks, Inc. % References: % [1] Simon, M. K. and Alouini, M.-S., Digital Communication over % Fading Channels, 2nd Ed., Wiley, 2005. % [2] Proakis, J. G., Digital Communications, 3rd Ed., McGraw-Hill, 1995. narginchk(2, 4); validateattributes(x,{'double','single'},{'column','finite'},'','X'); validateattributes(M,{'numeric'},{'integer','scalar','positive'},'','M'); % Default symbol mapping is Gray-coded defaultConstellation = qammod([],M,'gray'); if nargin > 2 validateattributes(varargin{1},{'double','single'},{'column','finite','nonnan','nonempty'},'','S'); if numel(varargin) > 1 symOrder = varargin{2}; else symOrder = 'gray'; end constellation = varargin{1}; else constellation = defaultConstellation; symOrder = 'gray'; end if nargin > 3 validateattributes(symOrder,{'char'},{'nonempty'},'','SYMORDER'); symOrder = validatestring(symOrder,{'bin','gray','sym'},'','SYMORDER'); end % Validate inputs if ~isreal(constellation) error(message('comm:qammod:InvalidConstellation')); end validateattributes(constellation,{'double','single'},{'column','finite','nonnan','nonempty'},'','S'); validatestring(symOrder,{'bin','gray','sym'},'','SYMORDER'); % Calculate number of bits per symbol k = log2(M); % Validate input if mod(length(x), k) ~= 0 error(message('comm:qammod:InvalidInputLength', k)); end % Modulate using index mapping if strcmp(symOrder,'bin') || strcmp(symOrder,'sym') if strcmp(symOrder,'bin') x = bi2de(x,'left-msb'); end xMsg = de2bi(x,k,'left-msb'); xMsg = reshape(xMsg.',[],1); xIndex = bi2de(xMsg,'left-msb') + 1; % Convert to decimal index else % Gray coding xMsg = reshape(x,k,[]); xGray = sum(xMsg .* repmat(2.^(k-1:-1:0)',1,size(xMsg,2)),1); % Convert to decimal index xIndex = gray2bin(xGray,'qam',M) + 1; end % Map the message to a point in the constellation y = constellation(xIndex); end ``` 该函数实现了各种 QAM 调制方式,包括二进制、格雷码和符号映射。你可以根据自己的需求进行调用和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科研Beatles

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值