(完整版)OFDMmatlab实现

合集下载

ofdm调制流程matlab

ofdm调制流程matlab

ofdm调制流程matlab 下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!以下是使用 MATLAB 实现 OFDM 调制的基本流程:1. 参数设置:确定子载波数量、符号周期、循环前缀长度等参数。

基于MATLAB的OFDM系统仿真及分析

基于MATLAB的OFDM系统仿真及分析

基于MATLAB的OFDM系统仿真及分析OFDM(正交频分复用)是一种广泛应用于无线通信系统中的多载波调制技术。

在OFDM系统中,信号被分为多个独立的子载波,并且每个子载波之间正交。

这种正交的特性使得OFDM系统具有抗频率选择性衰落和多径干扰的能力。

本文将基于MATLAB对OFDM系统进行仿真及分析。

首先,我们需要确定OFDM系统的参数。

假设我们使用256个子载波,其中包括8个导频符号用于信道估计,每个OFDM符号的时域长度为128个采样点。

接下来,我们需要生成调制信号。

假设我们使用16QAM调制方式,每个子载波可以传输4个比特。

在MATLAB中,我们可以使用randi函数生成随机的比特序列,然后将比特序列映射为16QAM符号。

生成的符号序列可以通过IFFT(Inverse Fast Fourier Transform)将其转换为时域信号。

OFDM系统的发射端包括窗函数、导频符号插入、IFFT和并行到串行转换等模块。

窗函数用于增加OFDM符号之间的过渡带,导频符号用于信道估计和符号同步。

通过将符号序列与导频图案插入到OFDM符号序列中,然后进行IFFT变换,再进行并行到串行转换即可得到OFDM信号的时域波形。

接下来,我们需要模拟OFDM信号在信道中传输和接收。

假设信道是Additive White Gaussian Noise(AWGN)信道。

在接收端,OFDM信号的时域波形通过串行到并行转换,然后进行FFT(Fast Fourier Transform)变换得到频域信号。

通过在频域上对导频符号和OFDM信号进行正交插值,可以进行信道估计和等化。

最后将频域信号进行解调,得到接收后的比特序列。

通过比较发送前和接收后的比特序列,我们可以计算比特误码率(BER)来评估OFDM系统的性能。

比特误码率是接收到错误比特的比特数与总传输比特数之比。

通过改变信噪比(SNR)值,我们可以评估OFDM系统在不同信道条件下的性能。

基于matlab的ofdm同步算法

基于matlab的ofdm同步算法

05
基于matlab的ofdm同步算法 的实验结果与分析
实验一
总结词
本实验通过在MATLAB环境下设计并实现了 一种OFDM同步算法,对其性能进行了测试 和分析。
详细描述
本实验采用了基于MATLAB的OFDM同步算 法,通过模拟不同的信道环境和噪声等级, 对其性能进行了测试和分析。实验结果表明 ,该算法在低信噪比环境下性能优异,能够 有效地实现信号同步和数据传输。
OFDM同步算法的重要性
01
在OFDM系统中,同步算法对于 确保信号的正确接收和降低干扰 至关重要。
02
同步算法能够使接收端正确解调 信号,避免因相位偏差、时间偏 移等因素导致的性能下降。
OFDM同步算法的分类
01
根据不同的分类方法,OFDM同 步算法可以分为以下几类
02
1. 基于频域的同步算法:利用子 载波间的正交性,通过频域解调
实验三
总结词
本实验通过在MATLAB环境下设计并实现了一种OFDM 同步算法,对其信道估计性能进行了测试和分析。
详细描述
本实验采用了基于MATLAB的OFDM同步算法,通过模 拟不同的信道环境和噪声等级,对其信道估计性能进行 了测试和分析。实验结果表明,该算法在低信噪比环境 下能够准确估计信道状态信息,从而有效地提高信号传 输性能。
估计结果修正
考虑到估计误差和信道变化,需要对估计结果进 行修正,包括利用时变滤波器进行修正、利用判 决反馈进行修正等。
04
基于matlab的ofdm同步算法 的优化策略
基于matlab的OFDM系统模型的优化
总结词
提高系统性能
详细描述
OFDM系统模型是实现OFDM同步算法的基础,通过对系统模型进行优化,可以提高系统的整体性能 。具体来说,可以通过改进调制和解调的方式、优化信道估计和均衡的方法、降低系统复杂度等方式 来实现。

(完整版)OFDMmatlab实现

(完整版)OFDMmatlab实现

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/4GI=PrefixRatio*IFFT_bin_length ;%每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length 即保护间隔长度为128beta=1/32;%窗函数滚降系数GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度20SNR=15; %信噪比dB%==================================================%================信号产生===================================baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所输入的比特数目carriers = (1:carrier_count)+ (floor(IFFT_bin_length/4) - floor(carrier_count/2));%共轭对称子载波映射复数数据对应的IFFT点坐标conjugate_carriers = IFFT_bin_length —carriers + 2;%共轭对称子载波映射共轭复数对应的IFFT点坐标rand('state’,0);baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流%==============16QAM调制====================================complex_carrier_matrix=qam16(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调制后星座图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 onaxis ([0 IFFT_bin_length —0。

【matlab编程代做】OFDM

【matlab编程代做】OFDM

clc;clear;%参数初始化i=sqrt(-1);awgn=0; % 定义高斯信道se=0; % 估计技术nse=64; % OFDM载波个数ng=16; % 循环前缀长度SNR=[0 5 10 15 20 25 30 35 40]; % 信噪比mt=2; % 发送天线mr=2; % 接收天线pilot=[1:nse/ng:nse]; % 子带载波ds=5; % 信道延迟number=200;%====================================================================== N=50;fm=100;B=20e3;fd=(rand(1,N)-0.5)*2*fm;theta=randn(1,N)*2*pi;c=randn(1,N);c=c/sum(c.^2);t=0:fm/B:10000*fm/B;T_c=zeros(size(t));T_s=zeros(size(t));for k=1:NT_c=c(k)*cos(2*pi*fd(k)*t+theta(k))+T_c;T_s=c(k)*sin(2*pi*fd(k)*t+theta(k))+T_s;endr=ones(mt*mr,1)*(T_c.^2+T_s.^2).^0.5;index=floor(rand(mt*mr,ds)*5000+1);MEE1=zeros(1,length(SNR));MEE2=zeros(1,length(SNR));for snrl=1:length(SNR)snrlestimation_error1=zeros(mt*mr,nse);estimation_error2=zeros(mt*mr,nse);R1=besselj(0,2*pi*fm*(nse+ng)/B);sigma2=10^(-SNR(snrl)/10);aa=(1-R1^2)/(1-R1^2+sigma2);bb=sigma2*R1/(1-R1^2+sigma2);for iteration=1:numberif awgn==1h=ones(mt*mr,1);elsephi=rand*2*pi;h=r(index+iteration)*exp(j*phi);h=h.*(ones(mt*mr,1)*(exp(-0.5).^[1:ds]));h=h./(sqrt(sum(abs(h).^2,2))*ones(1,ds));end% 信道长度CL=size(h,2);data_time=zeros(mt,nse+ng);data_qam=zeros(mt,nse);data_out=zeros(mr,nse);output=zeros(mr,nse);for tx=1:mtdata_b=0*round(rand(4,nse));data_qam(tx,:)=j*(2*(mod(data_b(1,:)+data_b(2,:),2)+2*data_b(1,:))-3)+2*(mod(data_b(3,:)+data_b(4,:),2)+2*da ta_b(3,:))-3;for loop=1:mtdata_qam(tx,pilot+loop-1)=(1+j)*(loop==tx);enddata_time_temp=ifft(data_qam(tx,:));data_time(tx,:)=[data_time_temp(end-ng+1:end) data_time_temp];endfor rx=1:mrfor tx=1:mtoutput_temp=conv(data_time(tx,:),h((rx-1)*mt+tx,:));output(rx,:)=output_temp(ng+1:ng+nse)+output(rx,:);endnp=(sum(abs(output(rx,:)).^2)/length(output(rx,:)))*sigma2;noise=(randn(size(output(rx,:)))+i*randn(size(output(rx,:))))*sqrt(np);output(rx,:)=output(rx,:)+noise;data_out(rx,:)=fft(output(rx,:));end%信道估计H_act=zeros(mt*mr,nse);H_est1=zeros(mt*mr,nse);H_est2=zeros(mt*mr,nse);i=1;for tx=1:mtfor rx=1:mrH_est_temp=data_out(rx,pilot+tx-1)./data_qam(tx,pilot+tx-1);h_time=ifft(H_est_temp);h_time=[h_time zeros(1,nse-length(h_time))];H_est1((rx-1)*mt+tx,:)=fft(h_time);H_est2((rx-1)*mt+tx,:)=((aa*abs(H_est1((rx-1)*mt+tx,:))+bb*abs(H_est2((rx-1)*mt+tx,:)))....*H_est1((rx-1)*mt+tx,:))./abs(H_est1((rx-1)*mt+tx,:));if (tx>1)H_est1((rx-1)*mt+tx,:)=[H_est1((rx-1)*mt+tx,nse-tx+2:nse)H_est1((rx-1)*mt+tx,1:nse-tx+1)];H_est2((rx-1)*mt+tx,:)=[H_est2((rx-1)*mt+tx,nse-tx+2:nse)H_est2((rx-1)*mt+tx,1:nse-tx+1)];endH_act((rx-1)*mt+tx,:)=fft([h((rx-1)*mt+tx,:) zeros(1,nse-CL)]);error1=(abs(H_act((rx-1)*mt+tx,:)-H_est1((rx-1)*mt+tx,:)).^2);error2=(abs(H_act((rx-1)*mt+tx,:)-H_est2((rx-1)*mt+tx,:)).^2);estimation_error1((rx-1)*mt+tx,:)=estimation_error1((rx-1)*mt+tx,:)+error1;estimation_error2((rx-1)*mt+tx,:)=estimation_error2((rx-1)*mt+tx,:)+error2;endendendestimation_error1=estimation_error1/number;estimation_error2=estimation_error2/number;MEE1(snrl)=sum(sum(estimation_error1))/(mt*mr*nse);MEE2(snrl)=sum(sum(estimation_error2))/(mt*mr*nse);endplot(SNR,10*log10(MEE1));hold on;plot(SNR,10*log10(MEE2),'r');error1=(abs(H_act-H_est1).^2)./(abs(H_act).^2);error2=(abs(H_act-H_est2).^2)./(abs(H_act).^2);fig=4;i=1;figure(1);subplot(fig,1,i),plot([0:length(H_act)-1],abs(H_act)); i=i+1;subplot(fig,1,i),plot([0:length(H_est1)-1],abs(H_est1)); i=i+1;subplot(fig,1,i),plot([0:length(H_est2)-1],abs(H_est2)); i=i+1;subplot(fig,1,i),plot([0:length(error1)-1],error1); i=i+1;IFFT_bin_length=128;carrier_count=100;biT_s_per_symbol=2;symbols_per_carrier=12;LI=7 ;Np=ceil(carrier_count/LI)+1;N_number=carrier_count*symbols_per_carrier*biT_s_per_symbol; carriers=1:carrier_count+Np;GI=8;N_snr=40; % 每比特信噪比snr=8; %信噪比间隔X=zeros(1,N_number) ;XX=zeros(1,N_number) ;dif_bit=zeros(1,N_number) ;dif_bit1=zeros(1,N_number);dif_bit2=zeros(1,N_number);dif_bit3=zeros(1,N_number);X=randint(1,N_number) ;s=(X.*2-1)/sqrt(2) ;sreal=s(1:2:N_number) ;simage=s(2:2:N_number) ;%=========================================X1=sreal+j.*simage;train_sym=randint(1,2*symbols_per_carrier);t=(train_sym.*2-1)/sqrt(2);treal=t(1:2:2*symbols_per_carrier);timage=t(2:2:2*symbols_per_carrier);training_symbols1=treal+j.*timage;training_symbols2=training_symbols1.';training_symbols=repmat(training_symbols2,1,Np);pilot=1:LI+1:carrier_count+Np;if length(pilot)~=Nppilot=[pilot,carrier_count+Np];end%串并转换X2=reshape(X1,carrier_count,symbols_per_carrier).';%插入导频signal=1:carrier_count+Np;signal(pilot)=[];X3(:,pilot)=training_symbols;X3(:,signal)=X2;IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length); IFFT_modulation(:,carriers)=X3;X4=ifft(IFFT_modulation,IFFT_bin_length,2);%加保护间隔(循环前缀)for k=1:symbols_per_carrier;for i=1:IFFT_bin_length;X6(k,i+GI)=X4(k,i);endfor i=1:GI;X6(k,i)=X4(k,i+IFFT_bin_length-GI);endend%并串转换X7=reshape(X6.',1,symbols_per_carrier*(IFFT_bin_length+GI)); %信道模型:带多普勒频移的瑞利衰落信道fd=100; %多普勒频移r=6; %多径数a=[0.123 0.3 0.4 0.5 0.7 0.8]; %多径的幅度d=[2 3 4 5 9 13]; %各径的延迟T=1; %系统采样周期th=[90 0 72 144 216 288]*pi./180;%相移h=zeros(1,carrier_count);hh=[];for k=1:rh1=a(k)*exp(j*((2*pi*T*fd*d(k)/carrier_count)));hh=[hh,h1];endh(d+1)=hh;channel1=zeros(size(X7));channel1(1+d(1):length(X7))=hh(1)*X7(1:length(X7)-d(1)); channel2=zeros(size(X7));channel2(1+d(2):length(X7))=hh(2)*X7(1:length(X7)-d(2)); channel3=zeros(size(X7));channel3(1+d(3):length(X7))=hh(3)*X7(1:length(X7)-d(3)); channel4=zeros(size(X7));channel4(1+d(4):length(X7))=hh(4)*X7(1:length(X7)-d(4)); channel5=zeros(size(X7));channel5(1+d(5):length(X7))=hh(5)*X7(1:length(X7)-d(5)); channel6=zeros(size(X7));channel6(1+d(6):length(X7))=hh(6)*X7(1:length(X7)-d(6));Tx_data=X7+channel1+channel2+channel3+channel4;%加高斯白噪声Error_ber=[];%误比特率Error_ber1=[];Error_ber2=[];%误比特率Error_ber3=[];for snr_db=0:snr:N_snrcode_power=0;code_power=[norm(Tx_data)]^2/(length(Tx_data)); %信号的符号功率bit_power=code_power/biT_s_per_symbol; %比特功率noise_power=10*log10((bit_power/(10^(snr_db/10))));%噪声功率noise=wgn(1,length(Tx_data),noise_power,'complex');%产生GAUSS白噪声信号Y7=Tx_data+noise;%串并变换Y6=reshape(Y7,IFFT_bin_length+GI,symbols_per_carrier).';%去保护间隔for k=1:symbols_per_carrier;for i=1:IFFT_bin_length;Y5(k,i)=Y6(k,i+GI);endendY4=fft(Y5,IFFT_bin_length,2);Y3=Y4(:,carriers);%LS信道估计H=[];Y2=Y3(:,signal);Rx_training_symbols=Y3(:,pilot);Rx_training_symbols0=reshape(Rx_training_symbols,symbols_per_carrier*Np,1);training_symbol0=reshape(training_symbols,1,symbols_per_carrier*Np);training_symbol1=diag(training_symbol0);training_symbol2=inv(training_symbol1);Hls=training_symbol2*Rx_training_symbols0;Hls1=reshape(Hls,symbols_per_carrier,Np);HLs=[];HLs1=[];if ceil(carrier_count/LI)==carrier_count/LIfor k=1:Np-1HLs2=[];for t=1:LIHLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(t-1)./LI+Hls1(:,k);HLs2=[HLs2,HLs1];endHLs=[HLs,HLs2];endelsefor k=1:Np-2HLs2=[];for t=1:LIHLs1(:,1)=(Hls1(:,k+1)-Hls1(:,k))*(t-1)./LI+Hls1(:,k);HLs2=[HLs2,HLs1];endHLs=[HLs,HLs2];endHLs3=[];for t=1:mod(carrier_count,LI)HLs1(:,1)=(Hls1(:,Np)-Hls1(:,Np-1))*(t-1)./LI+Hls1(:,Np-1);HLs3=[HLs3,HLs1];end;HLs=[HLs,HLs3];endY1=Y2./HLs;%并串变换YY=reshape(Y2.',1,N_number/biT_s_per_symbol);YY1=reshape(Y1.',1,N_number/biT_s_per_symbol);%QPSK解调y_real=sign(real(YY));y_image=sign(imag(YY));y_re=y_real./sqrt(2);y_im=y_image./sqrt(2);y_real1=sign(real(YY1));y_image1=sign(imag(YY1));y_re1=y_real1./sqrt(2);y_im1=y_image1./sqrt(2);r00=[];r01=[];r10=[];r11=[];for k=1:length(y_real);r00=[r00,[y_real(k),y_image(k)]];end;for k=1:length(y_real1);r10=[r10,[y_real1(k),y_image1(k)]];end;for k=1:length(y_re);r01=[r01,[y_re(k),y_im(k)]];end;for k=1:length(y_re1);r11=[r11,[y_re1(k),y_im1(k)]];end;XX(find(r01>0))=1;%计算在不同信噪比下的误比特率并作图dif_bit=s-r01;dif_bit1=s-r11;ber_snr=0; %纪录误比特数for k=1:N_number;if dif_bit(k)~=0;ber_snr=ber_snr+1;endend;ber_snr1=0; %纪录误比特数for k=1:N_number;if dif_bit1(k)~=0;ber_snr1=ber_snr1+1;endendError_ber=[Error_ber,ber_snr]; Error_ber1=[Error_ber1,ber_snr1]; endBER=zeros(1,length(0:snr:N_snr)); BER1=zeros(1,length(0:snr:N_snr));BER=Error_ber./N_number;BER1=Error_ber1./N_number; figure(2);i=0:snr:N_snr;semilogy(i,BER,'-*r');hold on;semilogy(i,BER1,'-og');hold on;legend('无信道估计','线性信道估计');。

ofdm的matlab实现

ofdm的matlab实现

ofdm的matlab实现OFDM(正交频分复用)是一种常用的调制解调技术,被广泛应用于无线通信和数字电视等领域。

在本篇文章中,我们将探讨OFDM的基本原理,并介绍如何使用Matlab实现OFDM系统。

一、OFDM基本原理OFDM是一种基于频域的多载波调制技术,通过将高速数据流分成多个较低速的子流,并将这些子流分配到不同的频率载波上来传输数据。

通过这种方式,OFDM可以有效地抵抗频率选择性衰落和多径传播引起的时域间隔干扰,提供更好的抗干扰性能。

OFDM系统的主要构成部分包括信源、调制器(调制器和反调制器)和调制解调器(调制器和解调器)。

在发送端,调制器将输入数据流分为多个子流,并进行调制后输出。

在接收端,解调器对接收到的信号进行解调并还原为原始数据流。

OFDM调制器的实现主要依赖于以下两个关键概念:正交性和多载波调制。

1. 正交性:在OFDM系统中,子载波之间需要满足正交性条件,即相邻子载波之间的正弦波形式相互垂直,相位差为0或π。

这样可以确保子载波之间的干扰最小。

2. 多载波调制:OFDM系统中,将整个频率带宽划分为多个子载波,每个子载波都可以用不同的调制方式来传输数据。

常见的调制方式有BPSK、QPSK、16-QAM等。

二、Matlab实现OFDM系统下面我们将使用Matlab来实现OFDM系统。

按照OFDM系统的基本原理,需要完成以下几个步骤:1. 生成原始数据:首先,我们需要生成一组原始数据作为输入。

可以使用随机数生成器来生成一个指定长度的数据序列。

2. 子载波生成:根据系统设置,生成需要的子载波。

可以使用fft函数计算离散傅里叶变换,得到频域上的正弦波。

3. 数据调制:将原始数据按照设定的调制方式进行调制,得到对应的调制符号。

可以使用BPSK、QPSK或其他调制方式。

4. 倍频:将调制符号乘以子载波的复数载波,得到OFDM的时域信号。

5. CP(循环前缀)添加:为了避免多径效应引起的信号间干扰,在时域信号的开头添加一个与其末尾相同的循环前缀。

ofdm可见光通信matlab

ofdm可见光通信matlab

ofdm可见光通信matlabOFDM(正交频分复用)是一种多载波调制技术,广泛应用于无线通信系统中。

而可见光通信是一种基于光波的通信技术。

本文将结合MATLAB软件,探讨OFDM技术在可见光通信中的应用。

我们来了解一下OFDM技术。

OFDM技术是一种将高速数据流分成多个低速子流并同时传输的技术。

它能够充分利用频谱资源,提高系统的传输效率。

OFDM技术通过将数据流分成多个子流,每个子流都在不同的频率上进行调制,然后将这些子流通过并行传输的方式发送出去。

接收端收到这些子流后,再将它们合并起来,得到原始的数据流。

OFDM技术在无线通信系统中广泛应用,如Wi-Fi、LTE等。

可见光通信是一种利用可见光波进行数据传输的技术。

它的工作原理是通过调制可见光波的亮度或频率来传输信息。

可见光通信具有频谱资源丰富、无电磁波辐射、安全性高等优点,因此在室内定位、室内导航、智能照明等领域呈现出广阔的应用前景。

将OFDM技术与可见光通信相结合,可以充分利用OFDM技术的优势,提高可见光通信系统的传输效率和可靠性。

在OFDM可见光通信系统中,发送端将要传输的数据流分成多个子流,并将每个子流分别调制到不同的频率上。

然后,通过LED灯或其他可见光发射器将这些子流转化为可见光信号并发送出去。

接收端使用光电二极管等光电器件将接收到的可见光信号转化为电信号,并通过解调和合并子流的方式得到原始的数据流。

MATLAB是一种功能强大的数学软件,也是进行OFDM可见光通信系统仿真的常用工具。

通过MATLAB,我们可以模拟OFDM可见光通信系统的传输过程,并对系统的性能进行评估。

首先,我们需要建立OFDM可见光通信系统的模型,包括发送端和接收端。

发送端的主要任务是将数据流分成多个子流,并将每个子流调制到不同的频率上。

接收端的主要任务是接收可见光信号,并将其转化为电信号,并通过解调和合并子流的方式得到原始的数据流。

在MATLAB中,我们可以使用OFDM调制器和解调器模块来实现OFDM调制和解调的功能。

matlab ofdm解调函数

matlab ofdm解调函数

matlab ofdm解调函数
在MATLAB中进行OFDM(正交频分复用)系统的解调,通常需要使用一系列函数来实现。

首先,你需要使用ifft函数来将接收到的频域信号转换为时域信号。

然后,你可能需要进行信道均衡和时域同步,这可以通过使用MATLAB中的相关函数来实现。

接下来,你需要使用fft函数将时域信号转换回频域信号,并且进行符号解调和解调映射。

最后,你可能需要进行信道译码和解交织操作,以及误码率性能评估等操作。

除了上述基本的操作外,具体的解调函数可能会根据你的系统设计和要求而有所不同。

在MATLAB中,你可以使用一些内置的通信工具箱函数来简化这些操作,比如使用comm.OFDMDemodulator来进行OFDM解调,或者使用通信工具箱中的其他相关函数来实现你的解调算法。

总的来说,在MATLAB中实现OFDM系统的解调涉及到频域到时域的转换、信道均衡、解调映射、译码等一系列复杂的操作,需要结合你具体的系统设计和需求来选择合适的函数和算法来实现。

希望这些信息能够帮助你更好地理解在MATLAB中实现OFDM系统的解调函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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/4GI=PrefixRatio*IFFT_bin_length ;%每一个OFDM符号添加的循环前缀长度为1/4*IFFT_bin_length 即保护间隔长度为128beta=1/32;%窗函数滚降系数GIP=beta*(IFFT_bin_length+GI);%循环后缀的长度20SNR=15; %信噪比dB%==================================================%================信号产生=================================== baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;%所输入的比特数目carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2));%共轭对称子载波映射复数数据对应的IFFT点坐标conjugate_carriers = IFFT_bin_length - carriers + 2;%共轭对称子载波映射共轭复数对应的IFFT点坐标rand( 'state',0);baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流%==============16QAM调制====================================complex_carrier_matrix=qam16(baseband_out);%列向量complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_car rier)';%symbols_per_carrier*carrier_count 矩阵figure(1);plot(complex_carrier_matrix,'*r');%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);%共轭复数映射%========================================================stem(0:IFFT_bin_length-1, abs(IFFT_modulation(2,1:IFFT_bin_length)),'b*-')%第一个OFDM符号的频谱grid onaxis ([0 IFFT_bin_length -0.5 4.5]);ylabel('Magnitude');xlabel('IFFT Bin');title('OFDM Carrier Frequency Magnitude');figure(3);plot(0:IFFT_bin_length-1, (180/pi)*angle(IFFT_modulation(2,1:IFFT_bin_length)), 'go') hold onstem(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 onylabel('Phase (degrees)')xlabel('IFFT Bin')title('OFDM Carrier Phase')%================================================================= 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.2, 0.2]);grid on;ylabel('Amplitude');xlabel('Time');title('OFDM Time Signal, One Symbol Period');%===========================================================%=====================添加循环前缀与后缀====================================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);endfor i=1:GI;XX(k,i)=signal_after_IFFT(k,i+IFFT_bin_length-GI);%添加循环前缀endfor j=1:GIP;XX(k,IFFT_bin_length+GI+j)=signal_after_IFFT(k,j);%添加循环后缀endendtime_wave_matrix_cp=XX;%添加了循环前缀与后缀的时域信号矩阵,此时一个OFDM符号长度为IFFT_bin_length+GI+GIP=660subplot(3,1,2);plot(0:length(time_wave_matrix_cp)-1,time_wave_matrix_cp(2,:));%第一个符号添加循环前缀后的波形axis([0, 700, -0.2, 0.2]);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_carrierwindowed_time_wave_matrix_cp(i,:) =real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';%加窗升余弦窗endsubplot(3,1,3);plot(0:IFFT_bin_length-1+GI+GIP,windowed_time_wave_matrix_cp(2,:));%第一个符号的波形axis([0, 700, -0.2, 0.2]);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+1:(IFFT_bin_length+GI)*(i+1)+GIP)=window ed_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 onylabel('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 onylabel('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_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,平均相加endaverage_fft_log = 20*log10(average_fft);figure (6)subplot(2,1,1);plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)%归一化0/avg_temp_time : (avg_temp_time-1)/avg_temp_timehold onplot(0:1/IFFT_bin_length:1, -35, 'rd')grid onaxis([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 = 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,平均相加endaverage_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_timehold onplot(0:1/IFFT_bin_length:1, -35, 'rd')grid onaxis([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);%标准差sigmanoise=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)+GI P);%串并变换endRx_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');%极坐标坐标下画出接收信号的星座图%================================================================== ====[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]);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);bit_error_count = size(bit_errors, 2)ber=bit_error_count/baseband_out_length。

相关文档
最新文档