MATLAB中的MFSK(多级频移键控)

时间:2017-03-03 04:43:24

标签: matlab wireless

我将首先指出这是一项家庭作业。我不是要求任何人为我做任务,我会证明我一直在这里工作,但我遇到了一个我似乎无法弄清楚的问题。我是MATLAB的新手,所以这可能与我的一些问题有关。

我正在尝试使用MATLAB对给定的数据集执行MFSK。我在尝试计算实际信号时遇到了问题。当我试图找到arccos()时,我得到了奇怪的结果(包括看似虚构的数字),我无法绘制。我将在我的代码之后提供这些结果。

我收到以下数据:

  

10 01 01 01 10 10 01 11

我要用

创建四个(M = 4)信号
  

fc = 5 KHz且fd = 500 Hz。

要创建四个(M = 4)信号,我将使用公式7.3,可以在这里看到:

Equation 7.3

最后,我将对表示两位模式的FSK信号进行采样并绘制样本。假设每个符号的时间段为1 ms。

到目前为止我做了什么:基于公式7.3我初始化了fc,fd和M.我从1到4(包括)循环并计算fi。这导致四个值:3500,4500,5500,6500。根据我的理解,'00'应对应于3500,'01'到4500,'10'到5500和'11'到6500。

使用这些值,我现在可以将它们应用于公式7.3。我循环通过FSK信号(mfsk),对于每个两位样本,我运行公式7.3。这是Acos(2 * pi * fi * t)等式。根据我的理解,如果当前样本为'01',我会使用4500,例如。

这种方法给了我奇怪的结果,我不明白。

我的代码如下:

mfsk = {'10', '01', '01', '01', '10', '10', '01', '11'};

fc = 5000;
fd = 500;
M = 4;

fi = [];

%Equation 7.3 used to create 4 M=4 signals
%fi(1) = '00', %fi(2) = '01', %fi(3) = '10', %fi(4) = '11'
for i = 1:4
    fi = [fi, fc + ((2 * i) - 1 - M) * fd];
end

mfskSample = [];

for t = 1:8
    if char(mfsk(t)) == '00'
        mfskSample = [mfskSample, acosd(2 * pi * fi(1) * t)];
    elseif char(mfsk(t)) == '01'
        mfskSample = [mfskSample, acosd(2 * pi * fi(2) * t)];
    elseif char(mfsk(t)) == '10'
        mfskSample = [mfskSample, acosd(2 * pi * fi(3) * t)];
    else
        mfskSample = [mfskSample, acosd(2 * pi * fi(4) * t)];
    end
end

结果:

  

mfskSample =

     

1.0e + 02 *

     

第1至6栏

     

0.0000 + 6.3848i 0.0000 + 6.6669i 0.0000 + 6.8993i 0.0000 + 7.0641i 0.0000 + 7.3069i 0.0000 + 7.4114i

     

第7至8栏

     

0.0000 + 7.3847i 0.0000 + 7.6719i

感谢任何帮助,感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您的计划存在两个主要问题。

  1. Matlab中的余弦函数是cos而不是acosd。但我相信你试图输入书中提到的幅度。
  2. 考虑奈奎斯特采样定理。载波频率为5k Hz,因此评估信号si(t)的最大时间间隔为0.2 ms。这将确保您可以看到载体的完整正弦波。但是,为了观察mfsk代码,还必须确保每个mfsk位持续足够的时间;在我的情况下,为了在视觉上观察它,我将比特长度设置为调制(差异)频率的几个完整周期。因此,在单个mfsk位的时间内,将存在若干调制信号周期和数百个载波信号。
  3. 以下是一些可满足您需求的代码....

    mfsk = {'10', '01', '01', '01', '10', '10', '01', '11'};
    nfsk = length(mfsk); % length of mfsk string
    
    fc = 5000;
    fd = 500;
    M = 4;
    
    %Equation 7.3 used to create 4 M=4 signals
    %fi(1) = '00', %fi(2) = '01', %fi(3) = '10', %fi(4) = '11'
    fi = fc + ((2 * (1:M) ) - 1 - M) * fd;
    
    tbit = 5e-3; % time per fsk bit [seconds]
    nbit = tbit*fc*5; % # data points in one fsk bit, including Nyquist factor
    
    tSample = linspace(0,nfsk*tbit, 1+nfsk*nbit);
    % find frequency fi for every time points
    freqSample = 0*tSample;
    for nn = 1:nfsk
        nCurrentBit = (1+(nn-1)*nbit) : (nn*nbit);
        switch char(mfsk(nn))
            case '00'
                fCurrentBit = fi(1);
            case '01'
                fCurrentBit = fi(2);
            case '10'
                fCurrentBit = fi(3);
            case '11'
                fCurrentBit = fi(4);
            otherwise % wrong mfsk code
                fCurrentBit = 0;
        end
        freqSample(nCurrentBit) = fCurrentBit;
    end
    freqSample(end) = freqSample(end-1);
    
    % evaluate carrier signal on each time point
    A = 1; % amplitude
    mfskSample = cos(2*pi * freqSample .* tSample);
    plot(tSample, mfskSample)
    

    sample output