基于matlab的OFDM通信链路仿真,输出OFDM频谱,星座图,收发时域波形

简介: 基于matlab的OFDM通信链路仿真,输出OFDM频谱,星座图,收发时域波形

1.算法描述

   在通信系统中,信道所能提供的带宽通常比传送一路信号所需的带宽要宽得多。如果一个信道只传送一路信号是非常浪费的,为了能够充分利用信道的带宽,就可以采用频分复用的方法。 

   OFDM主要思想是:将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰(ISI) 。每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上可以看成平坦性衰落,从而可以消除码间串扰,而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。

    OFDM技术是HPA联盟(HomePlug Powerline Alliance)工业规范的基础,它采用一种不连续的多音调技术,将被称为载波的不同频率中的大量信号合并成单一的信号,从而完成信号传送。由于这种技术具有在杂波干扰下传送信号的能力,因此常常会被利用在容易受外界干扰或者抵抗外界干扰能力较差的传输介质中。

   一个OFDM符号之内包含多个经过相移键控(PSK)或者正交幅度调制(QAM)的子载波。

   一旦要把传输的比特分配到各个子载波上,某一种调制模式则将他们映射为子载波的幅度和相位,通常采用等效基带信号来描述OFDM的输出信号:

image.png

其中信号的实部和虚部分别对应OFDM的同相和正交分量,在实际系统可以分别与对应的c o s coscos分量和s i n sinsin分量相乘。

image.png

2.仿真效果预览
matlab2022a仿真如下:

3.png
4.png
5.png
6.png
7.png
8.png

3.MATLAB核心程序

 
XX=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);
 
for k=1:symbols_per_carrier;
 
    for i=1:IFFT_bin_length;
 
        XX(k,i+GI)=signal_after_IFFT(k,i);
 
    end
 
    for i=1:GI;
 
        XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀
 
    end
 
    for j=1:GIP;
 
        XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀
 
    end
 
end
 
time_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个OFDM符号长度为IFFT_bin_length+GI+GIP=660
 
%==============OFDM符号加窗==========================================
 
windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP);
 
for i = 1:symbols_per_carrier
 
windowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗  升余弦窗
 
end 
 
%========================生成发送信号,并串变换==================================================
 
windowed_Tx_data=zeros(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP);
 
windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:);
 
for i = 1:symbols_per_carrier-1 ;
 
    windowed_Tx_data((IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加
 
end
 
%=======================================================
 
Tx_data=reshape(windowed_time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1)';%加窗后 循环前缀与后缀不叠加 的串行信号
 
%=================================================================
 
temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);%加窗后 循环前缀与后缀不叠加 发送总位数
 
figure (2)
 
subplot(2,1,1);
 
plot(0:temp_time1-1,Tx_data );%循环前缀与后缀不叠加 发送的信号波形
 
grid on
 
ylabel('Amplitude (volts)')
 
xlabel('Time (samples)')
 
title('循环前后缀不叠加的OFDM Time Signal')
 
temp_time2 =symbols_per_carrier*(IFFT_bin_length+GI)+GIP;
 
subplot(2,1,2);
 
plot(0:temp_time2-1,windowed_Tx_data);%循环后缀与循环前缀相叠加 发送信号波形
 
grid on
 
ylabel('Amplitude (volts)')
 
xlabel('Time (samples)')
 
title('循环前后缀叠加的OFDM Time Signal')
 
%===============加窗的发送信号频谱=================================
 
symbols_per_average = ceil(symbols_per_carrier/5);%符号数的1/5,10行
 
avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10行数据,10个符号
 
averages = floor(temp_time1/avg_temp_time);
 
average_fft(1:avg_temp_time) = 0;%分成5段
 
for a = 0:(averages-1)
 
 subset_ofdm = Tx_data(((a*avg_temp_time)+1):((a+1)*avg_temp_time));%利用循环前缀后缀未叠加的串行加窗信号计算频谱
 
 subset_ofdm_f = abs(fft(subset_ofdm));%分段求频谱
 
 average_fft = average_fft + (subset_ofdm_f/averages);%总共的数据分为5段,分段进行FFT,平均相加
 
end
 
average_fft_log = 20*log10(average_fft);
 
figure (3)
 
subplot(2,1,2)
 
plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)%归一化  0/avg_temp_time  :  (avg_temp_time-1)/avg_temp_time
 
hold on
 
plot(0:1/IFFT_bin_length:1, -35, 'rd')
 
grid on
 
axis([0 0.5 -40 max(average_fft_log)])
 
ylabel('Magnitude (dB)')
 
xlabel('Normalized Frequency (0.5 = fs/2)')
 
title('加窗的发送信号频谱')
 
%====================添加噪声=================================
 
Tx_signal_power = var(windowed_Tx_data);%发送信号功率
 
linear_SNR=10^(SNR/10);%线性信噪比
 
noise_sigma=Tx_signal_power/linear_SNR;
 
noise_scale_factor = sqrt(noise_sigma);%标准差sigma
 
noise=randn(1,((symbols_per_carrier)*(IFFT_bin_length+GI))+GIP)*noise_scale_factor;%产生正态分布噪声序列
 
Rx_data=windowed_Tx_data +noise;%接收到的信号加噪声
 
%=====================接收信号  串/并变换 去除前缀与后缀==========================================
 
Rx_data_matrix=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);
 
for i=1:symbols_per_carrier;
 
    Rx_data_matrix(i,:)=Rx_data(1,(i-1)*(IFFT_bin_length+GI)+1:i*(IFFT_bin_length+GI)+GIP);%串并变换
 
end
 
Rx_data_complex_matrix=Rx_data_matrix(:,GI+1:IFFT_bin_length+GI);%去除循环前缀与循环后缀,得到有用信号矩阵
 
%==============================================================
 
%                      OFDM解码   16QAM解码
 
%=================FFT变换=================================
 
Y1=fft(Rx_data_complex_matrix,IFFT_bin_length,2);%OFDM解码 即FFT变换
 
Rx_carriers=Y1(:,carriers);%除去IFFT/FFT变换添加的0,选出映射的子载波
 
Rx_phase =angle(Rx_carriers);%接收信号的相位
 
Rx_mag = abs(Rx_carriers);%接收信号的幅度
 
figure(4);
 
polar(Rx_phase, Rx_mag,'bd');%极坐标坐标下画出接收信号的星座图
 
title('极坐标下的接收信号的星座图')
 
%======================================================================
 
[M, N]=pol2cart(Rx_phase, Rx_mag);
 
Rx_complex_carrier_matrix = complex(M, N);
 
figure(5);
 
plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图
 
title('XY坐标接收信号的星座图')
 
axis([-4, 4, -4, 4]);
 
grid on
 
%====================16qam解调=======================================
 
Rx_serial_complex_symbols=reshape(Rx_complex_carrier_matrix',size(Rx_complex_carrier_matrix, 1)*size(Rx_complex_carrier_matrix,2),1)' ;
 
Rx_decoded_binary_symbols=demoduqam16(Rx_serial_complex_symbols);
 
%============================================================
 
baseband_in = Rx_decoded_binary_symbols;
 
figure(6);
 
subplot(2,1,1);
 
stem(baseband_out(1:100));
 
title('输出待调制的二进制比特流')
 
subplot(2,1,2);
 
stem(baseband_in(1:100));
 
title('接收解调后的二进制比特流')
A91
相关文章
|
3月前
|
数据可视化
基于MATLAB的OFDM调制发射与接收仿真
基于MATLAB的OFDM调制发射与接收仿真
|
2月前
|
5G
基于IEEE 802.11a标准的物理层MATLAB仿真
基于IEEE 802.11a标准的物理层MATLAB仿真
174 0
|
2月前
|
算法
基于MATLAB/Simulink平台搭建同步电机、异步电机和双馈风机仿真模型
基于MATLAB/Simulink平台搭建同步电机、异步电机和双馈风机仿真模型
|
2月前
|
机器学习/深度学习 编解码 算法
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
基于OFDM技术的水下声学通信多径信道图像传输研究(Matlab代码实现)
145 8
|
2月前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
2月前
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
3月前
|
监控
基于MATLAB/Simulink的单机带负荷仿真系统搭建
使用MATLAB/Simulink平台搭建一个单机带负荷的电力系统仿真模型。该系统包括同步发电机、励磁系统、调速系统、变压器、输电线路以及不同类型的负荷模型。
461 5
|
3月前
|
机器学习/深度学习 边缘计算 算法
【无人机】无人机群在三维环境中的碰撞和静态避障仿真(Matlab代码实现)
【无人机】无人机群在三维环境中的碰撞和静态避障仿真(Matlab代码实现)
189 0
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
214 0
|
2月前
|
算法 定位技术 计算机视觉
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
【水下图像增强】基于波长补偿与去雾的水下图像增强研究(Matlab代码实现)
115 0

热门文章

最新文章