一、仿真要求
请设计一种方案,在4个发射天线和4个接收天线之间快速传输视频数据,使得在满足BER=0和视频观看不受影响的基础上,传输时隙最少。传输数据必须是MATLAB视频:v = VideoReader(‘xylophone.mp4’),信噪比为SNR=15dB,信道为时不变10径瑞利信道,并假设已知信道。在设计方案时,可以自选压缩方式、信道编码、调制方式、均衡和符号检测方式等。请给出实现最快传输的客观和主观无损传输的最少时隙数量。
二、题目分析
本次仿真在发送端我选用DCT变换对视频图像进行压缩,用汉明编码对数据进行信道编码,用QPSK对数据进行调制;在接收端,我选用ZF符号检测算法来实现符号检测。
1、算法原理
MIMO:多输入多输出(MIMO)技术是一种利用多个天线进行数据传输和接收的技术,可以有效提高无线信道容量和抗干扰能力。其原理是利用多个天线相互配合,将数据分成多个独立的流并在不同的天线上发送,接收端通过解调和合并不同信道的数据来还原原始数据流。
DCT压缩:离散余弦变换(DCT)是一种基于频域的信号变换技术,常用于图像、音频等信号的压缩。其原理是将信号分解成基函数,频率从低到高逐渐变化,通过保留重要的基函数来压缩信号,减少冗余数据和噪声。
汉明编码:汉明编码是一种用于检测和纠正连续的比特错的编码技术。其原理是通过在原始数据中插入附加校验位,使得每个比特的出现次数都为偶数或奇数。接收端通过对数据进行校验位的校验和纠正,来检测和校正传输中的比特错。
OFDM:正交频分复用(OFDM)是一种多载波传输技术,将高速数据流分成多个低速数据流,在不同的子载波上进行传输。其原理是每个子载波之间相互正交,避免了符号间干扰,提高了传输效率和抗干扰能力。
QPSK:四相移键控(QPSK)是一种常用的调制技术,将每个符号映射到不同的相位,包括0°、90°、180°和270°。其原理是将信息编码到信号的相位上,通过正弦和余弦信号的变幻来实现信息的传输。
ZF符号检测:零法损耗(ZF)符号检测是一种线性检测算法,用于MIMO系统中的符号检测。其原理是通过最小化误差向量来选择正确的符号发送,使得接收信号与发送信号之间的误差最小。该算法需要计算逆矩阵来实现符号检测,复杂度相对较高。
2、实现步骤
- 读取MATLAB视频:v = VideoReader('xylophone.mp4');
- 记录所需OFDM符号数目,即为实现最快传输的最少OFDM符号数;
- 重复第5步至第9步,直至满足客观和主观无损的标准;
- 检查解压缩视频和原始视频是否一致,以检验是否满足主观无损传输的标准,即不影响观看视频。如果不满足,则增加OFDM符号数目或调整压缩算法和调制方式;
- 检查解压缩数据与原始数据是否一致,以检验是否满足客观无损传输的标准,即BER=0;
- 对检测后的数据进行信道解码,并解压缩得到原始视频数据;
- 接收端使用4个天线接收OFDM符号,并使用ZF符号检测算法来进行符号检测;
- 发送端使用4个天线发送OFDM符号,每个OFDM符号包含128子载波和自定长度的循环前缀;
- 将编码后的数据用QPSK调制,并将调制后的数据映射到OFDM符号的子载波上;
- 利用汉明编码对压缩后的数据进行信道编码;
- 对视频数据进行DCT压缩;
三、仿真结果
图 1 客观无损传输
图 2 主观无损传输(th=50,step=2)
图 3 主观有损传输(th=100,step=2)
图 4 主观有损传输(th=100,step=4)
图 5 OFDM调制
四、结果分析
本次仿真设置step、yasuo、th三个控制参数。yasuo是对传输方式进行选择,等于1时是有损传输,等于2时是无损传输;step是指在原视频中每隔step帧取一帧进行传输,step值越大,传输后的视频越卡顿,但传输速度相应会提高,如图3和图4传输时间对比所示;th是DCT变换时控制压缩率的大小,th越大,压缩率越大,相对的视频图像质量便越差,但是传输速度也会相应提高,从图2和图3的传输时间对比便可以看出;由此可以得出数据量越大,处理时间便会越长,从而加长数据的传输时间,如图1无损传输所示,因为没有对其进行压缩处理,虽然接受端的视频没有出现模糊和掉帧的情况,但是代价就是,其传输时间超过有损传输的十几倍。
本次仿真本尝试使用OFDM对QPSK调制后的信号进行调制,结果如图5所示,但是接受端一直无法进行较好恢复,仿真结果时好时坏,通过调试观察发现是由于信道在每次仿真开始时都会被重新设置,而其没有自适应的功能所导致,由于时间问题,故舍弃了OFDM调制,虽然也能够达到较好的视觉效果,但是程序运行时间过长,希望在往后的学习中能够加深对MIMO通信系统的理解,将此次仿真进行完善。
五、代码
% 视频传输,10径MIMO,DCT压缩,汉明编码,OFDM,QPSK,ZF符号检测
close all;clc;clear;
SNR=15; % 信噪比dB
N_TX = 4; % 发送天线数
N_RX = 4; % 接收天线数
ch_num = 10; % 路径数
cp = 12; % 循环前缀长度
n = 7; k = 4; %汉明编码将k个bit编成n个bit
step = 2; % 视频帧数抽取频率
yasuo = 1; % 1表示dct压缩,2代表无dct压缩
th = 100; % dct压缩阈值
%% 读取图片
vidObj = VideoReader('xylophone.mp4');
frames = read(vidObj,[1 Inf]);
f_out = uint8(zeros(size(frames)));
Times = size(frames,4);
H = (randn(N_RX, N_TX, ch_num) + 1j * randn(N_RX, N_TX, ch_num)) / sqrt(2); % 生成信道矩阵
ber = zeros(1,floor(Times/step)+1);
tic
for time=1:step:Times
disp([num2str(time/Times*100, '%.2f'), '% passed']); %视频传输进度
fdouble = double(frames(:,:,:,time)); % uint8转double
[wid,len] = size(fdouble(:,:,1));
% 一帧一帧图片传输
for dep=1:3
fd_slice = fdouble(:,:,dep);
if yasuo == 1
dctf = dct2(fd_slice);%dct压缩
index = find(abs(dctf)>=th);% 低通滤波
comf = dctf(index); % 提取高能量幅值
neg = floor(min(comf));%偏移量
comf = comf-neg;% 将向量全部元素偏移至>=0
bin = dec2bin(comf);% 二进制转换
else
%% 不压缩
bin = dec2bin(fd_slice);% 二进制转换
end
%求压缩率
% compressionRate = numel(dctf)/numel(comf)
%% 汉明编码
symb2 = bin-'0';
symb2Code=reshape(symb2,numel(symb2)/k,k);
symb2Code=encode(symb2Code,n,k);%encode函数为汉明编码
%% QAM调制
M_QAM = 4;% QAM调制阶数
M = log2(M_QAM);% QAM调制对应的二进制位数
x=bin2dec(char(reshape(symb2Code,[],M)+'0'));
y_qam = qammod(x,M_QAM );
%% OFDM调制
N = length(y_qam); % 获得序列元素个数
zero_tail = mod(4*128-mod(N,4*128),4*128); % 获得需要对输入序列进行补位的个数
decData_0 = [y_qam;zeros(zero_tail,1)]; % 末尾以0补位
X_0 = reshape(decData_0,4,[]); % 将数据分配给四个天线发射
% X_0 = reshape(decData_0,128,[],4); % (ofdm调制)将数据分配给四个天线发射
% X_0 = ofdmmod(X_0,128,cp)'; % ofdm调制
%% 添加噪声
sigma = sqrt(10^(-SNR/10)); % 信噪比计算公式
noise = sigma*(randn(N_RX,length(X_0))+1i*randn(N_RX,length(X_0)))/sqrt(2); % 生成高斯白噪声
Y = noise;
% 生成接收信号
for ch_i = 1 : ch_num
Y = Y + H(:,:,ch_i)*X_0 ;
end
H_gj = sum(H,3); % 假设信道已经被精确估计
X_re = pinv(H_gj.'*H_gj)* H_gj.' *Y;
%% OFDM解码
% X_re = ofdmdemod(X_re',128,cp);
%% QAM解调
X_re = X_re(1:N);
rxData = qamdemod(X_re,M_QAM );
rxData = dec2bin(rxData)-'0';
%% 汉明解码
rxData = decode(reshape(rxData,[],n),n,k);
%% 从位到数
N = size(symb2);
rxDataF = bin2dec(char(reshape(rxData,N)+'0'));
%% 从频域到时域重构图像
if yasuo == 1
rxDataF = rxDataF+neg;%压缩之前减了偏移量neg,这里加回来
Iout = zeros(size(fd_slice)); %构建一个和原来矩阵同大小的0矩阵
Iout(index) = rxDataF; %将一维向量还原为二维数组
Iout = idct2(Iout); %反dct变换
Iout3 = reshape(Iout,wid,len);
else
Iout3 = reshape(rxDataF,wid,len);
end
Iout_unit8 = im2uint8(Iout3/255);
Iout_rep = reshape(repmat(Iout_unit8,1,step,1),wid,len,[]);
f_out(:,:,dep,time:time+step-1) = Iout_rep;
end
[~,ber] = biterr(reshape(f_out(:,:,:,time), [], 1),fdouble(:));
end
time_total = toc;
%% 播放视频
for time=1:Times
subplot(1,2,1);
imshow( frames(:,:,:,time) )
title('The original video')
subplot(1,2,2)
imshow(f_out(:,:,:,time));%
title(['Output ber=',num2str(mean(ber),'%.3f'),...
' 传输时间:',num2str(time_total,'%.2f'),'s'])
pause(1/(4*vidObj.FrameRate));
end