OFDM调制

发布时间:2013-12-28 14:09:16

OFDM信号调制仿真

1 OFDM信号调制原理图

fprintf ('OFDM Analysis Program\n\n');

defaults = input('输入1');

%

if defaults == 1

IFFT_bin_length = 64;

carrier_count = 3;

bits_per_symbol = 1;

symbols_per_carrier = 2;

SNR = 10;

else

IFFT_bin_length = input('IFFT bin length = ');

carrier_count = input('carrier count = ');

bits_per_symbol = input('bits per symbol = ');

symbols_per_carrier = input('symbols per carrier =');

SNR = input('SNR = ');

end

baseband_out_length = carrier_count * symbols_per_carrier * bits_per_symbol;

carriers = (1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2));

conjugate_carriers = IFFT_bin_length - carriers + 2;

the baseband signal which is to be transmitted.

%

baseband_out = round(rand(1,baseband_out_length));

figure(11),stairs(baseband_out);

axis([1 baseband_out_length -2 2]);

%

convert_matrix = reshape(baseband_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

%

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_modulation = zeros(symbols_per_carrier + 1, IFFT_bin_length);

IFFT_modulation(:,carriers) = complex_carrier_matrix;

IFFT_modulation(:,conjugate_carriers) = conj(complex_carrier_matrix);

%

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')

%

time_wave_matrix = ifft(IFFT_modulation');

time_wave_matrix = time_wave_matrix';

%

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')

colors = ['r' 'g' 'b' 'k' 'r' 'g' 'b' 'k' 'r' 'g' 'b' 'k' 'r' 'g' 'b' 'k'];

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,colors(f))

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_carrier+1));

%

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')

%PLOT OFDM SIGNAL (spectrum)

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')

%

Tx_data = ofdm_modulation;

%

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;

Rx_Data = Tx_data + noise;

%

Rx_Data_matrix = reshape(Rx_Data, IFFT_bin_length, symbols_per_carrier + 1);

%

Rx_spectrum = fft(Rx_Data_matrix);%

%

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');

%

Rx_phase = angle(Rx_carriers)*(180/pi);

phase_negative = find(Rx_phase < 0);

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

%

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);

%

%

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

%

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

%

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);

OFDM调制

相关推荐