基于Matlab模拟 AWGN 中16-QAM 的 OFDM 并计算 BER附完整代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测 雷达通信  无线传感器

信号处理 图像处理 路径规划 元胞自动机 无人机  电力系统

⛄ 内容介绍

基于Matlab模拟 AWGN 中16-QAM 的 OFDM 并计算 BER附完整代码

⛄完整代码

clear all

close all

clc

nbits = 208000;

modlevel = 2 ;

nbitpersym  = 52;   % number of bits per qam OFDM symbol (same as the number of subcarriers for 16-qam)

nsym        = 10^4; % number of symbols

len_fft     = 64;   % fft size

sub_car     = 52;   % number of data subcarriers

EbNo        = 0:2:15;

EsNo= EbNo+10*log10(52/64)+ 10*log10(64/80) +10*log10(4);

snr=EsNo - 10*log10((64/80));

M = modem.qammod('M',16); % modulation object

% Generating data

t_data=randint(nbitpersym*nsym*4,1,2);

qamdata=bi2de(reshape(t_data,4,520000).','left-msb');

maping = bin2gray(qamdata,'qam',16);

% modulating data

mod_data =1/sqrt(10)* modulate(M,maping);

% serial to parallel conversion

par_data = reshape(mod_data,nbitpersym,nsym).';

% pilot insertion

pilot_ins_data=[zeros(nsym,6) par_data(:,[1:nbitpersym/2]) zeros(nsym,1) par_data(:,[nbitpersym/2+1:nbitpersym]) zeros(nsym,5)] ;

% fourier transform time doamain data

IFFT_data =ifft(fftshift(pilot_ins_data.')).';

a=max(max(abs(IFFT_data)));

IFFT_data=IFFT_data./a; % normalization

% addition cyclic prefix

cylic_add_data = [IFFT_data(:,[49:64]) IFFT_data].';

% parallel to serial coversion

ser_data = reshape(cylic_add_data,80*nsym,1);

% passing thru channel

no_of_error=[];

ratio=[];

for ii=1:length(snr)

  

chan_awgn = awgn(ser_data,snr(ii),'measured'); % awgn addition

ser_to_para = reshape(chan_awgn,80,nsym).'; % serial to parallel coversion

cyclic_pre_rem = ser_to_para(:,[17:80]);   %cyclic prefix removal

FFT_recdata =a*fftshift(fft(cyclic_pre_rem.')).';    % freq domain transform

rem_pilot = FFT_recdata (:,[6+[1:nbitpersym/2] 7+[nbitpersym/2+1:nbitpersym] ]); %pilot removal

ser_data_1 =sqrt(10)* reshape(rem_pilot.',nbitpersym*nsym,1);  % serial coversion

z=modem.qamdemod('M',16);

demod_Data = demodulate(z,ser_data_1);  %demodulatin the data

demaping = gray2bin(demod_Data,'qam',16);

data1 = de2bi(demaping,'left-msb');

data2 = reshape(data1.',nbitpersym*nsym*4,1);

[no_of_error(ii),ratio(ii)]=biterr(t_data , data2) ; % error rate calculation

end

% plotting the result

semilogy(EbNo,ratio,'--*r','linewidth',2);

hold on;

theoryBer = (1/4)*3/2*erfc(sqrt(4*0.1*(10.^(EbNo/10))));

semilogy(EbNo,theoryBer ,'--b','linewidth',2);

axis([0 15 10^-5 1])

legend('simulated','theoritical')

grid on

xlabel('EbNo');

ylabel('BER')

title('Bit error probability curve for qam using OFDM');

⛄ 运行结果

⛄ 参考文献

[1] Tahir M . BER of OFDM using 16-QAM in AWGN[J].​

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个基于MATLAB的MIMO-OFDM通信系统仿真的示例代码: ```matlab %% 仿真参数设置 clc; clear all; close all; % 调制方式 modulation = '16qam'; % 子载波数目 numSubcarriers = 64; % 循环前缀长度 cpLength = 16; % 天线数 numTxAntennas = 2; numRxAntennas = 2; % 信噪比范围 snrRange = 0:2:20; % 仿真帧数 numFrames = 100; % 编码方式 trellis = poly2trellis(7, [133 171]); %% 构建通信系统模型 % OFDM调制解调器 ofdmMod = comm.OFDMModulator('FFTLength', numSubcarriers, ... 'CyclicPrefixLength', cpLength, 'NumGuardBandCarriers', [6;5], ... 'InsertDCNull', true, 'PilotInputPort', true, ... 'NumPilotCarriers', numSubcarriers/4, 'PilotCarrierIndices', ... [12;26;40;54], 'Windowing', true, 'WindowLength', 24, ... 'WindowName', 'Hanning', 'NormalizationMethod', 'power', ... 'AveragePower', 1); ofdmDemod = comm.OFDMDemodulator('FFTLength', numSubcarriers, ... 'CyclicPrefixLength', cpLength, 'NumGuardBandCarriers', [6;5], ... 'RemoveDCCarrier', true, 'PilotOutputPort', true, ... 'NumPilotCarriers', numSubcarriers/4, 'PilotCarrierIndices', ... [12;26;40;54], 'Windowing', true, 'WindowLength', 24, ... 'WindowName', 'Hanning', 'NormalizationMethod', 'power'); % 调制解调器 switch modulation case 'bpsk' mod = comm.BPSKModulator(); demod = comm.BPSKDemodulator(); case 'qpsk' mod = comm.QPSKModulator(); demod = comm.QPSKDemodulator(); case '16qam' mod = comm.RectangularQAMModulator('ModulationOrder', 16, ... 'BitInput', true); demod = comm.RectangularQAMDemodulator('ModulationOrder', 16, ... 'BitOutput', true); case '64qam' mod = comm.RectangularQAMModulator('ModulationOrder', 64, ... 'BitInput', true); demod = comm.RectangularQAMDemodulator('ModulationOrder', 64, ... 'BitOutput', true); otherwise error('不支持该调制方式'); end % 编码解码器 encoder = comm.TrellisEncoder(trellis); decoder = comm.TrellisDecoder(trellis, 'OutputDataType', 'double'); % MIMO信道 mimoChan = comm.MIMOChannel('SampleRate', 2e6, 'PathDelays', [0 1.5e-6], ... 'AveragePathGains', [0 -3], 'MaximumDopplerShift', 30, ... 'SpatialCorrelationSpecification', 'None', 'ReceiveCorrelationMatrix', ... eye(numRxAntennas), 'TransmitCorrelationMatrix', eye(numTxAntennas), ... 'NumTransmitAntennas', numTxAntennas, 'NumReceiveAntennas', numRxAntennas); % AWGN信道 awgnChan = comm.AWGNChannel('NoiseMethod', 'Signal to noise ratio (SNR)', ... 'SNR', 0); %% 开始仿真 % 误码率存储 ber = zeros(length(snrRange), 1); for snrIdx = 1:length(snrRange) awgnChan.SNR = snrRange(snrIdx); errorRate = comm.ErrorRate(); for frameIdx = 1:numFrames % 生成随机数据 data = randi([0 1], numSubcarriers*mod.InputBitPerSymbol*numTxAntennas, 1); % 编码 encodedData = encoder(data); % 调制 modData = mod(encodedData); % OFDM调制 ofdmData = ofdmMod(reshape(modData, numSubcarriers, [])); % MIMO发送 txSig = mimoChan(ofdmData.'); % AWGN信道 rxSig = awgnChan(txSig); % MIMO接收 rxOfdmData = mimoChan(rxSig); % OFDM解调 demodData = ofdmDemod(rxOfdmData).'; % 解调 demodulatedData = demod(demodData(:)); % 解码 decodedData = decoder(demodulatedData); % 计算误码率 errorStats = errorRate(data, decodedData); end % 存储误码率 ber(snrIdx) = errorStats(1); end %% 结果展示 % 绘制误码率曲线 figure; semilogy(snrRange, ber); title('MIMO-OFDM系统误码率曲线'); xlabel('信噪比(dB)'); ylabel('误码率'); grid on; ``` 此代码实现了一个基于16QAM调制的MIMO-OFDM通信系统的仿真,包括了调制解调、编码解码、OFDM调制解调、MIMO发送接收、AWGN信道等模块,并且可以绘制误码率曲线进行性能评估。您可以根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值