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

MFSK (Multilevel Frequency-Shift Keying) in MATLAB

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

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

我得到以下数据:

10 01 01 01 10 10 01 11

我要用

创建四个 (M = 4) 个信号

fc = 5 KHz and fd = 500 Hz.

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

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

到目前为止我做了什么: 基于等式 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 *

Columns 1 through 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

Columns 7 through 8

0.0000 + 7.3847i 0.0000 + 7.6719i

感谢您的帮助,感谢您抽出宝贵时间。

你的程序有两个主要问题。

  1. Matlab中的余弦函数是cos而不是acosd。但我相信您正在尝试键入书中提到的振幅。
  2. 考虑奈奎斯特采样定理。您的载波频率为 5k Hz,因此评估信号 si(t) 的最大时间间隔为 0.2 毫秒。这将确保您可以看到完整的载波正弦波。但是,为了观察 mfsk 代码,您还必须确保每个 mfsk 位持续足够的时间;在我的例子中,为了直观地观察它,我将位长度设置为调制(差分)频率的几个完整周期。因此,在一个mfsk比特的时间内,会有几个调制信号周期和数百个载波信号。

这里有一些代码可以满足您的需要....

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)