OFDM系统仿真【matlab源码】

实验原理 链接: https://blog.csdn.net/qq_44394952/article/details/122508495.
OFDM.m

//
clear all;
close all;
carrier_count = 200; % 子载波数
symbol_count = 100; %总符号数
ifft_length = 512; % IFFT长度
CP_length = 128; % 循环前缀
CS_length = 20; % 循环后缀
rate = [];
SNR =20;
bit_per_symbol = 4; 
alpha = 1.5/32; % 升余弦窗系数

% ================产生随机序列=======================

bit_length = carrier_count*symbol_count*bit_per_symbol;
bit_sequence = round(rand(1,bit_length))'; % 列向量

% =================串并转换==========================
% ==================16QAM调制=========================

% 1-28置零 29-228有效 229-285置零 286-485共轭 486-512置零 
carrier_position = 29:228;
conj_position = 485:-1:286;
bit_moded = qammod(bit_sequence,16,'InputType','bit');

figure(1);
scatter(real(bit_moded),imag(bit_moded));
title('调制后的星座图');
grid on;

% ===================IFFT===========================


ifft_position = zeros(ifft_length,symbol_count);
bit_moded = reshape(bit_moded,carrier_count,symbol_count);

figure(2);
stem(abs(bit_moded(:,1)));
grid on;

ifft_position(carrier_position,:)=bit_moded(:,:);
ifft_position(conj_position,:)=conj(bit_moded(:,:));
signal_time = ifft(ifft_position,ifft_length);

figure(3);
subplot(3,1,1)
plot(signal_time(:,1),'b');
title('原始单个OFDM符号');
xlabel('Time');
ylabel('Amplitude');
axis([0 500 -0.5 0.5])
% ==================加循环前缀和后缀==================
signal_time_C = [signal_time(end-CP_length+1:end,:);signal_time];
signal_time_C = [signal_time_C; signal_time_C(1:CS_length,:)]; % 单个完整符号为512+128+20=660

subplot(3,1,2);
plot(signal_time_C(:,1));
xlabel('Time');
ylabel('Amplitude');
title('加CP和CS的单个OFDM符号');
axis([0 500 -0.5 0.5])
% =======================加窗========================
signal_window = zeros(size(signal_time_C));
% 通过矩阵点乘
signal_window = signal_time_C.*repmat(rcoswindow(alpha,size(signal_time_C,1)),1,symbol_count);

subplot(3,1,3)
plot(signal_window(:,1))
title('加窗后的单个OFDM符号')
xlabel('Time');
ylabel('Amplitude');
axis([0 500 -0.5 0.5])

% ===================发送信号,多径信道====================
signal_Tx = reshape(signal_window,1,[]); % 并串转换,变成时域一个完整信号,待传输
signal_origin = reshape(signal_time_C,1,[]); % 未加窗完整信号
mult_path_am = [1 0.2 0.1]; %  多径幅度
mutt_path_time = [0 20 50]; % 多径时延
windowed_Tx = zeros(size(signal_Tx));
path2 = 0.2*[zeros(1,20) signal_Tx(1:end-20) ];
path3 = 0.1*[zeros(1,50) signal_Tx(1:end-50) ];
signal_Tx_mult = signal_Tx + path2 + path3; % 多径信号

figure(4)
subplot(2,1,1)
plot(signal_Tx)
title('单径下OFDM信号')
xlabel('Time/samples')
ylabel('Amplitude')
axis([0 1000 -0.5 0.5])

subplot(2,1,2)
plot(signal_Tx_mult)
title('多径下OFDM信号')
xlabel('Time/samples')
ylabel('Amplitude')
axis([0 1000 -0.5 0.5])

% =====================发送信号频谱========================

% 每个符号求频谱再平均,功率取对数
orgin_aver_power = 20*log10(mean(abs(fft(signal_time_C'))));

% ====================加窗信号频谱=========================

figure(5) % 归一化
orgin_aver_power = 20*log10(mean(abs(fft(signal_window'))));
plot((1:length(orgin_aver_power))/length(orgin_aver_power),orgin_aver_power)
hold on
axis([0 1 -40 5])
grid on
title('加窗信号频谱')

% ========================AWGN==========================

signal_power_sig = var(signal_Tx); % 单径发送信号功率
signal_power_mut = var(signal_Tx_mult); % 多径发送信号功率
SNR_linear = 10^(SNR/10);
noise_power_mut = signal_power_mut/SNR_linear;
noise_power_sig = signal_power_sig/SNR_linear;
noise_sig = randn(size(signal_Tx))*sqrt(noise_power_sig);
noise_mut = randn(size(signal_Tx_mult))*sqrt(noise_power_mut);
Rx_data_sig = signal_Tx+noise_sig;
Rx_data_mut = signal_Tx_mult+noise_mut;

% =======================串并转换==========================

Rx_data_mut = reshape(Rx_data_mut,ifft_length+CS_length+CP_length,[]);
Rx_data_sig = reshape(Rx_data_sig,ifft_length+CS_length+CP_length,[]);

% ====================去循环前缀和后缀======================

Rx_data_sig(1:CP_length,:) = [];
Rx_data_sig(end-CS_length+1:end,:) = [];
Rx_data_mut(1:CP_length,:) = [];
Rx_data_mut(end-CS_length+1:end,:) = [];

% =========================FFT=============================

fft_sig = fft(Rx_data_sig);
fft_mut = fft(Rx_data_mut);

% =========================恢复采样===========================
data_sig = fft_sig(carrier_position,:);
data_mut = fft_mut(carrier_position,:);

figure(6)
scatter(real(reshape(data_sig,1,[])),imag(reshape(data_sig,1,[])),'.')
grid on;
title('单径接收信号星座图')

figure(7)
scatter(real(reshape(data_mut,1,[])),imag(reshape(data_mut,1,[])),'.')
grid on;
title('多径接收信号星座图')

% =========================16QAM逆映射===========================

bit_demod_sig = reshape(qamdemod(data_sig,16,'OutputType','bit'),[],1);
bit_demod_mut = reshape(qamdemod(data_mut,16,'OutputType','bit'),[],1);

% =========================误码率===========================
error_bit_sig = sum(bit_demod_sig~=bit_sequence);
error_bit_mut = sum(bit_demod_mut~=bit_sequence);
error_rate_sig = error_bit_sig/bit_length;
error_rate_mut = error_bit_mut/bit_length;
rate = [rate; error_rate_sig error_rate_mut]

rcoswindow.m

function window=rcoswindow(alpha,bit_length)
    warning off;
    window = zeros(1,bit_length/2);
    t = 1:bit_length/2;
    T = bit_length/(2*(1+alpha));
    window(t) = 0.5*(1 - sin(pi/(2*alpha*T)*(t-T)));
    window(1:(1-alpha)*T) = 1;
    window=[fliplr(window) window]';
end
  • 41
    点赞
  • 288
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: MIMO-OFDM系统MATLAB仿真可以通过以下步骤实现: 1. 确定系统参数:包括发送和接收天线数量,调制方式,子载波数量等等。 2. 生成信道矩阵:可以通过随机生成复数矩阵来模拟多天线系统的信道矩阵。 3. 生成调制符号:通过将数据映射到调制符号来产生待发送的数据。 4. OFDM调制:通过将数据符号映射到子载波上来实现OFDM调制。 5. MIMO处理:将OFDM调制的符号通过信道矩阵进行MIMO处理。 6. 添加噪声:在接收端添加高斯噪声。 7. 解调:解调OFDM符号并将其映射回数据符号。 8. 计算误码率:将解调的数据符号与发送的数据进行比较以计算误码率。 以上是实现MIMO-OFDM系统MATLAB仿真的基本步骤。需要根据具体情况进行参数调整和代码实现。 ### 回答2: MIMO-OFDM系统是一种利用多输入多输出和正交频分复用等技术来提高无线通信效果的系统。通过使用MIMO的技术,可以在同一时间和频率上传输多个数据流,从而增加传输速度和容量;而OFDM则可以将高速数据流分为多个子载波进行传输,从而提高频谱利用率和系统鲁棒性。 在进行MIMO-OFDM系统matlab仿真时,需要进行以下步骤: 1. 构建仿真模型:首先需要构建系统的传输模型,包括信道模型、编码和调制方案等。可以使用Matlab中的Simulink软件来建立模型。在建立模型时,需要考虑信道噪声、多径传播和频率偏移等影响因素。 2. 生成随机数据:为了进行仿真,还需要生成随机的数据发送到系统中进行仿真。可以使用Matlab中的随机数发生器来生成符合要求的随机数据。 3. 进行信号传输和接收:在开始仿真前,需要设置好发送和接收节点的参数和初始状态。在仿真过程中,发送节点会将数据通过MIMO和OFDM技术进行编码和调制,然后通过无线信道传输到接收节点。接收节点则会对接收信号进行解调和译码操作,并将结果与发送的数据进行比较,得到系统的性能指标。 4. 分析仿真结果:仿真结束后,需要对仿真结果进行分析,得到系统的误码率、传输速率等性能指标,并对系统的改进进行探讨。 总之,MIMO-OFDM系统matlab仿真需要进行系统建模、数据生成、信号传输与接收、结果分析等多个步骤,需要注意各个参数的设置和影响因素的考虑,才能得到准确的仿真结果。 ### 回答3: MIMO (Multiple Input Multiple Output) OFDM (Orthogonal Frequency Division Multiplexing)系统是一种多天线技术,可以有效地提高通信系统的吞吐量和可靠性。在MIMO OFDM系统中,多个天线在同一时间传输多个子载波。这种技术可以最大化利用信道容量,提高数据传输的速率和可靠性。 MATLAB是一种用于数学计算和数据可视化的强大工具,同时也是一种用于通信系统仿真的流行软件。在MIMO OFDM系统仿真中,MATLAB是一种常用的工具。通过在MATLAB中进行MIMO OFDM系统仿真,则可以得到系统的模拟效果和性能表现。 在进行MIMO OFDM系统MATLAB仿真之前,首先需要确定仿真的模型和参数设置,包括天线的数量、子载波的数量、信噪比等。然后,在MATLAB中编写代码,进行信道估计、调制、解调等相关操作。在仿真模拟过程中,可以通过分析误码率、信噪比、码率等性能参数,评估MIMO OFDM系统的性能和效果。 MIMO OFDM系统MATLAB仿真能够帮助工程师和技术人员评估不同的参数设置对系统的性能影响,优化系统性能,提高系统的可靠性和吞吐量。同时,MATLAB仿真还可以帮助检测和解决通信系统中可能出现的问题和故障,从而提高整个通信系统的运行效率,提高用户的满意度和体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值