clear, clf %%%************** 参数设置 Nfft=128; % FFT size Nbps=2; M=2^Nbps; % Number of bits per (modulated) symbol Es=1; A=sqrt(3/2/(M-1)*Es); % Signal energy and QAM normalization factor N=Nfft; Ng=Nfft/4; %CP长度 Nofdm=Nfft+Ng; %OFDM符号长度+CP长度 Nsym=3; x=[]; Nps = 8; %梳状导频中非零值间隔 %%%%****频偏设置 CFO = 3.75; % CFO = 0; for m=1:Nsym msgint=randi([0 M-1],1,N); %bits_generator(1,Nsym*N,Nbps) if m<=2 Xp = add_pilot(zeros(1,Nfft),Nfft,Nps); Xf=Xp; % add_pilot Xf_temp = Xp; %后续会用到用于算整数倍频偏 else Xf = A.*qammod(msgint,M,'UnitAveragePower',true); end xt = ifft(Xf,Nfft); x_sym = add_CP(xt,Ng); x= [x x_sym]; end %************************* 信道 ************** %channel 可添加所需信道 y=x; % No channel effect %信号功率计算 sig_pow= y*y'/length(y); % Signal power calculation %%%%%%%%SNRdB设置 SNRdBs= 0:3:30; MaxIter = 1000; MSE_train = zeros(1,length(SNRdBs)); for i=1:length(SNRdBs) SNRdB = SNRdBs(i); MSE_CFO_CP = 0; MSE_CFO_train = 0; y_CFO= add_CFO(y,CFO,Nfft); % Add CFO %%%%多次迭代取平均 for iter=1:MaxIter %y_aw=add_AWGN(y_CFO,sig_pow,SNRdB,'SNR',Nbps); % AWGN added, signal power=1 y_aw = awgn(y_CFO,SNRdB,'measured'); % AWGN added, signal power=1 %%%%% 估计出来的频偏只能在[-0.5*D,0.5*D],也即[-0.5*Nps,0.5*Nps] Est_CFO_train = CFO_train_sim1(y_aw,Nfft,Nps); MSE_CFO_train = MSE_CFO_train + (Est_CFO_train-CFO)^2; end % the end of for (iter) loop MSE_train(i) = MSE_CFO_train/MaxIter; end%ebn0 end semilogy(SNRdBs, MSE_train,'-x'); xlabel('SNR[dB]'); ylabel('MSE'); title('CFO Estimation'); legend('时域训练序列')这段代码的实现过程
时间: 2024-01-17 09:27:12 浏览: 160
Source Insight官方Verilog,MATLAB,Python,ARM和PHP配置文件
这段代码的实现过程是:
1. 设置参数,包括FFT大小、调制方式、信号能量、循环前缀长度等。
2. 生成随机调制信号,并添加梳状导频,其中前两个OFDM符号使用全0梳状导频。
3. 对每个OFDM符号进行IFFT变换和添加循环前缀。
4. 将所有OFDM符号串联得到发送信号x。
5. 设置信道,本代码中不添加信道效应。
6. 计算发送信号的功率。
7. 设置SNR范围和迭代次数,对于每个SNR值和每次迭代,执行以下步骤:
a. 添加频偏,本代码中添加的是一个固定频偏值CFO。
b. 添加AWGN噪声。
c. 使用时域训练序列估计频偏。
d. 计算估计频偏与真实频偏之间的均方误差。
8. 绘制频偏估计的MSE随SNR变化的曲线。
阅读全文