2016.03.31 – 04.05
个人理解笔记。(无通信基础,片面或错误概率较大)
03.31
OFDM的基本原理是将高速率子载波上数据流划分到多个低速率子载波上同时传输 [2] 。
OFDM信号由多个经PSK(Phase Shift Keying,相移键控)或QAM(Quadrature Amplitude Modulation,正交振幅调制)调制的、彼此正交的子载波相加组成(这里的调制在就是指matlab中的映射过程) [2] 。
Figure 1. OFDM信号[04.05]
主要指信息元素与载波的振幅、相位或频率的映射机制。
[1] 原理描述
bpsk(Binary Phase Shift Keying,二进制相移键控)用载波初始相位0和π分别表示二进制的0和1。如用频率为300000Hz的余弦载波来表示二进制序列[0 1 0]时,则应依次产生如下图所示的载波:
Figure 2.频率为3e5[Hz]的余弦载波用bpsk方法调制二进制序列[0 1 0]图示
[2] matlab描述
Matlab中有一套描述bpsk过程的工具函数。在matlab中用bpsk方法映射二进制序列[0 1 0]的样例代码如下:
bpsk.m
% bpsk.m
% 用bpsk映射二进制序列[0 1 0]
clear
bseq =[0 1 0];
% 确定映射对象 - PSK中的bpsk映射
mod_ob = modem.pskmod(2);
% 根据映射对象映射bseq二进制序列
mod_bpsk_symbols = modulate(mod_ob,bseq)
运行bpsk。
mod_bpsk_symbols = [1.0000 + 0.0000i, -1.0000 + 0.0000i, 1.0000 + 0.0000i]
复数既能够表示大小(绝对值)又能够表示角度。
由(度娘的)
即将信息[0, 1, 0]和能够描述角度的数学描述[ 1(cos(0)+isin(0)),1(cos(π)+isin(π)),1(cos(0)+isin(0)) ]相对应,以从复数中能够清楚地读出角度信息。在matlab中,这里的角度就可被视为是在描述载波的初始相位。
04.01
[1] 原理描述
qpsk(Quadrature Phase Shift Keying,正交相移键控)是一种四进制移相键控。它规定了载波的[ π4,3π4,5π4,7π4 ]相位分别代表四进制[0, 1, 2, 3]中的元素。用载波来表示信息[0, 1, 2, 3]如下图:
Figure 3. QPSK表示信息[0, 1]的图示,表示[2, 3]同理
由于PSK只跟载波的(初始)相位有关,那么可以将载波的相位[0, 2π]独立出来,看其相位与其所表示的信息元素之间的映射关系。如下图:
Figure 4. QPSK的星座图
Figure 4被称为“星座图”,它表示了载波上的信息分布以及与信息元素与载波相位之间的映射关系。如Figure 4中,信息分布在载波的[ π4,3π4,5π4,7π4 ]相位上,它们分别表示信息[0, 1, 2, 3]。
[2] matlab描述
qpsk.m
% qpsk.m
% 用qpsk映射四进制序列[0 1 2 3]
clear
A = 1;
M = 8;
mseq = 0 : M - 1;
% 映射类型,PSK中的qpsk映射
% 构建一个偏移π/4弧度的4-PSK映射对象
% 若不偏移则是相位[0,π/2, π, 3π/2]分别与信息[0 1 2 3]对应
mod_ob = modem.pskmod(M, pi / 4);
% 根据映射对象调制 - 将信号用对应到载波相位
mod_qpsk_symbols = A * modulate(mod_ob,qseq)
运行qpsk。
mod_qpsk_symbols =
[0.7071 + 0.7071i, -0.7071 + 0.7071i, -0.7071 - 0.7071i, 0.7071 - 0.7071i]
0.7071代表的 2√2 ,则mod_qpsk_symbols =
经qpsk映射后,
信息[0, 1, 2, 3]被映射为
[1] 原理描述
mpsk(multiple phase shift keying,多进制数字相位调制)利用载波的多种不同相位状态来表示多个信息,mpsk可以表示m进制中的m个数据。应用最广泛的是四进制psk即QPSK(见QPSK)。
根据bpsk和qpsk推测。在MPSK中,信息元素与载波相位的映射关系为:将2π均分为2π/m份,从0相位开始,每隔2π/m就依次表示一个m进制值(绝对相位调制)。如8mpsk的相位[ 0,π4,π2,3π4,π,5π4,3π2,7π4 ]分别表示序列[0, 1, 2, 3, 4, 5, 6, 7]中的每一个元素。若用相位偏移如π/4(相对相位调制)来映射,则用绝对相位的各相位加上π/4来表示各元素。
[2] matlab描述
以8psk为例。
mpsk.m
% mpsk.m
% 用8psk映射八进制序列[0 1 2 3 4 5 6 7]
clear
A = 1;
M = 8;
mseq = 0 : M - 1;
% 构建映射对象 - 8psk绝对相位映射
% [0, π/4, π/2, 3π/4, π, 5π/4, 3π/2, 7π/4]与[0 1 2 3 4 5 6 7]相对应
mod_obo = modem.pskmod(M);
% 构建映射对象 - 8psk相对相位偏移π/M相位映射
% [0, π/4, π/2, 3π/4, π, 5π/4, 3π/2, 7π/4].+ pi / M 与[0 1 2 3 4 5 6 7]相对应
mod_obr = modem.pskmod(M, pi / M);
% 根据映射类型映射 - 将信号用载波相位来表示
mod_8psko_symbols = A * modulate(mod_obo,mseq)
mod_8bpskr_symbols = A * modulate(mod_obr,mseq)
plot( real(mod_8psko_symbols), imag(mod_8psko_symbols), 'b*',...
real(mod_8bpskr_symbols), imag(mod_8bpskr_symbols), 'r*');
legend('8psk绝对相位映射','8psk相对相位偏移π/8映射');
ylabel('imag'),xlabel('real'),
axis([-1 1 -1 1]);
运行mpsk。
mod_8psko_symbols =
[1.0000 + 0.0000i, 0.7071 + 0.7071i, 0.0000 + 1.0000i, -0.7071 + 0.7071i, -1.0000 + 0.0000i, -0.7071 - 0.7071i, -0.0000 - 1.0000i, 0.7071 - 0.7071i]
mod_8bpskr_symbols =
[0.9239 + 0.3827i, 0.3827 + 0.9239i, -0.3827 + 0.9239i, -0.9239 + 0.3827i, -0.9239 - 0.3827i, -0.3827 - 0.9239i, 0.3827 - 0.9239i, 0.9239 - 0.3827i]
可以验证这些复数所代表的角度与以上原理描述相符合。
下图是运行mpsk绘制的8PSK绝对相位映射和相对相位偏移π/8的星座图。
Figure 5. 8psk绝对相位和相对相位偏移π/4星座图
横坐标代表复数的实部,纵坐标代表复数的虚部 – 一个复平面。每个点在复平面上的角度(对应载波应有的初始相位)即用来表示相应的信息([0, 1, 2, 3, 4, 5, 6, 7])。
04.02
QAM(Quadrature Amplitude Modulation,正交振幅调制/映射)同时利用载波的振幅和相位来表示信息元素。它先对信息元素进行编码,然后再将编码映射为一个复数,再用两个正交的载波的振幅分别表示该复数的实部和虚部。如信息[0, 1, 2, 3, …, 12, 13, 14, 15]用QAM映射的过程如下:
[1] 信息元素编码
Figure 6. 信息元素与星座图元素之间的映射(格雷码)
在Figure 6中,每个信息元素独有一个编码[如信息元素9对应左上角的星号图形,该星号图形的编码为1101(1101为格雷码,表示信息元素9)]。
[2] 将信息元素的编码映射为复平面上的坐标
Figure 7. 信息元素的编码与复平面坐标映射
经该过程映射后,信息元素就间接被映射成了一个复数(如信息元素7由复数3 + i1表示)。
[3] 用两个正交的载波的振幅分别承载信息元素编码所映射复数的实部和虚部
信息[0, 1, 2, 3, …, 13, 14, 15]最终的映射如下:
Figure 8. 信息元素的映射由两个正交的载波表示
Figure 8中的一个点的坐标的实部和虚部分别由两个彼此正交的波形承载。如(3, i1)(其编码为0100,代表信息元素7)可由下图所示的正弦载波承载:
Figure 9. 信息元素编码的坐标由两个正交的载波的振幅承载
首先要求两个载波要正交。初始相位为0的载波的振幅承载信息3,初始相位为-π/2的载波的振幅承载信息1。当收到这两个波形时,就能根据两个载波的振幅值得到坐标值(3, 1i),根据坐标与编码之间的映射以及编码与信息元素之间的映射就可还原信息元素7。
以16QAM为例。
qam.m
% qam.m
% 2 ^b QAM映射
clear
b = 4;
M = 2^b;
mseq = 0 : M - 1;
% 构建信息映射类型 - MQAM映射
mod_ob = modem.qammod(M);
% 依据构建的映射对象将映射关系呈现在星座图中
mod_mqam_symbols = modulate(mod_ob,mseq)
plot(real(mod_mqam_symbols), imag(mod_mqam_symbols), 'b*');
ylabel('imag'),xlabel('real');
运行qam,得[0, 1, 2, …, 13, 14, 15]所对应的16QAM星座图。
Figure 10. 16AQM映射信息[0, 1, 2,…, 13, 14, 15]图示
根据16QAM的映射机制,可还原星座图上每一个坐标点所对应的信息元素。如-3 + 3i这一点的编码值为1101,它是信息元素9的格雷码。
04.03
在matlab中(matlab实现的是PSK和QAM的数学描述)。
PSK是将信息元素 ei 映射成一个复数,该复数的角度代表用来传输 ei 的载波的初始相位 ps , ps 就代表信息元素 ei 。
QAM是先将信息元素 ei 编码为c,再将编码c映射为一个复数a + bi,再将两个正交的载波的振幅分别调为a和b后传输。在收到两个载波后,根据其振幅a和b可得到编码c,再根据编码c就可以得到 ei 元素。
04.05
考虑指数式子
即任意两个 ej2πfkt 和 ej2πfit(k≠i) 是正交的(离散时即t=0, 1,…,n时也彼此正交)。
那么OFDM的子载波的数学描述可以为(2.1)式。
若 di 是QAM符号, Ns 是OFDM子载波数量, T 是OFDM信号持续(发送)时间, fc 为载波频率,那么开始于时间 ts 的OFDM可以被描述为:
[由于数学/通信素养低下,个人已忽略公式中诸多微妙的细节]
(2.3)式其实是对 Ns 个QAM数据进行傅里叶逆变换的过程[2]。由于CPU等器件只能处理离散量,故而需要把(2.3)式变为对应的离散表达式:
Figure 11. N-ifft将一个振幅为 Am0 频率为 f0 的信号变换到时域(N个离散的点)
在matlab中仿真生成OFDM符号。
ofdm_signals.m
% ofdm_signals.m
% 映射: MQAM映射N个M进制信息序列。
% 子载波: 用Nifft点ifft变换生成Ns个子载波,
% 第i个子载波的频率为[1/Nifft, 1]中的一个,
% 第i个子载波所携带信息为第i个QAM映射信息/符号
clear
b = 4;
N = 8;
Nos = 16;
% (QAM映射的)M进制数
M = 2^b;
% 生成(1 x N)的[0, M - 1](M进制)的随机数
mseq = randi([0, M - 1], 1, N);
%--------映射--------
% 构建信息映射对象 - MQAM映射
mod_ob = modem.qammod(M);
% 依据构建的映射对象映射信息mseq
mqam_symbols = modulate(mod_ob,mseq);
ofdm_signals.m
…
% Nifft点ifft变换
Nifft = N * Nos;
T = 1 / Nifft;
% Nifft份,每份相隔T
time = [0:T:1-T];
% --------使用ifft将QAM符号转换到时域载波:第i个载波的频率为[1/Nifft, 1]中的一个,具体见ifft参数--------
% x, xI,xQ大小为N x Nifft
x = zeros(N, Nifft);
xI = zeros(N, Nifft);
xQ = zeros(N, Nifft);
for i = 1:N
if i <= N / 2
x(i,:) = ifft([zeros(1, i - 1) mqam_symbols(i) zeros(1, Nifft - i + 1)], Nifft);
else
x(i,:) = ifft([zeros(1, Nifft - N + i - 1) mqam_symbols(i) zeros(1, N - i)], Nifft);
end
xI(i, :) = real(x(i, :));
xQ(i, :) = imag(x(i, :));
end
% ofdm信号
ofdm_signal= sum(x);
% --------将OFDM信号各部分绘图--------
xaxis = zeros(length(xI));
subplot(341),
plot(time, xI(1,:), 'b-', time, xQ(1,:), 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(1/N),'[Hz]经ifft变换后的QAM符号的实部与虚部波形']),
legend('实部','虚部');
subplot(342),
plot(time, xI(2,:), 'b-', time, xQ(2,:), 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(2/N),'[Hz]经ifft后的QAM符号实部与虚部波形']),
legend('实部','虚部');
subplot(343),
plot(time, xI(3,:), 'b-', time, xQ(3,:), 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(3/N),'[Hz]经ifft后的QAM符号实部与虚部波形']),
legend('实部','虚部');
subplot(344),
plot(time, xI(4,:), 'b-', time, xQ(4,:), 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(4/N),'[Hz]经ifft后的QAM符号实部与虚部波形']),
legend('实部','虚部');
subplot(345),
plot(time, xI(5,:), 'b-', time, xQ(5,:), 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(5/N),'[Hz]经ifft后的QAM符号实部与虚部波形']),
legend('实部','虚部');
subplot(346),
plot(time, xI(6,:), 'b-', time, xQ(6,:), 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(6/N),'[Hz]经ifft后的QAM符号实部与虚部波形']),
legend('实部','虚部');
subplot(347),
plot(time, xI(7,:), 'b-', time, xQ(7,:), 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(7/N),'[Hz]经ifft后的QAM符号实部与虚部波形']),
legend('实部','虚部');
subplot(348),
plot(time, xI(8,:), 'b-', time, xQ(8,:), 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(8/N),'[Hz]经ifft后的QAM符号实部与虚部波形']),
legend('实部','虚部');
sum_xI = sum(xI);
sum_xQ = sum(xQ);
subplot(349),
plot(time, xI, 'b:', time, xQ, 'g:',time, sum_xI, 'b-', time, sum_xQ, 'g-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['频率f_1=', num2str(1/N), '~', num2str(8/N) ,'[Hz]经ifft后的QAM的实、虚部之和以及实部与虚部波形']),
legend('实部','虚部','实部之和','虚部之和');
subplot(3, 4, 11),
plot(time, sum_xI, 'b:', time, sum_xQ, 'g:', time, abs(sum_xI+j*sum_xQ), 'k-', time, xaxis, 'r-');
ylabel('y'),xlabel('t'),
title(['经ifft的QAM符号实部之和虚部之和以及实部与虚部的绝对值波形']),
legend('实部之和','虚部之和', '绝对值');
运行ofdm_signals得到的绘图如下:
Figure 12. OFDM信号图示
[个人理解,可能用词不当]
(2.3)式中共有 Ns 个信号(或叫表达式?),第i个信号频率为i/T, Ns 个信号彼此正交,是时域连续信号,可作为OFDM信号的载波(频率在无线电频率范围之内)。
在计算机内需要用(2.3)式的离散形式(2.4)作为OFDM正交信号的载波。(2.4)式中,第i个载波的频率为i/N,若要得到第i个携带 di 信息的载波,则是对频率为i/N、振幅为 di 的频谱值(见N-ifft)作N点IDFT,N点的IDFT可以使用N点的ifft快速实现。( di 为载波携带信息,如为QAM符号)。
本笔记对应的matlab代码保存地址:PSK QAM OFDM_SIGNALS。
[2016.04.03 - 22:25]