本文考虑OFDM系统在多径信道下的误码性能

代码

clc;close all;clear

%% Seting parameters
EbN0_list = 20:2:40;
Q_order_list = 2:2:10;
loopNumber = 10000;
fprintf('Qm\t EbN0 \t \t EsN0 \t \t SNR_Cal \t \t ser \t\t ser_theory\t\t\t ber\t\t nloop \t\t \n');
for iQorder = 1 : length(Q_order_list)
for iEbN0 = 1 : length(EbN0_list) %% Frame structure
N_Frame = 1;
N_Symbol = 1;
N_RB = 106;
N_SC_perRB = 12;
N_SC = N_RB * N_SC_perRB;
N_Ant = 1;
N_fft_order = floor(log2(N_RB * N_SC_perRB));
N_fft = 2^(N_fft_order+1);
N_cp = N_fft/8;
EbN0 = EbN0_list(iEbN0); %% Modulation
Q_order = Q_order_list(iQorder);
Qm = 2^Q_order;
N_bit = N_Frame * N_Symbol * N_RB * N_SC_perRB * Q_order; %% Noise Calculation
SNR = EbN0 + 10 * log10(Q_order); %% Loop
for iloop = 1 :loopNumber
data_bit_in = randi([0 1], 1, N_bit);
dataSymbolsIn = bi2de(reshape(data_bit_in, Q_order, N_bit/Q_order).', 'left-msb');
dataMod = qammod(dataSymbolsIn, Qm,'UnitAveragePower', true); %% Show Constellation
%scatterplotme(dataMod) %% Resource Mapping
RE_Grid = zeros(N_RB * N_SC_perRB,N_Symbol * N_Frame);
dataMod_tmp = reshape(dataMod,N_RB * N_SC_perRB,[]); %only data
Power_Scale = 1;
RE_Grid_all = Power_Scale * dataMod_tmp; %% IFFT add CP
frame_mod_shift = ifftshift(RE_Grid_all);
ifft_data = ifft(frame_mod_shift,N_fft)*sqrt(N_fft);
%ifft_data = ifft(frame_mod_shift)*sqrt(1272);
Tx_cd = [ifft_data(N_fft-N_cp+1:end,:);ifft_data];
time_signal = reshape(Tx_cd,[],1); %% Channel
power_RE = sum(sum(abs(RE_Grid_all).^2)) / N_RB / N_SC_perRB / N_Symbol / N_Frame;
power_tp = sum(sum(abs(ifft_data).^2)) / N_RB / N_SC_perRB / N_Symbol / N_Frame; %IFFT zero padding averages the true RE Power
N0 = power_RE .* 10.^(-SNR / 10);
white_noise_starand = 1/sqrt(2)*(randn(size(time_signal)) + 1j * randn(size(time_signal)));
nTap = 2;
taps = RayleighChanTaps(nTap);
% taps = [0.9,0.1];
time_signal_path = Multipath_channel(time_signal,taps);
TransmittedSignal = time_signal_path + sqrt(N0) * white_noise_starand; %% Receive and Sys
ReceivedSignal = TransmittedSignal;
hF = fftshift(fft(taps,N_fft)); %% FFT and Frame
frame_recieved_parallel = reshape(ReceivedSignal, N_fft + N_cp, []);
frame_Received = frame_recieved_parallel(N_cp + 1:end,:);
frame_Grid_fft = fft(frame_Received,N_fft) / sqrt(N_fft);
RE_Grid_all_fftshift = fftshift(frame_Grid_fft);
RE_Grid_all_fftshift_eq = fftshift(diag(1./hF)*RE_Grid_all_fftshift);
RE_Grid_all_Received = fftshift(RE_Grid_all_fftshift_eq(1:N_SC,:));
% figure(1)
% plot(abs(RE_Grid_all_fftshift(:,1)))
% figure(2)
% plot(abs(RE_Grid_all_fftshift_eq(:,1)))
% figure(3)
% plot(abs(abs(hF)))
% figure(4)
% plot(abs(abs(1./hF))) %% Demodulation
RE_PreDeMod = reshape(RE_Grid_all_Received,[],1);
dataSymbolsOut = qamdemod(RE_PreDeMod, Qm,'UnitAveragePower', true);
data_bit_out = reshape((de2bi(dataSymbolsOut, 'left-msb')).',1,[]);
power_RE_receid = sum(sum(abs(RE_PreDeMod).^2)) / N_RB / N_SC_perRB / N_Symbol / N_Frame;
snr_all(iQorder,iEbN0,iloop) = 10*log10(power_RE/(power_RE_receid - power_RE)); %% Result: Ser and Ber
%Ser
sym_err = length(find(dataSymbolsOut - dataSymbolsIn));
ser_all(iQorder,iEbN0,iloop) = sym_err / length(dataSymbolsOut);
%Ber
bit_error = sum(abs(data_bit_out - data_bit_in));
ber_all(iQorder,iEbN0,iloop) = bit_error / length(data_bit_out);
end
sers = mean(ser_all,3);
snrs = mean(snr_all,3);
bers = mean(ber_all,3);
sers_theory(iQorder,iEbN0) = QAM_SER_Theory(Qm,EbN0); fprintf('%dQAM\t%f\t %f\t %f\t %e\t\t%e\t\t%e\t\t%d\t\n', Qm, EbN0, SNR,snrs(iQorder,iEbN0),sers(iQorder,iEbN0),sers_theory(iQorder,iEbN0),bers(iQorder,iEbN0),loopNumber);
end
end figure(1)
semilogy(EbN0_list, bers(1,:), 'k--+');
hold on
grid on
semilogy(EbN0_list, bers(2,:), 'r--o');
semilogy(EbN0_list, bers(3,:), 'b--x');
semilogy(EbN0_list, bers(4,:), 'g--s');
xlabel('Eb/N0,dB');
ylabel('BER');
title('BER VERS SNR');
legend('QPSK','16QAM','256QAM','1024QAM'); figure(2)
semilogy(EbN0_list, sers(1,:), 'k--+');
hold on
grid on
semilogy(EbN0_list, sers(2,:), 'r--o');
semilogy(EbN0_list, sers(3,:), 'b--x');
semilogy(EbN0_list, sers(4,:), 'g--s');
xlabel('Eb/N0,dB');
ylabel('SER');
title('SER VERS SNR');
%SML = simulation, THR = theory
legend('QPSK','16QAM','256QAML','1024QAM');

用到的信道与过信道代码

function taps = RayleighChanTaps(nTap)
taps= 1/sqrt(2)*1/sqrt(nTap)*(randn(nTap,1) + 1j*randn(nTap,1));
taps = taps./sum(abs(taps));
end
function taps = ExponentialChanTaps(SampRateMHz, delaySprdNsec)
sampTimeNsec = 1000 / SampRateMHz; if delaySprdNsec == 0
Kmax = 0;
vark = 1;
else
Kmax = ceil(10 * delaySprdNsec/sampTimeNsec);
var0 = 1 - exp(- sampTimeNsec /delaySprdNsec);
k = (0:Kmax)';
vark = var0 * exp( -k *sampTimeNsec/delaySprdNsec);
end
stdDevReOrIm = sqrt(vark/2);
taps = stdDevReOrIm .*(randn(Kmax +1,1) + 1j*randn(Kmax+1,1));
end
function yt = Multipath_channel(xt,taps)
ht = taps;
xht = conv(ht,xt);
%yt = xht(end - length(xt)+1:end);
yt = xht(1:length(xt));
end

仿真结果

瑞利信道下的仿真结果,设置抽头系数为2,仿真次数设置1000次曲线才会平滑。

在瑞利信道和白噪声下的仿真结果对比

结果略

一个感兴趣的点是固定信噪比时误码性能随多径的数量是如何变化的,先保证最大时延扩展没有超过CP的长度。

结论分析

瑞利信道下的误码率曲线近似为直线,(很奇怪,难以理解)

反思

OFDM系统各种QAM调制阶数在多径信道下的误码性能仿真(暂存版本)的更多相关文章

  1. DVB-C系统中QAM调制与解调仿真

    本文简单记录一下自己学习<通信原理>的时候调试的一个仿真DVB-C(Cable,数字有线电视)系统中QAM调制和解调的程序.自己一直是研究"信源"方面的东西,所以对&q ...

  2. 对正交频分复用OFDM系统的理解

    OFDM系统 正交频分复用OFDM(Orthogonal Frenquency Division Multiplexing)是一种多载波调制技术. 基本思想:在发送端,它将高速串行数据经过串并变换形成 ...

  3. 多用户OFDM系统资源分配研究

    首先,OFDMA 是什么? OFDM 技术的基本原理是将无线信道划分为若干互相正交的子信道,把高速串行数据流转化为低速并行子数据流,低速并行子数据流在子信道上独立传输. OFDMA 是LTE的下行多址 ...

  4. 小小知识点(八)——星座图与PSK、QAM调制的关系

    星座图是对PSK和QAM调制相位和幅度的一种表示,让我们只关注被调制参量本身,而不管已调信号波形及其频率. 在信号传输仿真时也一样,我们只关注携带信息的幅值和相位,而不管信号的传输波形和频率.这就是为 ...

  5. 系统吞吐量、TPS(QPS)、用户并发量、性能測试概念和公式

    PS:以下是性能測试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高, ...

  6. 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...

  7. Django(博客系统):基于pycharm如何一个django工程下创建多个app

    背景:通常我们创建一个django系统时,为了把业务模块划分清楚往往会把一个独立的业务模块放到一个app中,如果多个独立的业务模块就会创建多个app,一般情况下为了更好的管理这些app,会把他们都存放 ...

  8. linux系统centOS7下搭建redis集群中ruby版本过低问题的解决方法

    问题描述: 在Centos7中,通过yum安装ruby的版本是2.0.0,但是如果有些应用需要高版本的ruby环境,比如2.2,2.3,2.4... 那就有点麻烦了,譬如:我准备使用redis官方给的 ...

  9. [漏洞分析]phpyun系统重装安全隐患#影响从phpyun4.2部分,4.3到4.5全版本

    0x00 之前在t00ls上看到的,漏洞原理很简单,但是都是细节问题,很值得去学习. 感谢bypass师傅. 也发了邮件给官方,但没有任何回复,估计是漏洞作者bypass师傅报备了吧.   0x01 ...

  10. 牛客网Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器

    不多说,直接上干货! 获取文件名称.获取文件路径.获取文件大小.获取文件修改时间 FileMethodDemo.java package zhouls.bigdata.DataFeatureSelec ...

随机推荐

  1. [转帖]适用于 Azure VM 的 TCP/IP 性能优化

    https://learn.microsoft.com/zh-cn/azure/virtual-network/virtual-network-tcpip-performance-tuning?con ...

  2. css3中的圆角border-radius

    css3的属性应该加上浏览器前缀 不同的浏览器内核不同,因此css的前缀不同. 常见的几种浏览器内核 火狐浏览器 Geoko内核 前缀是 -mox- 谷歌浏览器, Webkit内核 前缀是 -wekb ...

  3. 官宣!Python 开发者大会(PyCon US)提供在线订阅啦!

    今年一开年,我们就遇到了一个天大的"黑天鹅"事件,如今它已蔓延成为了一个全球性事件,而且似乎还要持续一段挺长的时间. 各行各业的人们都受到了牵连,各种计划和安排也要被迫作出调整.今 ...

  4. 解决VS选择运行“在证书存储区中找不到清单签名证书”

     转:https://www.cnblogs.com/190196539/archive/2011/12/03/2272861.html 解决"在证书存储区中找不到清单签名证书" ...

  5. app api 登录 流程 accessToken refreshToken 图解 过程分析

    随着app 增长 带动了 api 的增长,有了api 总是离不开登录,怎么实现简单安全的登录过程至关重要. 不让用户每次超时都输入密码,不在客户端保存账号密码 ,用户体验与安全至关重要. 没有绝对的安 ...

  6. 飞桨paddlespeech语音唤醒推理C INT8 定点实现

    前面的文章(飞桨paddlespeech语音唤醒推理C定点实现)讲了INT16的定点实现.因为目前商用的语音唤醒方案推理几乎都是INT8的定点实现,于是我又做了INT8的定点实现. 实现前做了一番调研 ...

  7. (C语言)每日代码||2023.12.25||函数传参,传入数组时传递的是数组首元素地址

    向函数传入某数组时,可以在函数内修改该数组的元素. #include <stdio.h> void test(char* p, char arr[]) { *p = 'h';//能改变 * ...

  8. 21.1 动态TLS--《Windows核心编程》

    应用程序通过调用一组4个函数来使用动态 TLS,这些函数实际上最经常为 DLL 所使用. 通常情况下,如果DLL使用 TLS,那么当它用 DLL_PROCESS_ATTACH 标志调用它的 DllMa ...

  9. TActionManager Delphi 超级方便的快捷键 草草

    delphi 中用快捷键 草 实在是 太简单了 . 自己摸索出来的 方法 --------------------------------------------------------------- ...

  10. MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket

    MySQL 报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket 一.错误现场还原: 下面我们通过三种方式 ...