近在做MSK的正交调制解调仿真,有一些心得体会,也踩了一些坑,再次记录一下。
我的目标是,自己写一个正交调制解调,其性能和matlab自带的mskmod和mskdemod函数性能相近,功能相同,输出相同。
一、 mskmod函数初探
发现了一些mskmod函数的一些秘密,在此记录一下
mskmod - Minimum shift keying modulation
This MATLAB function outputs the complex envelope y of the modulation of the
message signal x using differentially encoded minimum shift keying (MSK)
modulation.y = mskmod(x,nsamp) y = mskmod(x,nsamp,dataenc) y = mskmod(x,nsamp,dataenc,ini_phase) [y,phaseout] = mskmod(...)
从help mskmod函数我们可以得到mskmod函数的使用方法
1. 基础用法
最基础的是直接输入需要调制的信息序列和输入上采样倍数
信息序列:输入需要是01序列,不能是+1/-1这种
上采样:即一个波形采样多少个点,比如一个波形时间为1s,采样率为100Hz,那么上采样倍数就是100,如果一个波形时间为2s,采样率为100Hz,上采样倍数就是50
在实际的仿真代码中,我是这样设置的:
R = 1e1; % The bit speed
Fc = 1e1; % The carrier frequency
Fs = 1e2; % the sample frequency
Ts = 1/Fs;
Upsample = Fs/R;
2.编码
mskmod函数第三个参数是是否做数据差分编码,默认情况下,mskmod是’diff’方式进行调制,也就是默认情况下,mskmod函数认为你的输入是已经经过差分编码的
’nondiff’ 表示输入的数据是未经差分编码
’diff’ 表示输入的数据是经过差分编码的
但是要注意,这里有一个大坑!!!!
起初我认为,我在mskmod函数里输入diff,是让mskmod函数帮我做一个差分编码,但是仿真结果总是出错,后来我扣了扣mskmod代码注解的字眼
dataenc can be either ‘diff’ for differentially encoded MSK or ‘nondiff’ for nondifferentially encoded MSK.
这里他用的encoded,意思是已经编码过的,非常坑!!
言归正传,由于msk有相位模糊的问题,因此一般是加上差分编码,这里附上差分编码的代码:
% msk差分编码
b0=1;
for i=1:N
encode_output(i)=b0*bitstream(i);%对应bk
b0=bitstream(i);
end
这里也有一个误区,有两种常见的差分编码形式,需要好好区分,用对才可以