OFDM技术通过将频率选择性多径衰落信道在频域内转换为平坦信道,减小了多径衰落的影响。OFDM技术如果要提高传输速率,则要增加带宽、发送功率、子载波数目,这对于频谱资源紧张的无线通信时不现实的。

MIMO能够在空间中产生独立并行信道同时传输多路数据流,即传输速率很高。这些增加的信道容量可以用来提高信息传输速率,也可以通过增加信息冗余来提高通信系统的传输可靠性。但是MIMO却不能够克服频率选择性深衰落。

所以OFDM和MIMO这一对互补的技术自然走到了一起,现在是3G,未来也是4G,以及新一代WLAN技术的核心。总之,是核心物理层技术之一。

MIMO系统理论:

核心思想:时间上空时信号处理同空间上分集结合。

时间上空时通过在发送端采用空时码实现: 空时分组、空时格码,分层空时码。

空间上分集通过增加空间上天线分布实现。此举可以把原来对用户来说是有害的无线电波多径传播转变为对用户有利。

function tx(nr_frames)
% Transmission
% Maxime Maury
% 05-04-28

if (nargin < 1)
    nr_frames = 20; % number of frames to send
end

% Frame structure Type SYNC
% Antenna 1:
% +---+----------+-----+---+-----+-----------------------------+
% | G | tr_sync1 | tr1 | G | tr1 | data                        |
% +---+----------+-----+---+-----+-----------------------------+
% Antenna 2:
% +---+----------+-----+---+-----+-----------------------------+
% | G | tr_sync1 | tr2 | G | tr2 | data                        |
% +---+----------+-----+---+-----+-----------------------------+

% Antenna 1: Type REGULAR
% +---+-----+---+-----+-----------------------------+
% | G | tr1 | G | tr1 | data                        |
% +---+-----+---+-----+-----------------------------+
% Antenna 2:
% +---+-----+---+-----+-----------------------------+
% | G | tr2 | G | tr2 | data                        |
% +---+-----+---+-----+-----------------------------+

close all

disp(' ');
disp('-- Start TX --')

j = sqrt(-1);

% ---------------------------------------------------
% General parameters
% ---------------------------------------------------

Fs = 96000; % Sampling frequency (Hz) 
Fc = 10000; % Carrier frequency (Hz)
L = 10; % Upsampling factor

% Simulate a Frequency offset
F_offset = 0; % In real frequency
Fc_tx = Fc + F_offset;

%nr_frames =100;
data_len = 256; % In symbolS
data_len_bits = data_len*4; % In bits

% ---------------------------------------------------
% Pulse shape
% ---------------------------------------------------

pulse = 1;

if (pulse==1)
    roll_off_factor = .22;
    half_filter_len = 7; % Half-Length of the RRC
    pulse_shape = root_raised_cosine(L, roll_off_factor, half_filter_len);
else
    pulse_shape = ones(1,L);
end

pulse_len = length(pulse_shape);

% ---------------------------------------------------
% Head & tail
% ---------------------------------------------------

% Add a zero signal for noise estimation
init_len = 500;

% Add a zero tail
tail_len = 2000;

% Sinusoid at 10kHz for frequency offset estimation
n_periods = 100;
time_end = floor(n_periods*Fs/Fc_tx) -1 ;
% Stops just before cos = 1 to avoid discontinuities in the signal;打dota,看出装
% (modulation of frames start with cos=1)

% ---------------------------------------------------
% Guard symbols
% ---------------------------------------------------

% Guard symbols
guard_symbols_I = ones(1, 1);
guard_symbols_Q = ones(1, 1);
guard_len = length(guard_symbols_I);

% ---------------------------------------------------
% Training sequence
% ---------------------------------------------------

% Training sequence
[tr_sync1_I, tr_sync1_Q, tr1_I, tr1_Q, tr2_I, tr2_Q] = training_sequence;

% Length of channel estimation training sequence
training_len = length(tr1_I);

% ---------------------------------------------------
% Framing
% ---------------------------------------------------

% Length of synchronization training sequence
training_s_len = length(tr_sync1_I);

% Length of a regular frame in symbols (before upsampling)
frame_len = guard_len + training_len + guard_len + training_len + data_len;
overhead_len = frame_len - data_len;

disp(['Overhead size (Regular): ', num2str(overhead_len/frame_len*100), '%']);
disp(['Overhead size (Sync): ', num2str((overhead_len+training_s_len)/frame_len*100), '%']);

% Synchronization every refresh_fr frames
refresh_fr = 4;
nr_sync_frames = floor((nr_frames-1)/refresh_fr) + 1;
nr_regular_frames = nr_frames - nr_sync_frames;

disp(['Number of regular frames: ', num2str(nr_regular_frames)]);
disp(['Number of sync frames: ', num2str(nr_sync_frames)]);

% Length of an upsampled frame pulse-shaped
Lf = frame_len * L + pulse_len - 1 ;
Lf_sync = Lf + training_s_len*L ;

frames_len = Lf*nr_frames + training_s_len*L*nr_sync_frames;

% Save all these parameters into tx_param for the receiver
save('tx_param');

% ---------------------------------------------------
% Data
% ---------------------------------------------------

% Generate random data stream
data_sent = random_data(data_len_bits*2*nr_frames);

% For testing, de-comment the following
% data_sent(1:2:end) = [ zeros(1,data_len*2*nr_frames), ones(1,data_len*2*nr_frames)];
% data_sent(2:2:end) = [ ones(1,data_len*2*nr_frames), zeros(1,data_len*2*nr_frames)];

% Serial To Parallel
% 1 2 3 4 5... -> [1 3 5 ...; 2 4 ...]
data_split_sent_1 = data_sent(1:2:end);
data_split_sent_2 = data_sent(2:2:end);

% channel1 sent to Antenna 1, channel2 sent to Antenna 2
channel1_block = zeros(1 , frames_len); 
channel2_block = zeros(1 , frames_len);

% ---------------------------------------------------
% Frame Loop
% ---------------------------------------------------

% Proceeed frame by frame
for fr=1:nr_frames
    
    k = 1 + (fr-1)* data_len_bits; % Position within the data bits
    
    % Extract data
    data_split_1 = data_split_sent_1(:,k:k+data_len_bits-1);
    data_split_2 = data_split_sent_2(:,k:k+data_len_bits-1);  
    
    % Modulate the data in 16QAM
    [data1_I,data1_Q] = qam16(data_split_1);
    [data2_I,data2_Q] = qam16(data_split_2);

% Create the frame
    if (mod(fr-1, refresh_fr) == 0) % Type SYNCH
        frame1_I = [guard_symbols_I tr_sync1_I tr1_I guard_symbols_I  tr1_I data1_I];
        frame1_Q = [guard_symbols_Q tr_sync1_Q tr1_Q guard_symbols_Q  tr1_Q data1_Q];
        frame2_I = [guard_symbols_I tr_sync1_I tr2_I guard_symbols_I  tr2_I data2_I];
        frame2_Q = [guard_symbols_Q tr_sync1_Q tr2_Q guard_symbols_Q  tr2_Q data2_Q];
        actual_len = Lf_sync;
    else   % Type REGULAR
        frame1_I = [guard_symbols_I tr1_I guard_symbols_I  tr1_I data1_I];
        frame1_Q = [guard_symbols_Q tr1_Q guard_symbols_Q  tr1_Q data1_Q];
        frame2_I = [guard_symbols_I tr2_I guard_symbols_I  tr2_I data2_I];
        frame2_Q = [guard_symbols_Q tr2_Q guard_symbols_Q  tr2_Q data2_Q];   
        actual_len = Lf;
    end
    
    % Upsample
    frame1_I_up = upsample(frame1_I,L);
    frame1_Q_up = upsample(frame1_Q,L);
    frame2_I_up = upsample(frame2_I,L);
    frame2_Q_up = upsample(frame2_Q,L);

frame1_I_up = conv(frame1_I_up, pulse_shape);
    frame1_Q_up = conv(frame1_Q_up, pulse_shape);
    frame2_I_up = conv(frame2_I_up, pulse_shape);
    frame2_Q_up = conv(frame2_Q_up, pulse_shape);
    
    % Number of previous frames
    n_fr_sync = floor((fr-2)/refresh_fr) + 1;
    n_fr_reg =  (fr-1) - n_fr_sync;

n_out = n_fr_reg * Lf + n_fr_sync * Lf_sync + 1;
    
    s = 1;
    e = s + actual_len - 1;
    
    channel1_block(n_out:n_out+actual_len-1) = frame1_I_up(s:e) + j* frame1_Q_up(s:e);
    channel2_block(n_out:n_out+actual_len-1) = frame2_I_up(s:e) + j* frame2_Q_up(s:e);
    
end

% Save the output of the TX
save('TXOutput','channel1_block','channel2_block');

% Save data sent
f_id = fopen('transmit.dat', 'wb');
fwrite(f_id, data_sent, 'int16');
fclose(f_id);

disp('End')

figure;
Nc = 2;
Nr = 2;
subplot(Nc,Nr,1)

plot(data1_I,data1_Q,'k*')
hold on;
plot(frame1_I(1:guard_len),frame1_Q(1:guard_len),'rs');
plot(frame1_I(guard_len+1:guard_len+training_s_len),frame1_Q(guard_len+1:guard_len+training_s_len),'g*');
plot(frame1_I(guard_len+training_s_len+1:guard_len+training_s_len+training_len),frame1_Q(guard_len+training_s_len+1:guard_len+training_s_len+training_len),'bp');
grid on;
axis([-4 4 -4 4])
axis equal
legend('Data','Guard','Sync training seq','Ch estim. trainin seq');
title('Constellation');

subplot(Nc,Nr,2)
psd(pulse_shape,2048,Fs,1024,256);  
title('Pulse Shape Spectrum');

subplot(Nc,Nr,3)
plot(real(channel1_block)); 
hold on;
plot(imag(channel1_block),'r'); 
legend('I','Q');
title('Channel 1');

subplot(Nc,Nr,4)
psd(channel1_block,2048,Fs,1024,256);  
title('Spectrum of Channel 1');

figure;
Nc = 2;
Nr = 1;

subplot(Nc,Nr,1)
autocorr1 = abs(xcorr(tr_sync1_I+sqrt(-1)*tr_sync1_Q));
plot( autocorr1 );
hold on;
plot(training_s_len,autocorr1(training_s_len),'*r');
title('Autocorrelation of synchronization training sequence 1');

subplot(Nc,Nr,2)
cross = abs(xcorr((tr1_I+sqrt(-1)*tr1_Q),(tr2_I+sqrt(-1)*tr2_Q)));
plot(cross);
title('Crosscorrelation of training sequence 1 and 2');
hold on;
plot(training_len,cross(training_len),'*r');

基于Matlab的MIMO通信系统仿真相关推荐

  1. 基于matlab的mimo仿真,基于MATLAB的MIMO通信系统仿真报告.doc

    基于MATLAB的MIMO通信系统仿真报告 北京邮电大学 基于Matlab的MIMO通信系统仿真 班级: 姓名: 学号: 日 期: 目录 一. 概述3 (1)课设目的3 (2)数字通信系统概述3 二. ...

  2. 基于Matlab的MIMO通信系统仿真_Simulink实现

    瑞利衰落信道中使用空时分组码的BPSK调制的BER 1.2发1收 参数设置: 双极性信号元+1和-1,每符号含1bit; 采样时间=符号时间=1s; 采用基于数据帧的仿真计算模式,每帧中有2个采样值; ...

  3. matlab通信系统仿真设计课程设计,基于matlab的FM通信系统仿真设计与实现_课程设计报告...

    基于matlab的FM通信系统仿真设计与实现_课程设计报告 第 0 页 共 20 页第 0 页 共 20 第 0 页 共 20 页课程设计报告题 目 : 基于 matlab 的 FM 通信系统仿真设计 ...

  4. 基于matlab的am系统仿真论文,基于Matlab的AM通信系统仿真

    基于Matlab的AM通信系统仿真 分析当前通信类课程实验教学存在的问题,提出采用Matlab仿真来弥补实验室实验设备等的不足.利用Mat-lab的Simulink工具箱建立AM系统的两种仿真模型,包 ...

  5. matlab正交gold码的相关性,基于Matlab的CDMA通信系统仿真

    基于Matlab的CDMA通信系统仿真 1 绪 论 1.1课题背景及目的 20世纪60年代以来,随着民用通信事业的发展,频带拥挤问题日益突出.CDMA(Code Diveision Multiple ...

  6. qpsk通信系统在matlab下的仿真实现毕业设计(论文)开题报告,基于MATLAB的QPSK通信系统仿真设计毕业设计论文.doc...

    毕业设计论文 - PAGE \* MERGEFORMAT - PAGE \* MERGEFORMAT IV- 基于MATLAB的QPSK通信系统仿真设计 摘 要 随着移动通信技术的发展,以前在数字通信 ...

  7. m-qam matlab,基于matlab的M_QAM通信系统仿真.doc

    WORD格式可编辑 专业技术分享 课 程 设 计 任 务 书 学生班级: 通信0802班 学生姓名: 学号: 设计名称:基于matlab的M-QAM通信系统的仿真 起止日期:2011.6.21-201 ...

  8. 基于matlab的跳频系统的仿真,基于MATLAB的跳频通信系统仿真

    科技信息. 计算机与网络 基于MATLABIIJ3=IB频通信系统仿宜 莱芜职业技术学院 山东大学 赵守彬 [摘要]跳频通信是目前常见的扩频通信方式,广泛应用于民用和军事领域.本文通过MATLAB,对 ...

  9. 基于matlab的通信系统仿真的本科论文,基于MATLAB的TDM通信系统仿真设计.docx

    摘要:当前,通信技术越来越多的影响着我们的生活.数字通信系统凭借其抗干扰能力强.传输差错可控的特性已然成为当代通信技术的主流.本课题根据时分多路复用的基本原理,利用MATLAB软件的图形用户界面来模拟 ...

最新文章

  1. Clonezilla制作镜像时报错:extfsclone.c:bitmap free count err解决办法
  2. sshfs的挂载与卸载
  3. 开发文档模板_需求文档模板一堆什么样的适合你呢?
  4. 微信小程序开发——超链接或按钮点击跳转到其他页面失效
  5. IT工作者平日要做好自我调节
  6. Apple’s current market value is more than two trillion
  7. BZOJ 3166 set+可持久化trie树(OR 莫队)
  8. Windows官方系统镜像下载及相关介绍
  9. bootstrap中如何使div上下、垂直居中
  10. linux主机做racl,linux学习日记十一 账号管理与ACL权限设置
  11. 移动端事件--touch事件的分类、touch事件的event对象、 其他触摸事件
  12. VMware Workstation虚拟机备份及磁盘空间回收
  13. 小麦苗健康检查脚本说明(Oracle巡检脚本)
  14. 特斯拉将粉丝创意注册为商标 包括电动皮卡版书包
  15. 模型量化论文阅读#1----综述:A Survey of Quantization Methods for Efficient Neural Network Inference
  16. Java回顾-String/StringBuilder/StringBuffer
  17. qbo机器人软件总体情况
  18. 特殊符号(一)—反斜杠 ” \ “(旋转光标和倒计时的实现)
  19. 关于电商运营的XMind思维导图
  20. 从eboot菜单分析eboot功能实现原理

热门文章

  1. 你所表现的负责可能正是在逃避责任
  2. 谁在押注“脱口秀直播带货”?
  3. arcgis软件集合
  4. canvas 画布在主流浏览器中的尺寸限制详细介绍
  5. java simsimi_“小黄鸡”中文聊天机器人的详细说明.
  6. 五款开源虚拟化技术软件大推荐
  7. ImageJ学习手册
  8. WindowsLonghorn开启jade主题
  9. Elementui+Vue 后台主页面布局
  10. 在电子图版CAXA中定义自己的标题栏和图框