error for bit error rate
13 views (last 30 days)
Show older comments
Good morning, I've realized this OFDM system, utilizing a function called "canale" that representes a multipath channel. The problem is that for each input and for each type of noise the ber was around a value of 0.5. Where is the mistake?! I can't see it!! Please help me
%parametri per poter calcolare le diverse funzioni.
s=300; %riflessioni sulla superficie
b=1000; %riflessioni sul fondale
R=1000; %distanza diretta tra rx e tx espressa in metri
d1=4; %distanza del tx dalla superficie
d2=7; %distanza del rx dalla superficie
h=16; %altezza del fondale
M = 4; % QPSK signal constellation
bittrasm = 1000; % have 64 data points
block_size = 8; % size of each ofdm block
cp_len = ceil(0.1*block_size); % length of cyclic prefix
no_of_ifft_points = block_size; % 8 points for the FFT/IFFT
no_of_fft_points = block_size;
EbNo = 0:5:40;
sub_car=8;
w=15; %velocità del vento espressa in metri/s
f=1000; %frequenza portante espressa in herz
>>
>> EsNo= EbNo + 10*log10(sub_car/no_of_fft_points)+ 10*log10(no_of_fft_points/80); % symbol to noise ratio
snr= EsNo - 10*log10(no_of_fft_points/80); % snr as to be used by awgn fn.
% ---------------------------------------------
% B: % +++++ TRANSMITTER +++++
% ---------------------------------------------
% 1. Generate 1 x 64 vector of random data points
data_source =ones(1,1000)*2;
figure(1)
stem(data_source); grid on; xlabel('Data Points'); ylabel('Amplitude')
title('Transmitted Data "O"')
% 2. Perform QPSK modulation
qpsk_modulated_data = pskmod(data_source, M);
scatterplot(qpsk_modulated_data);title('MODULATED TRANSMITTED DATA');
% 3. Do IFFT on each block
% Make the serial stream a matrix where each column represents a pre-OFDM
% block (w/o cyclic prefixing)
% First: Find out the number of colums that will exist after reshaping
num_cols=length(qpsk_modulated_data)/block_size;
data_matrix = reshape(qpsk_modulated_data, block_size, num_cols);
% Second: Create empty matix to put the IFFT'd data
cp_start = block_size-cp_len;
cp_end = block_size;
% Third: Operate columnwise & do CP
for i=1:num_cols,
ifft_data_matrix(:,i) = ifft((data_matrix(:,i)),no_of_ifft_points);
% Compute and append Cyclic Prefix
for j=1:cp_len,
actual_cp(j,i) = ifft_data_matrix(j+cp_start,i);
end
% Append the CP to the existing block to create the actual OFDM block
ifft_data(:,i) = vertcat(actual_cp(:,i),ifft_data_matrix(:,i));
end
% 4. Convert to serial stream for transmission
[rows_ifft_data cols_ifft_data]=size(ifft_data);
len_ofdm_data = rows_ifft_data*cols_ifft_data;
% Actual OFDM signal to be transmitted
ofdm_signal = reshape(ifft_data, 1, len_ofdm_data);
figure(3)
plot(real(ofdm_signal)); xlabel('Time'); ylabel('Amplitude');
title('OFDM Signal');grid on;
h=canale(s,b,R,d1,d2,h,bittrasm,w);
after_channel=conv(ofdm_signal,h,'same');
for ii=1:length(snr)
recvd_signal =awgn(after_channel,snr(ii),'measured'); % awgn addition
recvd_signal_matrix = reshape(recvd_signal,rows_ifft_data, cols_ifft_data);
recvd_signal_matrix(1:cp_len,:)=[];
for i=1:cols_ifft_data,
% FFT
fft_data_matrix(:,i) = fft(recvd_signal_matrix(:,i),no_of_fft_points);
end
recvd_serial_data = reshape(fft_data_matrix, 1,(block_size*num_cols));
qpsk_demodulated_data = pskdemod(recvd_serial_data,M);
[no_of_error(ii),ratio(ii)]=biterr(data_source,qpsk_demodulated_data) ; % error rate calculation
end
semilogy(EbNo,ratio,'--or','linewidth',2);
hold on;
EbN0Lin = 10.^(EbNo/10);
grid on
xlabel('EbNo');
ylabel('BER')
title('Bit error probability curve for BPSK using OFDM');
also the function "canale":
function [y] = canale(s,b,R,d1,d2,h,bittrasm,w)
tb=1/bittrasm; % tempo di bit
ts=tb/10; %consideriamo come tempo di campionamento un decimo del tempo di bit
ncampioni=tb/ts;
D00=sqrt(R^2-(d1-d2)^2);%distanza diretta
Dsb=sqrt(R^2+2*b*h+d1-d2*(-1)^(s-b));
Dbs=sqrt(R^2+2*b*h-d1+d2*(-1)^(b-s));
beta = 1; %valore fittizio
LaD00=10^-((D00/1000)*beta)/20; %perdite per assorbimento
LaDbs=10^-((Dbs/1000)*beta)/20;
LaDsb=10^-((Dsb/1000)*beta)/20;
sigma=sqrt(w*0.32*10^(-5));
teta=45; %angolo di incdenza sulla superficie
lambda=5; % lunghezza d'onda
k=2*3.14/lambda;
ro=2*k*sigma*sin(teta);
Lsr=exp(-ro^2);
tetabs=atan(R/(2*b*h-d1*d2*(-1)^(b-s)));
tetasb=atan(R/(2*b*h+d1*d2*(-1)^(s-b)));
r1=10; % densità del fondale
c1=23; %velocità dell'onda riflessa sul fondale
r=12; %densità del liquido
c=1500; % velocità del suono è di circa 1500 m/s
m=r1/r;
n=c/c1;
Lbrsb=abs([m*cos(tetasb)-sqrt(n^2-(sin(tetasb))^2)]/[m*cos(tetasb)+sqrt(n^2-(sin(tetasb))^2)]);
Lbrbs=abs([m*cos(tetabs)-sqrt(n^2-(sin(tetabs))^2)]/[m*cos(tetabs)+sqrt(n^2-(sin(tetabs))^2)]);
tausb=(Dsb-D00)/c;
taubs=(Dbs-D00)/c;
tausb1=ceil(tausb*1000);% poichè ogni posizione della risposta è espresso in millisecondi, trasformo il ritardo in millisecondi e mi sposto di tot posizioni intere
taubs1=ceil(taubs*1000); %stesso discorso di tausb
y=zeros(1,2*ncampioni); % poichè prendo come tempo di simulazione 2*tb, la mia risposta avrà 2*ncamp posizioni
y1=LaD00/D00;
y2=0;
y3=0;
% per simulare l'infinito ho inserito 100 somme, valore fittizio
for s=1:100
for b=s-1:s
y2=y2+(LaDsb*(Lsr^s)*(Lbrsb^b))/Dsb;
end
end
for b=1:100
for s=b-1:b
y3=y3+(LaDbs*(Lsr^s)*(Lbrbs^b))/Dbs;
end
end
%riempio le posizioni relative al cammino diretto
for t=1:ncampioni
y(t)=y1;
end
% riempio le posizioni in ritardo di tausb
for t=ncampioni+1:length(y)-tausb1
y(t+tausb1)=y2;
end
% riempio le posizioni in ritardo di tausb
for t=ncampioni+1:length(y)-taubs1
y(t+taubs1)=y(t+taubs1)+y3;
end
end
0 Comments
Answers (0)
See Also
Categories
Find more on Propagation and Channel Models in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!