clear all;
close all;
clc
%% 参数设置 %%
carrier_count = 200;
symbols_per_carrier = 20;
bits_per_symbol = 4; %16QAM = 4bit
IFFT_bin_length = 512; %子载波个数 = FFT长度
PrefixRatio = 1/4; %循环前缀比值
GI = PrefixRatio*IFFT_bin_length; %保护间隔
beta = 1/32; %滚降系数
GIP = beta*(IFFT_bin_length+GI); %循环后缀长度
SNR = 30;
%% OFDM信号产生 %%
baseband_out_length = carrier_count*symbols_per_carrier*bits_per_symbol;
%数据总bit数
carriers = (1:carrier_count)+(floor(IFFT_bin_length/4)-floor(carrier_count/2));
%OFDM符号子载波的序号
conjugate_carriers = flip(IFFT_bin_length-carriers-2,2);
baseband_out = round(rand(1,baseband_out_length));
baseband_M = bi2M(baseband_out,2^bits_per_symbol);
complex_carrier_matrix = qammod(baseband_M,2^bits_per_symbol);
% scatterplot(complex_carrier_matrix) %星座图
complex_carrier_matrix = reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';
%分解成20×200的矩阵形式
IFFT_modulation = zeros(symbols_per_carrier,IFFT_bin_length);
IFFT_modulation(:,carriers) = complex_carrier_matrix;
%将第一个200数据存入512子载波中
IFFT_modulation(:,conjugate_carriers) = conj(complex_carrier_matrix);
%将第二个200数据存入512子载波中
signal_after_IFFT = ifft(IFFT_modulation,IFFT_bin_length,2);
%对每一行进行IFFT变换
time_wave_matrix = signal_after_IFFT;
%% 添加循环前、后缀 %%
XX = zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);
for k=1:symbols_per_carrier
for i=1:GI
XX(k,i) = signal_after_IFFT(k,i+IFFT_bin_length-GI);
end
%第一段数据:循环前缀128
for i=1:IFFT_bin_length
XX(k,i+GI) = signal_after_IFFT(k,i);
end
%第二段数据:OFDM信号512
for j=1:GIP
XX(k,IFFT_bin_length+GI+j) = signal_after_IFFT(k,j);
end
%第三段数据:循环后缀20
end
time_wave_matrix_cp = XX;
%% 加窗 %%
windowed_time_wave_matrix_cp = zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);
rolloff = 0.25; % Rolloff factor
span = 6; % Filter span in symbols
sps = 4;
for i = 1:symbols_per_carrier
windowed_time_wave_matrix_cp(i,:) = real(time_wave_matrix_cp(i,:)).*rcoswindow(beta,IFFT_bin_length+GI)';
end
%% 形成串行发射信号 %%
windowed_Tx_data = zeros(1,symbols_per_carrier*(IFFT_bin_length+GI)+GIP);
windowed_Tx_data(1:IFFT_bin_length+GI+GIP)=windowed_time_wave_matrix_cp(1,:);
for i=1:symbols_per_carrier-1
windowed_Tx_data((IFFT_bin_length+GI)*i+1:(IFFT_bin_length+GI)*(i+1)+GIP)=windowed_time_wave_matrix_cp(i+1,:);
end
%加窗+重叠,但后端信号的前缀覆盖了前端信号的后缀
Tx_data_withoutwindow = reshape(time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1)';
%未加窗+不重叠
Tx_data = reshape(windowed_time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI+GIP),1)';
%加窗+不重叠
temp_time1 = (symbols_per_carrier)*(IFFT_bin_length+GI+GIP);
%% 未加窗+不重叠 信号频谱 %%
symbols_per_average = ceil(symbols_per_carrier/5); %单个子载波时每段处理的符号数
avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average; %N个子载波时每段处理的符号数
averages = floor(temp_time1/avg_temp_time); %段数
average_fft(1:avg_temp_time) = 0;
for a = 0:(averages-1)
subset_ofdm = Tx_data_withoutwindow(((a*avg_temp_time)+1):((a+1)*avg_temp_time)); %第a段
subset_ofdm_f = abs(fft(subset_ofdm)); %对第a段做fft
average_fft = average_fft+(subset_ofdm_f/averages); %叠加取平均
end
average_fft_log = 20*log10(average_fft); %功率谱dB
%%%%%%%%%%%%%%%%%%%%%% 画图 %%%%%%%%%%%%%%%%%%%%%
figure
plot((0:(avg_temp_time-1))/avg_temp_time,average_fft_log)
hold on
grid on
axis([0 0.5 -20 max(average_fft_log)])
xlabel('Normalized Frequency(0.5=fs/2)')
ylabel('Mag(dB)')
title('Without Window OFDM Signal Spectrum')
%%%%%%%%%%%%%%%%%%%%%% 画图 %%%%%%%%%%%%%%%%%%%%%
%% 加窗+不重叠 信号频谱 %%
symbols_per_average = ceil(symbols_per_carrier/5); %单个子载波时每段处理的符号数
avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average; %N个子载波时每段处理的符号数
averages = floor(temp_time1/avg_temp_time); %段数
average_fft(1:avg_temp_time) = 0;
for a = 0:(averages-1)
subset_ofdm = Tx_data(((a*avg_temp_time)+1):((a+1)*avg_temp_time)); %第a段
subset_ofdm_f = abs(fft(subset_ofdm)); %对第a段做fft
average_fft = average_fft+(subset_ofdm_f/averages); %叠加取平均
end
average_fft_log = 20*log10(average_fft); %功率谱dB
%%%%%%%%%%%%%%%%%%%%%% 画图 %%%%%%%%%%%%%%%%%%%%%
figure
plot((0:(avg_temp_time-1))/avg_temp_time,average_fft_log)
hold on
grid on
axis([0 0.5 -20 max(average_fft_log)])
xlabel('Normalized Frequency(0.5=fs/2)')
ylabel('Mag(dB)')
title('Window OFDM Signal Spectrum')
%%%%%%%%%%%%%%%%%%%%%% 画图 %%%%%%%%%%%%%%%%%%%%%
%% 加窗+重叠信号 AWGN %%
Rx_data = awgn(windowed_Tx_data,SNR,'measured');
%% OFDM解调 %%
Rx_data_matrix = zeros(symbols_per_carrier,IFFT_bin_length+GI+GIP);
for i=1:symbols_per_carrier
Rx_data_matrix(i,:) = Rx_data(1,(i-1)*(IFFT_bin_length+GI)+1:i*(IFFT_bin_length+GI)+GIP);
end
Rx_data_complex_matrix = Rx_data_matrix(:,GI+1:GI+IFFT_bin_length); %去掉前、后缀
Y1 = fft(Rx_data_complex_matrix,IFFT_bin_length,2); %FFT完成OFDM解调
Rx_carriers = Y1(:,carriers);
% Rx_phase = angle(Rx_carriers);
% Rx_mag = abs(Rx_carriers);
% [M,N] = pol2cart(Rx_phase,Rx_mag);
% Rx_complex_carrier_matrix = complex(M,N);
figure
plot(Rx_carriers,'*r');
axis([-4,4,-4,4]);
grid on