error for bit error rate
13 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
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 comentarios
Respuestas (0)
Ver también
Categorías
Más información sobre Propagation and Channel Models en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!