发布时间 : 星期六 文章(完整版)OFDMmatlab实现更新完毕开始阅读
avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10行数据,10个符号
averages = floor(temp_time1/avg_temp_time); average_fft(1:avg_temp_time) = 0;%分成5段 for a = 0:(averages-1)
subset_ofdm = Tx_data_withoutwindow
(((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);%总共的数据分为5段,分段进行FFT,平均相加 end
average_fft_log = 20*log10(average_fft); figure (6) subplot(2,1,1);
plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)%归一化 0/avg_temp_time : (avg_temp_time-1)/avg_temp_time 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 without windowing')
%===============加窗的发送信号频谱================================= symbols_per_average = ceil(symbols_per_carrier/5);%符号数的1/5,10行
avg_temp_time = (IFFT_bin_length+GI+GIP)*symbols_per_average;%点数,10行数据,10个符号
averages = floor(temp_time1/avg_temp_time); average_fft(1:avg_temp_time) = 0;%分成5段 for a = 0:(averages-1)
subset_ofdm = Tx_data(((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);%总共的数据分为5段,分段进行FFT,平均相加 end
average_fft_log = 20*log10(average_fft); subplot(2,1,2)
plot((0:(avg_temp_time-1))/avg_temp_time, average_fft_log)%归一化 0/avg_temp_time : (avg_temp_time-1)/avg_temp_time 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('Windowed OFDM Signal Spectrum') %====================添加噪声
============================================ Tx_signal_power = var(windowed_Tx_data);%发送信号功率 linear_SNR=10^(SNR/10);%线性信噪比 noise_sigma=Tx_signal_power/linear_SNR;
noise_scale_factor = sqrt(noise_sigma);%标准差sigma
noise=randn(1,((symbols_per_carrier)*(IFFT_bin_length+GI))+GIP)*noise_scale_factor;%产生正态分布噪声序列
%noise=wgn(1,length(windowed_Tx_data),noise_sigma,'complex');%产生复GAUSS白噪声信号
Rx_data=windowed_Tx_data +noise;%接收到的信号加噪声 %=====================接收信号 串/并变换 去除前缀与后缀==========================================
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:IFFT_bin_length+GI);%去除循环前缀与循环后缀,得到有用信号矩阵
%============================================================%================================================================ %============================================================== % OFDM解码 16QAM解码
%=================FFT变换================================= Y1=fft(Rx_data_complex_matrix,IFFT_bin_length,2);%OFDM解码 即FFT变换
Rx_carriers=Y1(:,carriers);%除去IFFT/FFT变换添加的0,选出映射的子载波 Rx_phase =angle(Rx_carriers);%接收信号的相位 Rx_mag = abs(Rx_carriers);%接收信号的幅度 figure(7);
polar(Rx_phase, Rx_mag,'bd');%极坐标坐标下画出接收信号的星座图
%======================================================================
[M, N]=pol2cart(Rx_phase, Rx_mag); Rx_complex_carrier_matrix = complex(M, N); figure(8);
plot(Rx_complex_carrier_matrix,'*r');%XY坐标接收信号的星座图 axis([-4, 4, -4, 4]); grid on
%====================16qam解调
================================================== Rx_serial_complex_symbols =
reshape(Rx_complex_carrier_matrix',size(Rx_complex_carrier_matrix, 1)*size(Rx_complex_carrier_matrix,2),1)' ;
Rx_decoded_binary_symbols=demoduqam16(Rx_serial_complex_symbols); %============================================================ baseband_in = Rx_decoded_binary_symbols; figure(9); subplot(2,1,1);
stem(baseband_out(1:100)); subplot(2,1,2);
stem(baseband_in(1:100)); %================误码率计算
============================================= bit_errors=find(baseband_in ~=baseband_out); bit_error_count = size(bit_errors, 2) ber=bit_error_count/baseband_out_length