基于MATLAB的OFDM系统仿真及分析(7)

2019-04-02 18:26

ylabel('Magnitude') xlabel('IFFT Bin')

title('OFDM Carrier Frequency Magnitude') %

figure (2)

plot(0:IFFT_bin_length-1, (180/pi)*angle(IFFT_modulation(2,1:IFFT_bin_length)), 'go') hold on

stem(carriers-1, (180/pi)*angle(IFFT_modulation(2,carriers)),'b*-')

stem(conjugate_carriers-1, (180/pi)*angle(IFFT_modulation(2,conjugate_carriers)),'b*-') axis ([0 IFFT_bin_length -200 +200]) grid on

ylabel('Phase (degrees)') xlabel('IFFT Bin')

title('OFDM Carrier Phase')

% 通过IFFT将频域转化为时域,得到时域信号 time_wave_matrix = ifft(IFFT_modulation'); time_wave_matrix = time_wave_matrix'; %画出一个符号周期的时域OFDM信号 figure (3)

plot(0:IFFT_bin_length-1,time_wave_matrix(2,:)) grid on

ylabel('Amplitude') xlabel('Time')

title('OFDM Time Signal, One Symbol Period')

%画出每一个载波对应的时域信号(分离的OFDM信号) for f = 1:carrier_count

temp_bins(1:IFFT_bin_length)=0+0j;

temp_bins(carriers(f))=IFFT_modulation(2,carriers(f));

temp_bins(conjugate_carriers(f))=IFFT_modulation(2,conjugate_carriers(f)); temp_time = ifft(temp_bins'); figure(4)

plot(0:IFFT_bin_length-1, temp_time) hold on end grid on

ylabel('Amplitude') xlabel('Time')

title('Separated Time Waveforms Carriers') for i = 1:symbols_per_carrier + 1

windowed_time_wave_matrix(i,:)=real(time_wave_matrix(i,:)).*hamming(IFFT_bin_length)'; windowed_time_wave_matrix(i,:) = real(time_wave_matrix(i,:)); end

%串并转换

ofdm_modulation=reshape(windowed_time_wave_matrix',1,IFFT_bin_length*(symbols_per_carr

27

ier+1));

% 画出整个时域OFDM

temp_time = IFFT_bin_length*(symbols_per_carrier+1); figure (5)

plot(0:temp_time-1,ofdm_modulation) grid on

ylabel('Amplitude (volts)') xlabel('Time (samples)') title('OFDM Time Signal') % 画出频域OFDM信号

symbols_per_average = ceil(symbols_per_carrier/5);

avg_temp_time = IFFT_bin_length*symbols_per_average; averages = floor(temp_time/avg_temp_time); average_fft(1:avg_temp_time) = 0; for a = 0:(averages-1)

subset_ofdm=ofdm_modulation(((a*avg_temp_time)+1):((a+1)*avg_temp_time)); subset_ofdm_f = abs(fft(subset_ofdm));

average_fft = average_fft + (subset_ofdm_f/averages); end

average_fft_log = 20*log10(average_fft); figure (6)

plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log) hold on

plot(0:1/IFFT_bin_length:1, -35, 'rd') grid on

axis([0 0.5 -40 max(average_fft_log)]) ylabel('Magnitude (dB)')

xlabel('Normalized Frequency (0.5 = fs/2)') title('OFDM Signal Spectrum')

% 上变频,这个模型中我们把经过IFFT运算后OFDM直接发送 Tx_data = ofdm_modulation;

%信道======================================================= % The channel model is Gaussian (AWGN) +Multipath(时延为1) Tx_signal_power = var(Tx_data); linear_SNR = 10^(SNR/10);

noise_sigma = Tx_signal_power/linear_SNR; noise_scale_factor = sqrt(noise_sigma);

noise = randn(1, length(Tx_data))*noise_scale_factor; copy1=zeros(1,length(ofdm_modulation)); for i=2:length(ofdm_modulation) copy1(i)=ofdm_modulation(i-1); end

Rx_Data = Tx_data + noise;

28

%RECEIVE

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< % 根据符号长度和符号数将串行的符号转换为并行的 % - 每一列是符号周期

Rx_Data_matrix = reshape(Rx_Data, IFFT_bin_length, symbols_per_carrier + 1); %对每一列信号做FFT得到频域信号 Rx_spectrum = fft(Rx_Data_matrix); % 画出接收到的OFDM信号频域代表

%--------1---------2---------3---------4---------5---------6---------7---------8 figure (7)

stem(0:IFFT_bin_length-1, abs(Rx_spectrum(1:IFFT_bin_length,2)),'b*-') grid on

axis ([0 IFFT_bin_length -0.5 1.5]) ylabel('Magnitude') xlabel('FFT Bin')

title('OFDM Receive Spectrum, Magnitude') figure (8)

plot(0:IFFT_bin_length-1, (180/pi)*angle(Rx_spectrum(1:IFFT_bin_length,2)), 'go') hold on

stem(carriers-1, (180/pi)*angle(Rx_spectrum(carriers,2)),'b*-')

stem(conjugate_carriers-1, (180/pi)*angle(Rx_spectrum(conjugate_carriers,2)),'b*-') axis ([0 IFFT_bin_length -200 +200]) grid on

ylabel('Phase (degrees)') xlabel('FFT Bin')

title('OFDM Receive Spectrum, Phase') % 抽取接收信号中有载波的点

Rx_carriers = Rx_spectrum(carriers,:)'; %画出每个接收符号分布图 figure (9)

Rx_phase_P = angle(Rx_carriers); Rx_mag_P = abs(Rx_carriers);

polar(Rx_phase_P, Rx_mag_P,'bd'); % 计算载波的相位 % - 弧度转换为角度

% - 归一化相位(0-360)

Rx_phase = angle(Rx_carriers)*(180/pi); phase_negative = find(Rx_phase < 0);

Rx_phase(phase_negative) = rem(Rx_phase(phase_negative)+360,360); % 用diff()计算相位差

Rx_decoded_phase = diff(Rx_phase);

phase_negative = find(Rx_decoded_phase < 0);

Rx_decoded_phase(phase_negative) = rem(Rx_decoded_phase(phase_negative)+360,360);

29

%--------1---------2---------3---------4---------5---------6---------7---------8 % 相位转化为符号

base_phase = 360/2^bits_per_symbol; delta_phase = base_phase/2;

Rx_decoded_symbols= zeros(size(Rx_decoded_phase,1),size(Rx_decoded_phase,2)); for i = 1:(2^bits_per_symbol - 1) center_phase = base_phase*i;

plus_delta = center_phase+delta_phase; minus_delta = center_phase-delta_phase;

decoded=find((Rx_decoded_phase<=plus_delta)&(Rx_decoded_phase>minus_delta)); Rx_decoded_symbols(decoded)=i; end

% Convert the matrix into a serial symbol stream

Rx_serial_symbols=reshape(Rx_decoded_symbols',1,size(Rx_decoded_symbols,1)*size(Rx_decoded_symbols,2));

% Convert the symbols to binary for i = bits_per_symbol: -1: 1 if i ~= 1

Rx_binary_matrix(i,:) = rem(Rx_serial_symbols,2); Rx_serial_symbols = floor(Rx_serial_symbols/2); else

Rx_binary_matrix(i,:) = Rx_serial_symbols; end end

baseband_in=reshape(Rx_binary_matrix,1,size(Rx_binary_matrix,1)*size(Rx_binary_matrix,2)); % 查找错位比特

bit_errors = find(baseband_in ~= baseband_out); bit_error_count = size(bit_errors,2);

d_out,bits_per_symbol,length(baseband_out)/bits_per_symbol); for k = 1:(length(baseband_out)/bits_per_symbol) modulo_baseband(k) = 0; for i = 1:bits_per_symbol

modulo_baseband(k)=modulo_baseband(k)+convert_matrix(i,k)*2^(bits_per_symbol-i); end end

% 串并转换

carrier_matrix = reshape(modulo_baseband, carrier_count, symbols_per_carrier)'; % 对每一个载波的符号进行差分编码

carrier_matrix = [zeros(1,carrier_count);carrier_matrix]; for i = 2:(symbols_per_carrier + 1)

carrier_matrix(i,:)=rem(carrier_matrix(i,:)+carrier_matrix(i-1,:),2^bits_per_symbol); end

30

% 把差分符号代码转换成相位

carrier_matrix = carrier_matrix * ((2*pi)/(2^bits_per_symbol)); % 把相位转换成复数

[X,Y] = pol2cart(carrier_matrix, ones(size(carrier_matrix,1),size(carrier_matrix,2))); complex_carrier_matrix = complex(X,Y); % 分配载波到指定的IFFT位置

IFFT_modulation = zeros(symbols_per_carrier + 1, IFFT_bin_length); IFFT_modulation(:,carriers) = complex_carrier_matrix;

IFFT_modulation(:,conjugate_carriers) = conj(complex_carrier_matrix); % 画出频域中的OFDM信号代表 figure (1)

stem(0:IFFT_bin_length-1, abs(IFFT_modulation(2,1:IFFT_bin_length)),'b*-') grid on

axis ([0 IFFT_bin_length -0.5 1.5]) ylabel('Magnitude') xlabel('IFFT Bin')

title('OFDM Carrier Frequency Magnitude') figure (2)

plot(0:IFFT_bin_length-1, (180/pi)*angle(IFFT_modulation(2,1:IFFT_bin_length)), 'go') hold on

stem(carriers-1, (180/pi)*angle(IFFT_modulation(2,carriers)),'b*-')

stem(conjugate_carriers-1, (180/pi)*angle(IFFT_modulation(2,conjugate_carriers)),'b*-') axis ([0 IFFT_bin_length -200 +200]) grid on

ylabel('Phase (degrees)') xlabel('IFFT Bin')

title('OFDM Carrier Phase')

% 通过IFFT将频域转化为时域,得到时域信号 time_wave_matrix = ifft(IFFT_modulation'); time_wave_matrix = time_wave_matrix'; %画出一个符号周期的时域OFDM信号 figure (3)

plot(0:IFFT_bin_length-1,time_wave_matrix(2,:)) grid on

ylabel('Amplitude') xlabel('Time')

title('OFDM Time Signal, One Symbol Period')

%画出每一个载波对应的时域信号(分离的OFDM信号) for f = 1:carrier_count

temp_bins(1:IFFT_bin_length)=0+0j;

temp_bins(carriers(f))=IFFT_modulation(2,carriers(f));

temp_bins(conjugate_carriers(f))=IFFT_modulation(2,conjugate_carriers(f)); temp_time = ifft(temp_bins'); figure(4)

31


基于MATLAB的OFDM系统仿真及分析(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:质量目标集 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: