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 13:27:12 浏览: 175
这段代码的实现过程是:
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变化的曲线。
相关问题
clc;clf;clear; n=0; r=1; p=0; k=1; while r>=1.0e-5 n=n+1; p1=p+k/(2n-1)^2; fprintf('n=%.0f,p=%.10f\n',n,4*p1); p=p1; end这个代码为什么运行不了
这个代码可能是 MATLAB 的代码,但是在这个平台上不能直接运行。要想运行这个代码,你需要在本地下载并安装 MATLAB 软件,然后将代码复制粘贴到 MATLAB 的编辑器中,保存为 .m 文件,最后在 MATLAB 命令窗口中运行该文件。
此外,该代码中存在一些语法错误,可能需要进行修正才能正常运行。比如,while 循环条件中的 r 变量没有被初始化,可能需要先定义并赋值一个初始值,否则会出现错误。另外,变量 p 和 k 的赋值也没有给出,也需要进行修正。
clc;clear;clf; a = 314*exp(2); mu = 398600.4418; % 地球引力常数 t0 = 0; % 初始时间 tf = 2*pi*sqrt(a^3/mu); % 终止时间 dt = (tf - t0)/1000; % 时间步长 r0 = [14.4601 2.3155 12.9992]'; % 初始位置矢量 v0 = [-108.9716 20.9281 117.4898]'; % 初始速度矢量 y0 = [r0; v0]; % 定义ODE函数 odedef = @(t,y) [y(4:6); -mu/norm(y(1:3))^3.*y(1:3)]; % 初始化结果数组 y_all = zeros(10000, 6);y_all(1,:) = y0'; % 求解ODE方程 for i = 2:10000 [t,y] = ode45(odedef, [(i-1)*dt, i*dt], y_all(i-1,:)); % 存储结果 y_all(i:i+size(y,1)-1,:) = y; if size(y_all, 1) >= 10*size(y,1) break; end end % 绘制轨道图 figure; for i = 1:10 idx = (i-1)*size(y,1)+1:i*size(y,1); plot3(y_all(idx,1), y_all(idx,2), y_all(idx,3)); hold on; end axis equal; grid on; xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴'); title('地球卫星轨道图');此代码运行后只有一个轨道
这段代码是用 MATLAB 编写的,用于求解地球引力下的卫星轨道。其中,通过定义初始位置矢量和速度矢量,求解ODE方程得到卫星在地球引力下的运动轨迹。绘制轨道图的代码使用了 plot3 函数,在三维坐标系中绘制了卫星的轨道。根据代码中的参数设置,只绘制了一条轨道。如果想要绘制多个轨道,可以修改代码中的绘图循环部分,增加轨道的数量。
阅读全文