(完整版)OFDMmatlab实现
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系统仿真及分析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同步算法
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实现
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
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(正交频分复用)是一种常用的调制解调技术,被广泛应用于无线通信和数字电视等领域。
在本篇文章中,我们将探讨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可见光通信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(正交频分复用)系统的解调,通常需要使用一系列函数来实现。
首先,你需要使用ifft函数来将接收到的频域信号转换为时域信号。
然后,你可能需要进行信道均衡和时域同步,这可以通过使用MATLAB中的相关函数来实现。
接下来,你需要使用fft函数将时域信号转换回频域信号,并且进行符号解调和解调映射。
最后,你可能需要进行信道译码和解交织操作,以及误码率性能评估等操作。
除了上述基本的操作外,具体的解调函数可能会根据你的系统设计和要求而有所不同。
在MATLAB中,你可以使用一些内置的通信工具箱函数来简化这些操作,比如使用comm.OFDMDemodulator来进行OFDM解调,或者使用通信工具箱中的其他相关函数来实现你的解调算法。
总的来说,在MATLAB中实现OFDM系统的解调涉及到频域到时域的转换、信道均衡、解调映射、译码等一系列复杂的操作,需要结合你具体的系统设计和需求来选择合适的函数和算法来实现。
希望这些信息能够帮助你更好地理解在MATLAB中实现OFDM系统的解调函数。
基于MATLAB的OFMD仿真实验-OFDM关键技术
Remove short trainings
test_fine_time_sync.m
Coarse vs. Fine Time Sync
Coarse sync:
Large Range (Rc) Multiplication: 2Rc
Fine sync:
Small Range (Rf) Multiplication: Rf NL
Fine Timing Synchronization
Tx training sequence c0, c1,......, cLTB 1
Rx match filter with
c0*
,
c1*
,
......,
c* LTB
1
OFDM Signal
c0*
Tsample c1*
Tsample ……
Tsample c*
LTB 1
Start index
Max()
Fine Timing Synchronization
conj
sum
Max
Cross correlation with long training sequence
Find the maximum correlated point
CFO has been compensated
test_channel_est.m test_channel_equ.m
Zero Forcing Equalization
Phase Compensation
test_phase_track.m
做补偿:*exp(-j*Phase) 这部分可以不作为重点
freq_data [52,Nsym]
Data subcarriers freq_data_syms [48, Nsym]
OFDM调制、解调的MATLAB实现
OFDM调制、解调的MATLAB实现
OFDM调制/解调的MATLAB实现
用MATLAB实现OFDM调制、解调,其中假设OFDM信号包含6个子载波。
这里简单的说明OFDM调制的方式,略去了交织、加窗等部分。
c=6; %子载波个数
bits=108; %每个信道的比特数
n=c*bits; %总的传送比特数
data=2*round(rand(1,n))-1;%产生信源数据
s=reshape(data,c,bits); %产生调制信号
tp=1:0.1:(1+10.8)-0.1;
for i=1:c
carrier(i,:)=cos(2*i*pi*tp);%产生载波信号bpsk-sig (i,:)=s(i,:).*carrier(i,:);%产生调制信号 fin(i,:)=ifft(bpsk-sig(i,:)); %对信号进行IFFT
end
%并串变换
transmit=reshape(fin,1,648);
%加噪声
snr=10;
rxdata=awgn(transmit,snr,’measured’);
%串并变换
rec=reshape(rxdata,c,bits);
for i=1:c
rd(i,:)=fft(rec(i,:)); %进行FFT处理
uncarry(i,:)=rd(i,:).*carrier(i,:); %解调
end
rdata=sign(real(uncarry)); %判决输出结果
%并串变换
rdout=reshape(rdata,1,648);
在MATLAB里运行上述程序后,读者自行比较rdout和data的数值。
ofdmmatlab仿真代码
ofdmmatlab仿真代码
OFDM(正交频分复用)是一种广泛应用于无线通信系统中的调制技术。
它通过将数据流分为多个子信道,并在每个子信道上传输正交的子载波来提高频谱效率和抗干扰能力。
MATLAB是一种常用的科学计算软件,可以用来进行OFDM系统的仿真和性能分析。
OFDM技术的原理是将高速数据流分成多个低速数据流,然后将每个低速数据流调制到正交的子载波上进行传输。
这些子载波之间彼此正交,可以避免干扰。
在接收端,通过对接收到的信号进行解调和合并,可以恢复出原始数据流。
在MATLAB中,可以使用通信工具箱中的函数来实现OFDM系统的仿真。
首先,需要设置OFDM系统的参数,如子载波数目、子载波间隔、保护间隔等。
然后,可以生成随机的数据流,并将其调制到各个子载波上。
接下来,可以添加信道模型,如多径衰落等,并对接收到的信号进行解调和合并。
最后,可以评估系统的性能,如误码率、信噪比等。
OFDM技术在无线通信中有许多应用,如Wi-Fi、LTE等。
它具有高频谱效率、抗干扰能力强等优点,能够提供高质量的数据传输和稳定的通信连接。
通过使用MATLAB进行OFDM系统的仿真,可以更好地理解和分析OFDM技术的性能特点,对于无线通信系统的设计和优化具有重要意义。
OFDM是一种重要的调制技术,能够提高无线通信系统的频谱效率和抗干扰能力。
MATLAB提供了丰富的函数和工具箱,可以用来进行OFDM系统的仿真和性能分析。
通过使用MATLAB进行仿真,可以更好地理解和分析OFDM技术的性能特点,对于无线通信系统的设计和优化具有重要意义。
ofdm的matlab例程
OFDM(Orthogonal Frequency Division Multiplexing)是一种无线通信技术OFDM (Orthogonal Frequency Division Multiplexing)是一种无线通信技术,它将多个数据流映射到不同的子载波上,从而实现高带宽和低干扰的传输。
以下是一个简单的OFDM MATLAB例程:```matlab参数设置N = 1024; 符号数M = 8; 子载波数SNR = 10; 信噪比(dB)data_length = 1000; 数据长度生成随机数据data = randi([0, 1], 1, data_length);初始化OFDM信号ofdm_signal = zeros(1, N);将数据映射到子载波上for i = 1:data_lengthsymbol_index = mod(i-1, M) + 1;ofdm_signal(symbol_index) = data(i);end添加循环前缀cp = randi([0, 1], 1, M);ofdm_signal = [cp, ofdm_signal];添加频偏补偿码pilot_sequence = randi([0, 1], 1, M);pilot_symbols = zeros(1, N);pilot_symbols(mod(1:N, M) + 1) = pilot_sequence;生成OFDM调制信号modulated_signal = ifft(fft(ofdm_signal).*fft(pilot_symbols));添加高斯白噪声noise = awgn(modulated_signal, SNR, 'measured');接收信号received_signal = ifft(fft(noise).*fft(pilot_symbols));received_signal = received_signal(M+1:end);去除循环前缀received_signal = received_signal(cp+1:end);解调并提取数据demodulated_signal = fft(received_signal).*fft(pilot_symbols);demodulated_data = real(ifft(demodulated_signal));计算误比特率error_bits = sum(abs(data - demodulated_data));ber = error_bits / data_length;disp(['误比特率:', num2str(ber)]);```这个例程首先生成随机数据,然后将其映射到子载波上,接着添加循环前缀、频偏补偿码和高斯白噪声。
基于MATLAB的OFMD仿真实验-OFDM系统设计1
GI, TG (frac of TU)
24.6%
SubC 1K/2K
spacing/Hz
(子载波间隔)
4K/8K
1⁄4, 1⁄32
1⁄8,
1⁄16,
1⁄4, 1⁄32
1⁄8,
1⁄16,
1⁄4,
1⁄6,
1⁄9
4, 464 1, 116
4,464, 2,232, 1,116
2,000
1/128, 1/32, 1/16, 19/256, 1/8, 19/128, 1/4.
(CFO):
f
f
tx c
f
rx c
Doppler Shift (多普勒偏移)
CFO Estimation & Compensation
(先估计出偏移然后补偿,然后就可以消除频偏CFO实现同步)
Time/Frequency Synchronization
Find the start point of OFDM symbols (ISI free) CFO Estimation & Compensation (ICI free)
Noise Figure
SNR -- Signal to Noise Ratio -- 信噪比
Tx/Rx process of OFDM system
Time Synchronization
(时间同步)
Inter-symbol Interference (ISI)
N
N
N
Find the start point of OFDM symbols
Physical Layer System Design
OFDM技术仿真(MATLAB代码)
第一章绪论1.1简述OFDM是一种特殊的多载波传输方案,它可以被看作是一种调制技术,也可以被当作一种复用技术。
多载波传输把数据流分解成若干子比特流,这样每个子数据流将具有低得多的比特速率,用这样的低比特率形成的低速率多状态符号再去调制相应的子载波,就构成多个低速率符号并行发送的传输系统。
正交频分复用是对多载波调制(MCM,Multi-Carrier Modulation)的一种改进。
它的特点是各子载波相互正交,所以扩频调制后的频谱可以相互重叠,不但减小了子载波间的干扰,还大大提高了频谱利用率。
符号间干扰是多径衰落信道宽带传输的主要问题,多载波调制技术包括正交频分复用(OFDM)是解决这一难题中最具前景的方法和技术。
利用OFDM技术和IFFT方式的数字实现更适宜于多径影响较为显著的环境,如高速WLAN 和数字视频广播DVB等。
OFDM作为一种高效传输技术备受关注,并已成为第4代移动通信的核心技术。
如果进行OFDM系统的研究,建立一个完整的OFDM系统是必要的。
本文在简要介绍了OFDM 基本原理后,基于MATLAB 构建了一个完整的OFDM动态仿真系统。
1.2 OFDM基本原理概述1.2.1 OFDM的产生和发展OFDM的思想早在20世纪60年代就已经提出,由于使用模拟滤波器实现起来的系统复杂度较高,所以一直没有发展起来。
在20世纪70年代,提出用离散傅里叶变换(DFT)实现多载波调制,为OFDM的实用化奠定了理论基础;从此以后,OFDM在移动通信中的应用得到了迅猛的发展。
OFDM系统收发机的典型框图如图1.1所示,发送端将被传输的数字信号转换成子载波幅度和相位的映射,并进行离散傅里叶变换(IDFT)将数据的频谱表达式变换到时域上。
IFFT变换与IDFT变换的作用相同,只是有更高的计算效率,所以适用于所有的应用系统。
其中,上半部分对应于发射机链路,下半部分对应于接收机链路。
由于FFT操作类似于IFFT,因此发射机和接收机可以使用同一硬件设备。
用MATLAB实现OFDM仿真分析-范本模板
3.1 计算机仿真仿真实验是掌握系统性能的一种手段。
它通过对仿真模型的实验结果来确定实际系统的性能。
从而为新系统的建立或系统的改进提供可靠的参考.通过仿真,可以降低新系统失败的可能性,消除系统中潜在的瓶颈。
优化系统的整体性能,衡量方案的可行性。
从中选择最后合理的系统配置和参数配置。
然后再应用于实际系统中。
因此,仿真是科学研究和工程建设中不可缺少的方法。
3.1.1 仿真平台●硬件CPU:Pentium III 600MHz内存:128M SDRAM●软件操作系统:Microsoft Windows2000 版本5。
0仿真软件:The Math Works Inc. Matlab 版本6。
5包括MATLAB 6.5的M文件仿真系统。
Matlab是一种强大的工程计算软件。
目前最新的6.x版本 (windows环境)是一种功能强、效率高、便于进行科学和工程计算的交互式软件包。
其工具箱中包括:数值分析、矩阵运算、通信、数字信号处理、建模和系统控制等应用工具程序,并集应用程序和图形于一便于使用的集成环境中。
在此环境下所解问题的Matlab语言表述形式和其数学表达形式相同,不需要按传统的方法编程。
Matlab的特点是编程效率高,用户使用方便,扩充能力强,语句简单,内涵丰富,高效方便的矩阵和数组运算,方便的绘图功能。
3.1。
2 基于MATLAB的OFDM系统仿真链路根据OFDM 基本原理,本文给出利用MATLAB编写OFDM系统的仿真链路流程。
串行数据经串并变换后进行QDPSK数字调制,调制后的复信号通过N点IFFT变换,完成多载波调制,使信号能够在N个子载波上并行传输,中间插入10训练序列符号用于信道估计,加入循环前缀后经并串转换、D /A后进入信道,接收端经过N点FFT变换后进行信道估计,将QDPSK解调后的数据并串变换后得到原始信息比特.本文采用MATLAB语言编写M文件来实现上述系统。
M文件包括脚本M文件和函数M文件,M文件的强大功能为MATLAB的可扩展性提供了基础和保障,使MATLAB能不断完善和壮大,成为一个开放的、功能强大的实用工具.M文件通过input命令可以轻松实现用户和程序的交互,通过循环向量化、数组维数预定义等提高M文件执行速度,优化内存管理,此外,还可以通过类似C++语言的面向对象编程方法等等。
ofdm功率谱 matlab
在Matlab中,你可以使用FFT和IFFT操作来创建OFDM(正交频分复用)信号的功率谱。
以下是一个基本的示例:```matlab% 参数设定N = 64; % 子载波数量CP = N/4; % 循环前缀长度t = 0:1/1000:1-1/1000; % 时间向量% 生成随机数据data = randi([0 1], N, 1);% IFFT操作生成OFDM符号x = ifft(data, N);% 添加循环前缀x = [x(end-CP+1:end), x];% 添加高斯白噪声x_noise = awgn(x, 20, 'measured');% FFT操作获取功率谱Pxx = abs(fft(x_noise));Pxx = Pxx(1:N+CP); % 只取有用信号部分Pxx = Pxx .^ 2 / N; % 功率谱归一化Pxx = Pxx(1:N); % 只取有用信号部分Pxx = Pxx ./ sum(Pxx); % 归一化功率谱% 绘制功率谱图figure;plot(t, Pxx);title('OFDM Power Spectrum');xlabel('Time (s)');ylabel('Power Spectral Density');```这个代码首先设定了一些参数,然后生成了随机数据,通过IFFT操作生成OFDM符号。
接着,它添加了一个循环前缀以增强抗多径干扰能力。
然后,添加了一些高斯白噪声。
然后,通过FFT操作获取了功率谱,并进行了归一化处理。
最后,它绘制了功率谱图。
Matlab实现OFDM调制
- - -Matlab实现OFDM调制一、实验目的1、进一步加深对matlab的了解和使用,熟练掌握matlab的相关库函数。
2、学习OFDM调制的原理,通过实验加深对其理解。
3、学会用matlab实现BPSK调制和QPSK调制。
二、实验原理OFDM调制原理:OFDM ——OFDM(Orthogonal Frequency Division Multiple*ing)即正交频分复用技术,实际上OFDM是MCM Multi-CarrierModulation,多载波调制的一种。
其主要思想是:将信道分成假设干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进展传输。
正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰 ICI 。
每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上的可以看成平坦性衰落,从而可以消除符号间干扰。
而且由于每个子信道的带宽仅仅是原信道带宽的一小局部,信道均衡变得相对容易。
在向B3G/4G演进的过程中,OFDM 是关键的技术之一,可以结合分集,时空编码,干扰和信道间干扰抑制以及智能天线技术,最大限度的提高了系统性能。
包括以下类型:V-OFDM,W-OFDM,F-OFDM,MIMO-OFDM,多带-OFDM。
三、实验容实验要求:(1)不加噪声时,调制出来的信号与原信号进展比照。
〔2〕加噪声时的误码率曲线图。
12、51200ibpsk=zeros(1,512*100);while m~=101ofdm(m,:)=bpsk(((m-1)*512+1):(m*512)); %将bpsk矩阵转化为100行512列的矩阵ofdmofdm(m,:)=ifft(ofdm(m,:),512); %OFDM调制,返回512点的逆向DFT cp(m,1:10)=ofdm(m,503:512); %添加长度为10的循环前缀,cp(m,11:end)=ofdm(m,:); %生成矩阵cp为100*〔512+10〕cpsend(((m-1)*(512+10)+1):(m*(512+10)))=cp(m,:);%cpspend为1*〔〔512+10)*100〕m=m+1;endcp1=cpsend; %没有添加噪声是调制生成的矩阵snr=-2:1:5; %信噪比ber=zeros(1,length(snr));light=1;for t=-2:1:5m=1; %解调while m~=101icp(m,:)=cpsend(((m-1)*512+m*10+1):(m*(512+10))); %去前缀10iofdm(m,:)=fft(icp(m,:),512); %将icp做返回512点的DFT iiofdm(((m-1)*512+1):(m*512))=iofdm(m,:); %iiofdm为1*〔512*100〕m=m+1;endfor n=1:(512*100)real_iiofdm=real(iiofdm(n));image_iiofdm=imag(iiofdm(n));distance1=sqrt((real_iiofdm+1)^2+image_iiofdm^2); %根据距离来判断是0还是1distance0=sqrt((real_iiofdm-1)^2+image_iiofdm^2);if distance1>=distance0ibpsk(n)=0;elseibpsk(n)=1;endendioriginal=ibpsk; %计算误码率flag=(original==ioriginal); %相等时flag为1,不相等时flag为0 error=numel(find(flag==0)); %统计0的个数ber(light)=error/51200; %计算误码率light=light+1;endsemilogy(snr,ber)BPSK调制的误码率曲线图:3、QPSK调制: f(00)= (1+i)/sqrt(2),f(01)= (-1+i)/sqrt(2),f(10)= (-1-i)/sqrt(2),f(11) =(1-i)/sqrt(2)。
MATLAB实验OFDM误码率仿真(AWGN)
和梳状导频两种,本次实验中插入的是块状导频,所谓的块状分布就是指导频在时域周期 性的分配给 OFDM 符号,这种导频分布模式特别适用于慢衰落的无线信道,由于训练符号包 含了所有的导频,所以在频域就不需要插值,因此这种导频分布模式对频率选择性衰落相 对不敏感。 4、 IFFT 和插入保护间隔: OFDM 信号的调制表达式和信号的 IFFT 的表达式相吻合, 所以 OFDM 信号的调制可以通过 IFFT 来实现。 由于无线信道存在多径时延现象, 从而会产生码间干扰, 为了克服这种影响,可以再每个 OFDM 符号前面加入一段循环前缀,理论上只要循环前缀的 长度大于最大时延扩展,则能克服多径时延,从而消除了码间干扰。加入循环前缀之后再 对信号进行并串转换,此时得到的信号就是待发送信号。 5、信道建模:得到的待发送信号要通过信道到达接收端,因此在理论研究中要进行信道建 模,从而模拟信号真实的传播环境。本次实验中涉及到的信道为 AWGN 信道和瑞利衰落信道 信号经过信道后要经历的处理大致为发射端的逆过程,与发射端不同的是,在接收端存在 信道估计。 6、信道估计:无线信道的基本特性就是存在不稳定性,信号经过信道后可能会产生多径时 延、多普勒频移、相偏等现象。因此信号经过信道后会产生严重的失真,如果在接收端我 们知道信道的特性,也就是说,我们知道信道对信号的影响,那么我们就能将信道对信号 的影响去除掉。而在接收端信道的特性是通过信道估计来得到的。信道估计一般可以分为 盲信道估计和非盲信道估计,前者即通过接收信号的统计特性来得到信道的特性,这种方 法计算比较复杂,而且精度不高;基于训练序列的信道估计即为在发送端发送一些已知的 序列,接收端利用这些已知序列的接收信号来对信道进行估计,传统的估计方法有 LS 算法 和 MMSE 算法。
四、实验报告要求
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。