本文继续进行 OFDM 通信连路仿真学习。
块状导频也称为训练序列
有关其他仿真细节原理知识可以参考我之前的博客:OFDM深入学习及MATLAB仿真
ofdm.m
%%
% 仿真系统构成:信号输入(为随机比特流)、OFDM调制、仿真信道传输、OFDM解调、信号输出
% 仿真分析内容:根据输入、输出比特流计算不同信噪比条件下的误码率,
% 并绘制曲线对调制的要求:
% OFDM调制的子载波间隔为15KHz
% 循环前缀长度,子载波数目,导频间隔及ofdm符号数可调,
% 各子载波使用QPSK调制
% 未使用扩频技术,未乘以载波进行上变频,未测试梳妆导频性能
%%
clc;
clear ;
close ;
tic;
disp("simulation start");
%% 参数设置
sta_num = 5; %仿真次数
SNR = -4:1:25;
num_carriers = 100; %子载波数
cp_length = 15; %循环前缀长度
M = 8; %QPSK时,M=4
is_pilot_k = 1; %块状导频
q = 8; %fs = q*B_jidai;
pilot_interval = 4; %导频间隔
num_ofdm_symbol = 99; %ofdm符号数
%% 以上参数为可调部分
f_delta = 15e3;
n = 1;
while(true)
% if(2^n >= num_carriers / pilot_interval * (pilot_interval +1))
if(2^n >= num_carriers )
num_fft = 2^n;
break;
end
n = n+1;
end
num_bit = num_carriers * num_ofdm_symbol * log2(M);%二进制bit数 乘以 log2(M) 是为了考虑调制方式对传输数据的影响
B_jidai = num_carriers * f_delta; %基带宽度
fs = q*B_jidai; %数字系统采样率
ts = 1/fs;
fd = 300; %多普勒频偏
pathPower = [-1.0 -1.0 -1.0 0 0 0 -3.0 -5.0 -7.0];
pathDelays = [0 50 120 200 230 500 1600 2300 5000]*1e-9;
% chan = rayleighchan(ts, fd, pathDelays, pathPower);
rchan = comm.RayleighChannel('SampleRate',fs, ...
'PathDelays',pathDelays,'AveragePathGains',pathPower, ...
'MaximumDopplerShift',fd,'FadingTechnique','Sum of sinusoids');
%% 基带数据数据产生
data_sourcebit = randi([0,1],1,num_bit);
%% 信道编码(卷积码、再交织)
L=7; %卷积码约束长度
tblen=6*L; %Viterbi译码器回溯深度
trellis = poly2trellis(7,[133 171]); %(2,1,7)卷积编码
data_conv = convenc(data_sourcebit,trellis);
data_scramble = matintrlv(data_conv, log2(M), length(data_conv) / log2(M));
%% qpsk调制
data_dec = bi2de(reshape(data_scramble,length(data_scramble)/log2(M),log2(M)));
data_moded = pskmod(data_dec,M,pi/M);
scatterplot(data_moded);
%% 串并转换
data_moded = reshape(data_moded,num_carriers,length(data_moded)/num_carriers);
%% 扩频
%%补零
data_buling = [data_moded;...
zeros(num_fft-size(data_moded,1),size(data_moded,2))];
%% 插入导频
if (is_pilot_k==1)
pilot_bit_k = randi([0,1],1,log2(M)*num_fft);
pilot_seq = pskmod(bi2de...
(reshape(pilot_bit_k,length(pilot_bit_k)/log2(M),log2(M))),M,pi/M);
data_pilot_inserted = insert_pilot_f(data_buling,pilot_seq,pilot_interval,is_pilot_k);
end
%% IFFT
data_ifft = ifft(data_pilot_inserted,num_fft)*num_fft;
%data_ifft = ifft(data_pilot_inserted,num_fft)*sqrt(num_fft);
%% 插入保护间隔、循环前缀
data_after_cp = [data_ifft(num_fft-cp_length+1:end,:);data_ifft];
%% 并串转换
data_total = reshape(data_after_cp,[],1);
%% 脉冲成型,
sendfir = rcosdesign(0.4,4,fs/B_jidai,'sqrt');
data_upsam = upsample(data_total,fs/B_jidai);
data_send = conv(data_upsam,sendfir,'same');
%% 画图
signal = data_send;
figure(2);
subplot(311);
plot(real(signal));
subplot(312);
plot(imag(signal));
subplot(313);
fft_y=abs(fft(signal,q*num_fft));
fft_x=fs*((1:(q*num_fft))/(q*num_fft)-1/2);
plot(fft_x,20*log10(fftshift(fft_y./max(fft_y))));
%% DA
%% 上变频
%% 信道(通过多经瑞利信道、AWGN信道)
Ber=zeros(1,length(SNR));
for jj=1:length(SNR)
for ii=1:sta_num
channel_out = step(rchan,data_send);
rx_channel=awgn(channel_out,SNR(jj),'measured');
%% 下变频
%% AD
rx_data1 = conv(rx_channel, sendfir, 'same');
rx_data2 = rx_data1(1:fs/B_jidai:length(rx_data1));
%% 串并转换
rx_data3=reshape(rx_data2,num_fft+cp_length,[]);
%% 去掉循环前缀
rx_data4=rx_data3(cp_length+1:end,:);
%% FFT
rx_data_fft = (1/num_fft)*fft(rx_data4,num_fft);
%% 信道估计与插值(均衡)
%% 信道校正
[rx_data_delpilot,H] = get_pilot_f(rx_data_fft,pilot_interval);
rx_data_estimation = chan_estimation_f...
(rx_data_delpilot,H,pilot_seq,pilot_interval);
%% 去零,并串转换
rx_data_quling = rx_data_estimation(1:num_carriers,:);
rx_data_psk = reshape(rx_data_quling,[],1);
% scatterplot(rx_data_psk);
%% 解扩
%% QPSK解调
demodulation_data=pskdemod(rx_data_psk,M,pi/M);
De_data1 = reshape(demodulation_data,[],1);
De_data2 = de2bi(De_data1);
De_Bit = reshape(De_data2,1,[]);
%% (解交织)
rx_data_jiejiaozi = matdeintrlv(De_Bit, log2(M), length(De_Bit) / log2(M));
%% 信道译码(维特比译码)
rx_data_deco = vitdec(rx_data_jiejiaozi,trellis,tblen,'trunc','hard'); %硬判决
%% 计算误码率
[~, ber] = biterr(rx_data_deco(1:length(data_sourcebit)),data_sourcebit);%译码后的误码率
Ber(jj)=Ber(jj)+ber;
end
Ber(jj)=Ber(jj)/sta_num;
fprintf("SNR = %d dB, ber = %.5f \n",SNR(jj),Ber(jj));
end
figure(3);
signal = rx_channel;
subplot(311);
plot(real(signal));
subplot(312);
plot(imag(signal));
subplot(313);
fft_y=abs(fft(signal,q*num_fft));
fft_x=fs*((1:(q*num_fft))/(q*num_fft)-1/2);
plot(fft_x,20*log10(fftshift(fft_y./max(fft_y))));
figure(4);
% semilogy(SNR,Ber2,'b-s');
% hold on;
semilogy(SNR,Ber,'r-o');
hold on;
xlabel('SNR');
ylabel('BER');
title('ETU300叠加AWGN信道下误比特率曲线');
toc;
num_bit
时乘以 log2(M)
是为了考虑调制方式对传输数据的影响。
num_bit
时,乘以 log2(M)
可以得到需要传输的总比特数。这是因为在 OFDM 系统中,每个 OFDM 符号的数据部分由多个子载波组成,每个子载波上都传输一定数量的比特,因此需要考虑每个符号上的比特数和调制方式的关系。rcosdesign
函数设计了一个根号升余弦滤波器。该函数的输入参数为滚降系数(0.4)、滤波器的长度(4),以及滤波器的归一化截止频率(fs/B_jidai
),其中 fs
为数字系统的采样率,B_jidai
为基带带宽。这个滤波器的作用是在信号传输过程中对信号进行滤波,以限制频带内的能量,并控制信号的带内和带外衰减。upsample
函数对输入的信号 data_total
进行上采样。上采样是将信号的采样率提高,即在信号中插入更多的零值样本,以增加信号的频带范围。上采样的倍数为 fs/B_jidai
,其中 fs
为数字系统的采样率,B_jidai
为基带带宽。conv
函数对上采样后的信号 data_upsam
和滤波器的脉冲响应 sendfir 进行卷积运算。卷积运算的结果是将信号通过滤波器,得到经过滤波的信号。'same'
参数表示输出的卷积结果与输入信号的长度相同。(1:(q*num_fft))/(q*num_fft)-1/2
生成一个从 -0.5 到 0.5 的等间隔序列,并乘以采样率 fs 得到真实的频率值。fftshift
函数将频域数据进行移位,使得 0 频率位于图形中心。./max(fft_y)
将 FFT
结果进行归一化处理,使得最大值为 1。20*log10
将幅度转换为以分贝为单位的对数尺度。绘制出的图形将显示信号的频域特性。rx_data2
变量中。
conv
函数将接收到的信号 rx_channel
与发送端的滤波器的脉冲响应 sendfir
进行卷积运算。卷积的结果是对接收信号进行反脉冲成型,即恢复出发送信号经过信道传输后的波形。'same'
参数表示输出的卷积结果与输入信号的长度相同。simulation start
SNR = -4 dB, ber = 0.45980
SNR = -3 dB, ber = 0.45087
SNR = -2 dB, ber = 0.42770
SNR = -1 dB, ber = 0.41361
SNR = 0 dB, ber = 0.38854
SNR = 1 dB, ber = 0.37098
SNR = 2 dB, ber = 0.34956
SNR = 3 dB, ber = 0.32510
SNR = 4 dB, ber = 0.30745
SNR = 5 dB, ber = 0.28106
SNR = 6 dB, ber = 0.25711
SNR = 7 dB, ber = 0.24377
SNR = 8 dB, ber = 0.22386
SNR = 9 dB, ber = 0.21781
SNR = 10 dB, ber = 0.21100
SNR = 11 dB, ber = 0.20307
SNR = 12 dB, ber = 0.18618
SNR = 13 dB, ber = 0.19459
SNR = 14 dB, ber = 0.16919
SNR = 15 dB, ber = 0.16418
SNR = 16 dB, ber = 0.16908
SNR = 17 dB, ber = 0.15683
SNR = 18 dB, ber = 0.15314
SNR = 19 dB, ber = 0.15960
SNR = 20 dB, ber = 0.14756
SNR = 21 dB, ber = 0.17572
SNR = 22 dB, ber = 0.16144
SNR = 23 dB, ber = 0.14231
SNR = 24 dB, ber = 0.15244
SNR = 25 dB, ber = 0.15856
时间已过 29.591768 秒。
OFDM通信连路仿真学习
本文参考:
matlab-ofdm通信链路仿真
我的qq:2442391036,欢迎交流!