📄 tx_modulate.m
字号:
function mod_symbols = tx_modulate(bits_in, modulation)
full_len = length(bits_in);
% BPSK调制
if ~isempty(findstr(modulation, 'BPSK'))
%角度 [pi/4 -3*pi/4] 分别对应于格雷码[0,1]
table=exp(j*[0 -pi]); % 产生BPSK符号
table=table([1 0]+1); % 格雷映射
inp=bits_in;
mod_symbols=table(inp+1); %将发射的信号映射成BPSK信号
% QPSK
elseif ~isempty(findstr(modulation, 'QPSK'))
% 角度[pi/4 3*pi/4 -3*pi/4 -pi/4] 分别对应于格雷码[00 10 11 01]
table=exp(j*[-3/4*pi 3/4*pi 1/4*pi -1/4*pi]); %% 产生QPSK符号
table=table([0 1 3 2]+1); %格雷映射
inp=reshape(bits_in,2,full_len/2);
mod_symbols=table([2 1]*inp+1);
%每次两比特,经过[2 1]*inp+1后,[00 01 10 11]变成[0 1 2 3]+1,再映射到相应的QPSK信号。
%[00 01 10 11]分别映射成exp(j*[-3/4*pi 3/4*pi -1/4*pi 1/4*pi])
% 16-QAM
elseif ~isempty(findstr(modulation, '16QAM'))
m=1;
for k=-3:2:3
for l=-3:2:3
table(m) = (k+j*l)/sqrt(10); % 功率归一化
%16QAM的平均功率=sum(k^2+l^2)/16=10,故归一化需除以sqrt(10)。
m=m+1;
end;
end;
%table=[-3-j3 -3-j -3+j -3+j3 -1-j3 ... 3+j3]/sqrt(10),接下来进行Gray映射
table=table([0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10]+1);
inp=reshape(bits_in,4,full_len/4);
mod_symbols=table([8 4 2 1]*inp+1);
%类似QPSK的映射,一次4比特。
% 64-QAM
elseif ~isempty(findstr(modulation, '64QAM'))
%生成64QAM符号
m=1;
for k=-7:2:7
for l=-7:2:7
table(m) = (k+j*l)/sqrt(42);
m=m+1;
end;
end;
table=table([[ 0 1 3 2 7 6 4 5]...
8+[ 0 1 3 2 7 6 4 5]...
24+[ 0 1 3 2 7 6 4 5]...
16+[ 0 1 3 2 7 6 4 5]...
56+[ 0 1 3 2 7 6 4 5]...
48+[ 0 1 3 2 7 6 4 5]...
32+[ 0 1 3 2 7 6 4 5]...
40+[ 0 1 3 2 7 6 4 5]]+1);
inp=reshape(bits_in,6,full_len/6);
mod_symbols=table([32 16 8 4 2 1]*inp+1);
else
error('Unimplemented modulation');
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -