MATLAB基于MIMO的主客观无损视频传输仿真

一、仿真要求

        请设计一种方案,在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、​​​​​​​实现步骤

  1. 读取MATLAB视频:v = VideoReader('xylophone.mp4');
  2. 记录所需OFDM符号数目,即为实现最快传输的最少OFDM符号数;
  3. 重复第5步至第9步,直至满足客观和主观无损的标准;
  4. 检查解压缩视频和原始视频是否一致,以检验是否满足主观无损传输的标准,即不影响观看视频。如果不满足,则增加OFDM符号数目或调整压缩算法和调制方式;
  5. 检查解压缩数据与原始数据是否一致,以检验是否满足客观无损传输的标准,即BER=0;
  6. 对检测后的数据进行信道解码,并解压缩得到原始视频数据;
  7. 接收端使用4个天线接收OFDM符号,并使用ZF符号检测算法来进行符号检测;
  8. 发送端使用4个天线发送OFDM符号,每个OFDM符号包含128子载波和自定长度的循环前缀;
  9. 将编码后的数据用QPSK调制,并将调制后的数据映射到OFDM符号的子载波上;
  10. 利用汉明编码对压缩后的数据进行信道编码;
  11. 对视频数据进行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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值