📄 最大似然算法.txt
字号:
% Input Bit Stream is normally Distributed
input_bit_stream = sign(randn(1,BPS*NS));
input_bit_stream(input_bit_stream == -1) = 0;
% PERFORM SERIAL TO PARALLEL CONVERSION
% work on whole data stream at once
%disp('Serial to Parallerl Conversion')
parallel_data = StoP(input_bit_stream, log2(M));
% PERFORM MODULATION
% using indicated modulation type and M-ary alphabet
%disp(['Modulating with ' modulation ' and ' num2str(M) '-ary Alphabet'])
modulated_data = dmodce(parallel_data, 1, 1, modulation, M);
% CREATE OFDM SYMBOLS
%disp('Transmitting OFDM symbols')
%SNR=EbNolin * log2(M);
for ll= 1:length(ep)
for l=1:length(EsNo)
k = 1;
noise = generateNoiseee (EsNo(l),ifftsize,NS,log2(M));
for n = 1:2*NS
ofdm_symbol = zeros(1,ifftsize);
% Map modulated data to FFT bins in OFDM symbol
ofdm_symbol(carriers(1:32)) = modulated_data(k:k+31); %Use only half the data for MLE
% Time Signal to transmit
%tx_signal = ifft(ofdm_symbol,ifftsize);
%Generate AWGN to be added
%Add noise
%ofdm_symbol_noisy = ofdm_symbol + noise (n);
%Transmission for MLE
tx_signal1 = ifft(ofdm_symbol,ifftsize/2); %Modulate using N/2 point DFT
tx_signal = [tx_signal1,tx_signal1]; %Replicate to get N point sequence
% Generate and add noise
%nois=complex(randn(1,64)/sqrt(2*EsNolin(l)),randn(1,64)/sqrt(2*EsNolin(l)));
%noise= complex(randn(1,ifftsize)/sqrt(2*SNR(l)),randn(1,ifftsize)/sqrt(2*SNR(l)));
%tx_signal=tx_signal2+ifft(noise(n),ifftsize);
rx_signal = tx_signal.*exp((2*j*pi*ep(ll)/ifftsize).*(0:ifftsize-1));
% DOPPLER SHIFT
%rx_signal = tx_signal.*exp((j*pi*ep(ll)/ifftsize)*(0:ifftsize-1));
% rx_signal = tx_signal.*exp((4*j*pi*ep(ll)/ifftsize).*(0:ifftsize-1)); %Frequency offset in the channel
% ADD NOISE
% rx_signal = awgn(rx_signal, EsNo(l));
mod_noise1 = ifft (noise(n,1:ifftsize/2),ifftsize/2);
mod_noise2 = ifft (noise(n,ifftsize/2+1:ifftsize),ifftsize/2);
mod_noise = [mod_noise1 mod_noise2];
rx_signal_noisy = rx_signal + noise(n,:);
% FFT
%received_ofdm = fft(rx_signal, ifftsize);
received_ofdm1 = fft(rx_signal(1:ifftsize/2), ifftsize/2);
received_ofdm2 = fft(rx_signal((ifftsize/2)+1:ifftsize), ifftsize/2);
temp=0;temp1=0;
for w=1:length(ifftsize/2)
temp=temp + imag(received_ofdm2(w)*conj(received_ofdm1(w)));
temp1=temp1 + real(received_ofdm2(w)*conj(received_ofdm1(w)));
end;
epestMLE(ll,l) = (atan(temp/temp1))/(2*pi);
if (epestMLE(ll,l)<0)
epestMLE(ll,l)=epestMLE(ll,l)+0.5;
end;
%Correct recieved signal using the estimated frequency offset
%received_ofdm = received_ofdm1 .* exp((-4*j*pi*epestMLE(ll)/ifftsize)*(0:ifftsize/2-1));
received_ofdm = rx_signal_noisy .* exp((-2*j*pi*epestMLE(ll,l)/ifftsize)*(0:ifftsize-1));
% Extract data from carriers in OFDM symbol
received_symbols(k:k+31) = fft(received_ofdm,ifftsize/2);
k = k + 32;
end
% PERFROM DEMODULATION
% disp('Performing Demodulation')
received_data = ddemodce(received_symbols, 1, 1, modulation, M);
%PERFORM PARALLEL TO SERIAL CONVERSION
% disp('Performing Parallel to Serial Converion')
output_bit_stream = PtoS(received_data, log2(M));
% CALCULATE BER
% disp('Calculating BER ')
BER(ll,l)= sum(abs(input_bit_stream-output_bit_stream))/length(input_bit_stream);
end
end
% figure;
% plot (ep,epestMLE,'*');
% title ('Actual vs Estimated');
%Function to generate AWGN given the Es/No
function output = generateNoise (EsNo,ifftsize,NS,QamBit);
EbNolin = 10^(EsNo/10);
%ifftsize = 64;
%NS = 10;
SNR = EbNolin * QamBit ;
for i = 1:(2*NS)
noise(i,:) = complex(randn(1,ifftsize)/sqrt(2*SNR),randn(1,ifftsize)/sqrt(2*SNR));;
end
output = noise;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -