通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索
查看: 21785|回复: 6

[原理资料] OFDM原理总结及其仿真 [复制链接]

军衔等级:

  列兵

注册:2017-10-293
发表于 2019-7-13 09:41:19 |显示全部楼层
OFDM原理总结及其仿真


对OFDM的基本原理、优缺点进行介绍,总结了其关键技术。最后通过MATLB进行仿真,模拟一个完整的OFDM系统的收发过程。


原理

正交频分复用(OFDM)是一种高速的数据传输方式。它基本思想是在频域内将所给信道分成许多子信道,各个子信道之间保持正交。高速的数据流被分配到多个正交的子信道上进行传输,从而使子信道上的符号速率大幅度降低,单个数据符号的持续时间大大加长,因而具备了较强的抗时延扩展能力,降低了由于高速传输容易引起的符号间干扰(ISI)的影响。通常在OFDM 符号送入信道前加保护间隔,只要保护间隔大于信道的最大时延扩展,那么理论上就可以完全消除 ISI 的影响,而通常的做法是加入循环前缀(CP),在有的系统中还加入循环后缀(CS),这是 OFDM 系统比较有特色的处理技术,在正交频分复用(OFDM)是多载波调制(MCM)技术的一种。多载波调制的基本思想是把数据流串并变换为N路速率较低的子数据流,用这些子数据流分别去调制N路子载波以后,再并行传输。由于子数据流的速率是原来速率的1/N,也就是说,符号周期扩大为原来的N倍,远大于信道的最大延迟扩展,这样,多载波调制就把一个宽带频率选择性信道划分成了N个窄带平坦衰落信道,这样均衡比较简单,从而具有很强的抗多径衰落以及抗脉冲干扰的能力,这样特别适合于高速无线数据传输。OFDM是一种子载波相互混叠的多载波调制,因此它除了具有上述多载波调制的优势外,还具有更高的频谱利用率。OFDM选择时域相互正交的子载波,它们虽然在频域互相混叠,却仍能在接收端被分离出来。

加扰的目的主要在于:

1、减小临小区间的干扰。在发送端用小区专用扰码序列进行加扰,接收端再进行解扰,只有本小区内的UE才能根据本小区的ID形成的小区专用扰码序列对接收到得本小区内的信息进行解扰。

2、将干扰信号随机化。设计数字通信系统时,通常假设信源序列是随机序列,而实际信源发出的序列不一定满足此条件,尤其出现长0串时,给接收端提取信号带来一定困难。通常,接收端的码元同步信号是从接收到的数字信号的“0”和“1”的交变时刻中提取的,如果序列中经常出现长游程(0或1游程),则将会长时间不出现“0”和“1”码元的交变点,从而影响码元同步的建立和保持。因此,需要对信源序列进行扰码处理,使其随机化。扰码可以减少连“0”或连“1”的长度,保证接收机能提取到定时信号。

交织:

交织编码的目的是把一个较长的突发差错离散成随机差错,再用纠正随机差错的编码(FEC)技术消除随机差错。交织深度越大,则离散度越大,抗突发差错能力也就越强。但交织深度越大,交织编码处理时间越长,从而造成数据传输时延增大,也就是说,交织编码是以时间为代价的。因此,交织编码属于时间隐分集。在实际移动通信环境下的衰落,将造成数字信号传输的突发性差错。利用交织编码技术可离散并纠正这种突发性差错,改善移动通信的传输特性。

映射器:

信息与表示和承载它的信号之间存在着对应关系,这种关系称为"映射",接收端正是根据事先约定的映射关系从接收信号中提取发射端发送的信息的。信息与信号间的映射方式可以有很多种,不同的通信技术就在于它们所采用的映射方式不同。实际上,数字调制的主要目的在于控制传输效率,不同的数字调制技术正是由其映射方式区分的,其性能也是由映射方式决定的。

一个数字调制过程实际上是由两个独立的步骤实现的:映射和调制,这一点与模拟调制不同。映射将多个二元比特转换为一个多元符号,这种多元符号可以是实数信号(在ASK调制中),也可以是二维的复信号(在PSK和QAM调制中)。例如在QPSK调制的映射中,每两个比特被转换为一个四进制的符号,对应着调制信号的四种载波。多元符号的元数就等于调制星座的容量。在这种多到一的转换过程中,实现了频带压缩。应该注意的是,经过映射后生成的多元符号仍是基带数字信号。经过基带成形滤波后生成的是模拟基带信号,但已经是最终所需的调制信号的等效基带形式,直接将其乘以中频载波即可生成中频调制信号。

导频:

导频符号用于接收端做信道估计。导频也称之为导频训练序列,训练的意思就是在正式发送数据之前,先给系统训练训练,让它知道周围的通讯环境是怎样的,然后在正式发送数据时,发射端就可以根据这些信息(称为信道状态信息)做出相应的调整,从而达到较好的通信性能。用导频获取信道状态信息的这个过程就叫做信道估计。

特点

OFDM 系统较单载波系统和其他多载波系统突出了下述优势:

(1)频谱利用率高:为了将子信道分离,通常的做法是增加一些保护频带,但是这样会导致频谱利用率降低,而 OFDM 采用将信号调制到相互正交的子载波上的方式,其频谱部分重叠的正交子载波可以作为子信道,在很大程度上优化了系统性能。(2)具有良好的抵抗多径效应的能力:利用保护间隔处理多径效应的 OFDM系统,使其具有很大的优势。(3)很强的抗衰落能力:由于多个正交的子载波信号传输信息,比单载波信号的传输时间消耗更长,这使得在信道衰落和脉冲噪声的环境下 OFDM 可以更好地对抗衰落。由于 OFDM 在发送端用多个正交子载波实现信号发射,并且不同的子载波相互正交,拥有不一样的衰落概率。实现了频率分级,强化了系统抗频率选择性衰落的能力。

当然 OFDM 也存在以下不可忽视的缺点:(1)OFDM 的子载波数目比较多,导致它的峰均值比很大,通常高于 12dB,这降低了射频信号放大器的功率效率,要求发射机射频放大器具有良好的线性范围。相比而言,单载波系统的峰均值比较小,通常低于 8dB。(2)OFDM 系统对定时误差和频偏误差比较敏感,这是因为子载波之间存在频谱的重叠并且要求是严格的正交关系,很小的频偏就会破坏这种正交关系,导致系统性能降低。

关键技术

                在具体实际应用中,OFDM 系统需要解决的关键问题,主要包括时频同步技术、信道估计技术、降低峰均比技术、信道编解码技术和自适应技术这五个关键技术点。

(1)时频同步                OFDM 系统对载波频率偏移特别敏感,由失真和多普勒频移造成的频率偏移会对 OFDM 系统子载波间的正交性造成破坏,因此 OFDM 系统的收发两端必须满足严格同步,即对同步精度的要求极高。OFDM 系统中的同步技术包括载波同步、样值同步、符号帧定时同步,载波同步旨在同步 OFDM 系统收发端的载波频率,样值同步旨在同步收发端的取样时刻,符号帧定时同步旨在判决接收信号中每个 OFDM 符号块的起始位置。

(2)信道估计                信道估计对相干检测至关重要,其准确程度直接影响到 OFDM 系统性能,因此对 OFDM 系统当前信道的特性进行估计并校正信道频偏非常有必要。信道估计是基于物理信道对输入信号造成的频偏影响进行的定性研究过程,将信道对输入信号的影响(在幅度和相位上产生的畸变)计算出数学表达式,预先获知信道时域或频域的传输特性,根据其影响数值特性对信道进行还原校正,进而达到正确解调的目的。信道估计算法一般包含有时域信道估计算法、频域信道估计算法、基于参数化的信道估计算法和信道估计同步联合算法,在无线通信中,一般采取基于导频的估计算法。

(3)降低峰均比                对峰值平均功率比是 OFDM 系统的主要弱点之一,降低峰均功率比是本文讨论的一个要点。在 OFDM 系统中,所有子信道的信号相叠加的瞬时最大值为最大峰值功率,该功率与信号的平均功率之比称为峰值平均功率比(Peak to Average PowerRatio,PAPR),简称峰均比。由于功率放大器的动态范围都是有限的,输入信号幅值溢出动态范围的部分会进入非线性区域,使信号发生非线性失真,导致各子信道信号间的正交性被破坏,严重影响系统性能。

(4)信道编解码                信道编码可提高数字通信系统的抗选择性衰落能力和抗突发干扰的能力,实现可靠传输,OFDM 信道编码包括随机化、纠错编码和交织处理三部分。随机化旨在避免传输信号数据出现连续 0 或 1 的数据流,将数据转换成相对随记的数据流,保证编码器能正常工作。纠错编码旨在为传输的信号数据中加入有规律的冗余数据,通过纠错译码算法将受到干扰导致错误的数据校正,使得无线通信系统消除无线环境中的干扰与影响。交织处理旨在将数据流按规律重新排列,当出现突发错误时,通过解交织将连续的突发错误数据流转换为相对均匀的随机错误,提高译码器正确译码的概率。现行的信道编码技术包括有如分组码、卷积码、网格编码调制(TCM)和Turbo 码等。

(5)自适应调制技术                宽带无线传输信道的基本特点是频率选择性衰落,信道对信号的不同频率成分衰落程度不同,若在 OFDM 系统的各子信道上使用相同的调制方式和传输功率,那么深衰落子信道的误码率会非常高。因此,研究自适应调制技术有相当的必要性在信道条件好的子信道分配更高的输出功率和传输更多的数据信息,在信道条件差的子信道较低的输出功率和分配较少的数据信息,以达到通过控制信息传输速率和发送功率来优化整个系统效率的目的,这一项技术称为自适应比特和功率分配,也叫自适应调制技术。在自适应调制技术中需要考虑的参数有很多,包括如信道估计误差、信道延迟和时间间隔等。

仿真

使用MATLAB进行仿真,我的版本为MATLAB2019a,相关设置如下图所示:

完整的代码为:

main.m

clear all;
close all;
carrier_count=200;      %子载波数
symbols_per_carrier=12; %每子载波含符号数
bits_per_symbol=4;      %每符号含比特数,16QAM调制
IFFT_bin_length=512;    %FFT点数
PrefixRatio=1/4;        %保护间隔与OFDM数据的比例 1/6~1/4
GI=PrefixRatio*IFFT_bin_length ;    %每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length  即保护间隔长度为128
beta=1/32;                          %窗函数滚降系数
GIP=beta*(IFFT_bin_length+GI);      %循环后缀的长度20
SNR=15;                             %信噪比dB
%==================================================
%================信号产生===================================
baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;  %所输入的比特数目  200*12*4
carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2));%共轭对称子载波映射  复数数据对应的IFFT点坐标
conjugate_carriers = IFFT_bin_length - carriers + 2;%共轭对称子载波映射  共轭复数对应的IFFT点坐标
rand( 'twister',0);
%rng('default')
baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流
%==============16QAM调制====================================

complex_carrier_matrix=qam16(baseband_out);%列向量
%complex_carrier_matrix=qpsk(baseband_out);
complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';%symbols_per_carrier*carrier_count 矩阵

figure(1);
plot(complex_carrier_matrix,'*r');%16QAM调制后星座图
title('16QAM调制后星座图');
axis([-4, 4, -4, 4]);
grid on   %显示网格线
%=================IFFT===========================
IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);%添0组成IFFT_bin_length IFFT 运算
IFFT_modulation(:,carriers ) = complex_carrier_matrix ;%未添加导频信号 ,子载波映射在此处
IFFT_modulation(:,conjugate_carriers ) = conj(complex_carrier_matrix);%共轭复数映射
%========================================================
figure(2);
stem(0:IFFT_bin_length-1, abs(IFFT_modulation(2,1:IFFT_bin_length)),'b*-')%第一个OFDM符号的频谱
grid on
axis ([0 IFFT_bin_length -0.5 4.5]);
ylabel('Magnitude');
xlabel('IFFT Bin');
title('OFDM Carrier Frequency Magnitude OFDM载波频率幅度');

figure(3);
plot(0:IFFT_bin_length-1, (180/pi)*angle(IFFT_modulation(2,1:IFFT_bin_length)), 'go')
hold on
stem(0:carriers-1, (180/pi)*angle(IFFT_modulation(2,1:carriers)),'b*-');%第一个OFDM符号的相位
stem(0:conjugate_carriers-1, (180/pi)*angle(IFFT_modulation(2,1:conjugate_carriers)),'b*-');
axis ([0 IFFT_bin_length -200 +200])
grid on
ylabel('Phase (degrees)')
xlabel('IFFT Bin')
title('OFDM Carrier Phase 第一个OFDM符号的相位')
%=================================================================

signal_after_IFFT=ifft(IFFT_modulation,IFFT_bin_length,2);%OFDM调制 即IFFT变换
time_wave_matrix =signal_after_IFFT;%时域波形矩阵,行为每载波所含符号数,列ITTF点数,N个子载波映射在其内,每一行即为一个OFDM符号
figure(4);
subplot(3,1,1);
plot(0:IFFT_bin_length-1,time_wave_matrix(2,:));%第一个符号的波形
axis([0, 700, -0.3, 0.3]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('OFDM Time Signal, One Symbol Period 第一个符号的时域波形');

%===========================================================
%=====================添加循环前缀与后缀====================================
XX=zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);%GI=128,GIP=20
for k=1:symbols_per_carrier %12
    for i=1:IFFT_bin_length %512
        XX(k,i+GI)=signal_after_IFFT(k,i);%129--640
    end
    for i=1:GI %1--128
        XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀  %后128个数据放到前面
    end
    for j=1:GIP
        XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀  前20个数据放到后面
    end
end

time_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个OFDM符号长度为IFFT_bin_length+GI+GIP=660
subplot(3,1,2);
plot(0:length(time_wave_matrix_cp)-1,time_wave_matrix_cp(2,:));%第一个符号添加循环前缀后的波形
axis([0, 700, -0.3, 0.3]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('OFDM Time Signal with CP, One Symbol Period 添加循环前缀后的波形');



%==============OFDM符号加窗==========================================
windowed_time_wave_matrix_cp=zeros(1,IFFT_bin_length+GI+GIP);
for i = 1:symbols_per_carrier %12
windowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗  升余弦窗
end  
subplot(3,1,3);
plot(0:IFFT_bin_length-1+GI+GIP,windowed_time_wave_matrix_cp(2,:));%第一个符号的波形
axis([0, 700, -0.3, 0.3]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('OFDM Time Signal Apply a Window , One Symbol Period 加窗后一个符号的波形');


%========================生成发送信号,并串变换==================================================
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+1IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加
end

%=======================================================
Tx_data_withoutwindow =reshape(time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1)';%没有加窗,只添加循环前缀与后缀的串行信号
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 (5)
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 = 0averages-1)
subset_ofdm = Tx_data_withoutwindow (((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 (6)
subplot(2,1,1);
plot((0avg_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('OFDM Signal Spectrum without windowing 未加窗发送信号频谱')
%===============加窗的发送信号频谱=================================
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 = 0averages-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);
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('Windowed OFDM Signal Spectrum 加窗的发送信号频谱')
%====================添加噪声============================================
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;%产生正态分布噪声序列

%noise=wgn(1,length(windowed_Tx_data),noise_sigma,'complex');%产生复GAUSS白噪声信号

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(7);
polar(Rx_phase, Rx_mag,'bd');%极坐标坐标下画出接收信号的星座图
title('极坐标坐标下画出接收信号的星座图');
%======================================================================


[M, N]=pol2cart(Rx_phase, Rx_mag); %将极坐标转化为直角坐标

Rx_complex_carrier_matrix = complex(M, N);%创建复数
figure(8);
plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图
axis([-4, 4, -4, 4]);
title('XY坐标接收信号的星座图');
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(9);
subplot(2,1,1);
stem(baseband_out(1:100));
subplot(2,1,2);
stem(baseband_in(1:100));
%================误码率计算=============================================
bit_errors=find(baseband_in ~=baseband_out);
print('错误bit数量为:');
bit_error_count = size(bit_errors, 2)
print('误比特率');
ber=bit_error_count/baseband_out_length

qam16.m

function [complex_qam_data]=qam16(bitdata)
%modulation of 16QAM,modulate bitdata to 16QAM complex signal
X1=reshape(bitdata,4,length(bitdata)/4)';
d=1;%min distance of symble
for i=1:length(bitdata)/4
    for j=1:4
        X1(i,j)=X1(i,j)*(2^(4-j));
    end
        source(i,1)=1+sum(X1(i,:));%convert to the number 1 to 16
end
mapping=[-3*d 3*d;
       -d  3*d;
        d  3*d;
      3*d  3*d;
     -3*d  d;
       -d  d;
        d  d;
      3*d  d;
     -3*d  -d;
       -d  -d;
        d  -d;
      3*d  -d;
     -3*d  -3*d;
       -d  -3*d;
        d  -3*d;
      3*d  -3*d];
for i=1:length(bitdata)/4
     qam_data(i,:)=mapping(source(i),:);%data mapping
end
complex_qam_data=complex(qam_data(:,1),qam_data(:,2));

rcoswindow.m

function [rcosw]=rcoswindow(beta, Ts)
%定义升余弦窗,其中beta为滚降系数,Ts为包含循环前缀的OFDM符号的长度,Ts为正偶数

t=0:(1+beta)*Ts;
rcosw=zeros(1,(1+beta)*Ts);
for i=1:beta*Ts
rcosw(i)=0.5+0.5*cos(pi+ t(i)*pi/(beta*Ts));
end
rcosw(beta*Ts+1:Ts)=1;
for j=Ts+1:(1+beta)*Ts+1
    rcosw(j-1)=0.5+0.5*cos((t(j)-Ts)*pi/(beta*Ts));
end
rcosw=rcosw';%变换为列向量

   

demoduqam16.m

function [demodu_bit_symble]=demoduqam16(Rx_serial_complex_symbols)
%将得到的串行16QAM数据解调成二进制比特流
complex_symbols=reshape(Rx_serial_complex_symbols,length(Rx_serial_complex_symbols),1);
d=1;
mapping=[-3*d 3*d;
       -d  3*d;
        d  3*d;
      3*d  3*d;
     -3*d  d;
       -d  d;
        d  d;
      3*d  d;
     -3*d  -d;
       -d  -d;
        d  -d;
      3*d  -d;
     -3*d  -3*d;
       -d  -3*d;
        d  -3*d;
      3*d  -3*d];
  complex_mapping=complex(mapping(:,1),mapping(:,2));
  for i=1:length(Rx_serial_complex_symbols)
      for j=1:16
          metrics(j)=abs(complex_symbols(i,1)-complex_mapping(j,1));
      end
      [min_metric  decode_symble(i)]= min(metrics) ;  %将离某星座点最近的值赋给decode_symble(i)
  end
  
  decode_bit_symble=de2bi((decode_symble-1)','left-msb');
   demodu_bit_symble=reshape(decode_bit_symble',1,length(Rx_serial_complex_symbols)*4);
      

多图预警😂

​图1 星座图

​图2 第一个OFDM符号的频谱

​图3 第一个OFDM符号的相位

​图4 第一个符号的波形

​图5 保护间隔

                虽然 OFDM 把高速率的信源数据流通过串并转换,变化成低速率的 N 路并行数据流,将符号周期扩展 N 倍,能够有效减少由多径信道带来的符号间干扰。但是仅仅通过串并转换并不能完全消除由多径信道带来的 ISI。为了保证 OFDM 系统的性能,人们引入了保护间隔,将其插在两个连续的 OFDM 符号之间。最开始通过补零的方式插入保护间隔,这种方式虽然能将两个连续的 OFDM 符号分开,但是也破坏了 OFDM 子载波间的正交性,会引入子载波间干扰。于是在 1980 年PELED 提出采用循环前缀作为保护间隔。循环前缀即是把 OFDM 符号后段的采样复制到最前端解决了 OFDM 插入补零间隔引起的子载波正交性被破坏的问题。加入的 CP 可以将信号与信道间的线性卷积转换为循环卷积 [48] ,只要循环前缀长度大于信道最大多径时延,便可以消除由多径信道带来的 ISI 和 ICI 问题。虽然插入循环前缀会降低系统传输比特的效率,但是其在抗多径方面的效果非常显著。

​图6 加窗

                FFT变换只能对有限长度的时域数据进行变换,因此,需要对时域信号进行信号截断。即使是周期信号,如果截断的时间长度不是周期的整数倍(周期截断),那么,截取后的信号将会存在泄漏。为了将这个泄漏误差减少到最小程度(注意我说是的减少,而不是消除),我们需要使用加权函数,也叫窗函数加窗主要是为了使时域信号似乎更好地满足FFT处理的周期性要求,减少泄漏。

​图7 接收端-极坐标星座图

​图8 接收端-直角坐标系星座图

        坐标轴的度量单位是角度。

1.星座图中,点到原点的距离代表的物理含义是:这个点对应信号的能量,离原点越远,意味着此信号能量越大。2.相邻两个点的距离称为欧氏距离,表示的是这种调制所具有的的抗噪声性能,欧氏距离越大,抗噪声性能越好。星座图里的点表示的是一种调制里可以判决的各种情况。比如一个简单的PSK来说,就2种判决,相位相差180度,两个点可以一个在正半轴,一个在负半轴。如果在星座图中,各个点离得越远,就是说明误判的可能性会变小。

从图8中可以看到有一些点处于边界区域,那么这些点就极有可能出现误判了。

​图9 发送端bit与接收端的对比

图9画出了200的bit,观察收发情况。仿真中共发送9600bit,出现错误的有16bit,误比特率为  0.17%

总结参考文献

[1]朱付强.OFDM系统中快速频谱检测关键技术研究[D].四川:电子科技大学,2018.

[2]向娟.车联网系统中OFDM同步与信道估计技术研究[D].四川:电子科技大学,2018.

[3]胡天晓.64QAM-OFDM系统的星座整形及实现[D].湖北:华中科技大学,2018.

[4] 李晓辉,付卫红,黑永强.LTE移动通信系统[M].西安.西安电子科技大学出版社. 2013.

[5]https://www.zhihu.com/question/23107539/answer/24882310

[6] https://zhuanlan.zhihu.com/p/24318554


举报本楼

军衔等级:

  新兵

注册:2020-8-2
发表于 2020-8-2 21:27:17 |显示全部楼层
1\IFFT_bin_length+GI

举报本楼

军衔等级:

  新兵

注册:2021-5-21
发表于 2021-5-21 21:52:46 |显示全部楼层
请问这个代码里面的哭脸表示什么字符啊

举报本楼

军衔等级:

  新兵

注册:2021-5-21
发表于 2021-5-21 21:53:02 |显示全部楼层
请问这个代码里面的哭脸表示什么字符啊

举报本楼

军衔等级:

  新兵

注册:2021-5-21
发表于 2021-5-22 21:53:24 |显示全部楼层
这里老报错该怎么改呀
%========================生成发送信号,并串变换==================================================
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+1IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_matrix_cp(i+1,:);%并串转换,循环后缀与循环前缀相叠加
end

%=======================================================

举报本楼

军衔等级:

  新兵

注册:2024-3-14
发表于 2024-3-14 16:04:17 |显示全部楼层
@zxsssss
根据我推测,代码里的哭脸符号应该是“:(”。

举报本楼

军衔等级:

  新兵

注册:2024-3-14
发表于 2024-3-14 16:49:15 |显示全部楼层
另外提醒一下大家,楼主发的是四个文件里的全部代码,如果想要运行要注意删除代码里的文件名,或者把楼主的全部代码分别放到四个文件里运行。

举报本楼

您需要登录后才可以回帖 登录 | 注册 |

Archiver|手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2024-3-29 20:55 , Processed in 0.367280 second(s), 15 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部