function [tmodule,mosignal,Fsmosignal] = fourFSK_mod(shuru, jiehsu)
% 4FSK调制函数.
% [tmodule,mosignal,Fsmosignal] = fourFSK_mod(shuru, jiehsu)
%
% INPUT:
% - shuru :输入卷积编码进来的行向量 1*n 的形式.
% - jiehsu: 输入的阶数.
%
%
% OUTPUT:
% - tmodule :采样时间(t) (解调使用)
% - mosignal:调制信号
% - Fsmosignal:采样频率(Fs) (解调使用)
%
% Author : RJC
% Created: 2024/3/19
%% 调制
% 基本参数
M = length(shuru); % 产生符号数
L = 100; % 每码元复制L次,每个码元采样次数
Ts = 0.001; % 每个码元的宽度,即码元的持续时间
R = 1/Ts; % 码元速率1K
dt = Ts/L; % 采样间隔
TotalT = M*Ts;
t = 0:dt:TotalT-dt; % 总时间
Fs = 1/dt; % 采样频率
% 确定传输信号
N = jiehsu; % 从用户输入获取调制阶数N
wave = shuru; % 使用输入的序列作为传输信号
% 画出基带信号图形
figure(1)
fz = ones(1, L); % 定义复制的次数L,L为每码元的采样点数
x1 = wave(fz,:); % 将原来wave的第一行复制L次,称为L*M的矩阵
jidai = reshape(x1, 1, L*M); % 产生单极性不归零矩
subplot(2, 2, 1)
plot(t, jidai);
title("基带信号波形"); % 标题
xlabel('时间'); % x轴标签
ylabel('幅度'); % y轴标签
%% NFSK调制
modulated_signal = zeros(1, length(t)); % 初始化调制信号
freqs = linspace(1000, 1000 * N, N); % 从1000Hz到1000*N Hz的等差序列作为频率
for i = 1:M
% 根据每个元素值选择相应的频率
freq = freqs(wave(i) + 1); % MATLAB中索引从1开始,所以要加1
% 生成调制信号
modulated_signal((i - 1) * L + 1:i * L) = cos(2 * pi * freq * t((i - 1) * L + 1:i * L));
end
%% 画出调制后的图像和频谱图
%画出NFSK图像
subplot(2, 2, 3)
plot(t, modulated_signal, 'b', t, (jidai - 1.5), 'r');
title("NFSK信号波形"); % 标题
xlabel('时间'); % x轴标签
ylabel('幅度'); % y轴标签
%% 返回tmodule mosignal Fsmosignal
tmodule=t;
mosignal=modulated_signal;
Fsmosignal=Fs;
end