%function txdata = ofdm4fsk(S1, Nfft, Nused, G, symbolnum)
Nfft=256;%FFT大小
Nused=160;%使用子载波数
G=0.25;%保护间隔比例
symbolnum=100;%每一帧的符号数Nframe
S=randi([0, 1], 1, symbolnum*Nused*2/4/2);%原始数据,0,1
S1=convcoding(S);%卷积编码1/2
%S1:卷积编码后的编码数据,为串行数据
%Nfft:载波数
%Nused:使用的载波数
%G:保护间隔比例
%symbolnum:OFDM符号数
%实现对编码数据的map对应,加虚载波,ifft变换,加cp四个功能,最后以串行数据输出
%0...0 - 1 0 1...0 - 0...0 | 0...0-1 0 1...0 1-0...0 | ...
l1 = length(S1);%求卷积后的数据的长度 卷积之后信号的长度变了。
X1 = reshape(S1, 2, l1/2).';%这样X1变成L1/2 * 2。即每列有L1/2个元素,有2列。 没加转置之前,,就是将S1变成2*l1/2(即每列有2个元素,有l1/2列) 就是将S1按列的顺序每取两个作为一列
%将一列变成一行 加上转置之后,第一列是原始数据的1 3 5……
%第二列是原始数据的2 4 6……
X2 = bi2de(X1, 2, 'left-msb');%将2进制的数按照从左往右看 转换为十进制 是按照一行 一行来转 2,代表的是将2进制转化为十进制 3代表的是将3进制转化为十进制,区别是 2 进制中的 11表示的是十进制中的3 三进制中的11 表示成十进制是4
%即将每行都转为成十进制的数值 每行的元素转化过来 然后变成一个列向量
%X2变成L1/2 * 1 即每列有L1/2个元素 是一个列向量 每行的元素范围为:0-3
fsk4table = [0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0]; %因为MATLAB中的维数是从1开始的
X3 = fsk4table(:, X2+1);%取出该矩阵的第X2+1列的元素 为什么是x2+1因为是上面二进制转化为十进制的可能有 0 2进制转化为十进制 一行是2比特 所以转换成的十进制的数是0----3
% X2+1是个列向量, 第一个元素映射成一列 第二个元素映射成另一列,依次类推
%x3 是4行 L1/2列 fsk4的映射关系是0--1,1--2,2--3,3--4.
[r1,c1] = size(X3);%返回的是 r1=4 c1=L1/2 这是一个4* L1/2 的矩阵 这些是实实在在要传输的数据
Nsymbol = r1*c1/Nused;%有多少数据/子载波数;r1*c1=l1 就是原始卷积后的数据的长度
X4 = reshape(X3, Nused, symbolnum);%.....................以上为map部分,与demap对应 按照X3的列取元素 取到 Nused 为新矩阵的第一列 然后依次这样取下去
%将映射过来的数据,每列有Nused个元素,有symbolnum列
% unusedcarry = zeros((Nfft-Nused)/2,Nsymbol);%未使用的载波数为:Nfft-Nused)/2*Nsymbol
% X5 = [unusedcarry
% X4
% unusedcarry];//加虚载波这种方式是在有用子载波的头和尾各加 (nfft-nused)/2个
unusedcarry1= zeros(Nfft-Nused-1,Nsymbol);%另外一种加虚载波的方法: 每列有Nfft-Nused-1个载波,有Nsymbol列
X51 = [zeros(1,Nsymbol) %在最上面加了1个虚载波,然后是有用子载波,在加(nfft-nused-1)个虚载波,最后是有用子载波 仔细看下这个矩阵 把每列的元素的个数相加后得到Nfft(载波数)
X4(Nused/2+1:Nused,:)%这个不是按行来链接矩阵 而是按列来链接的
unusedcarry1
X4(1:Nused/2,:)]; % 这个是加了虚载波之后的数据
x6 = ifft(X51, Nfft, 1);%x6第一列是X5按列来进行ifft变换 这步奏就是进行调制
%进行过fft之后在加循环前缀
cp = (Nfft - Nfft * G + 1):1:Nfft;%计算循环前缀的长度为 Nfft * G 加的循环前缀是从那开始的
x7 = [x6(cp,:)%这个也是按列来扩展矩阵的 这个是每列加cp个元素 Nsymbol列
x6];%这个是加循环前缀,取出x6后面的一部分添加到x6的前面
txdata = x7(:).';%这个x7(:)的意思就是 将第二列接在第一列下,第三列的元素接在第二列的元素下
%上面一行代码的意思是:按列取出每一个ofdm的符号 然后排成一行,是个行向量
txdata=txdata./max(txdata.*conj(txdata));%conj是求复数的共轭 max(A)如果A是一个向量 则返回该向量的最大值 ?????