Index exceeds the number of array elements. Index must not exceed 512.
10 views (last 30 days)
Show older comments
Hi! I have a problem while generating a OFDM signal in 512 points. The program works fine using OFDM in 1024 points, but when I change the parameters I get this error and I can't figure out where is the problem.
The error is: Index exceeds the number of array elements. Index must not exceed 512.
Error in Rx (line 18)
x_demod = QAM_demodulation(x_time_domain(1:modulation_length),M);
Error in main (line 45)
[x_Rx, x_before_demodulation] = Rx(M, L, y_Tx1, y_Tx2, x_QAM_modulated, h1, h2, fft_size);
Code is the following:
main.m:
close all;
%% SIMO (Single Input Multiple Output)
% Paramters
%-------------------------------
% For M = 64 ---> N_bits = 3504
% For M = 16 ---> N_bits = 2336
%-------------------------------
N_bits = 2336;
M = 16;
fft_size = 1024;
frames_num = 25;
ofdm_synbols_per_frame = 25;
channel_type = "Multipath";
Eb_No = -20:3:20;
Eb = 2*(M-1)/(3*log2(M));
No_vect = Eb./(10.^(Eb_No/10));
Pe_vect = zeros(1,length(Eb_No));
for i = 1:length(Eb_No)
Pe_avg_frames_per_frame = 0;
for k = 1:frames_num
if channel_type == "Multipath"
L = 50;
h1 = (1/sqrt(2*L))*(randn(1,L)+1i*randn(1,L));
h2 = (1/sqrt(2*L))*(randn(1,L)+1i*randn(1,L));
elseif channel_type == "AWGN"
L = 1;
h1 = 1;
h2 = 1;
end
count_err_per_ofdm_symbol = 0;
count_err_per_frame = 0;
for j = 1:ofdm_synbols_per_frame
% Generate seq
x = randi([0 1],1,N_bits);
% Tx (Channel encoding, QAM modulation, OFDM)
[y_Tx1, y_Tx2, x_QAM_modulated] = Tx(x, M, N_bits, L, No_vect(i), h1, h2, fft_size);
% Rx (OFDM, QAM demodulation, Channel decoding)
[x_Rx, x_before_demodulation] = Rx(M, L, y_Tx1, y_Tx2, x_QAM_modulated, h1, h2, fft_size);
% Calc BER
count_err_per_ofdm_symbol = biterr(x,x_Rx);
% Average BER per run
count_err_per_frame = count_err_per_frame + count_err_per_ofdm_symbol;
end
Pe_avg_frames_per_frame = Pe_avg_frames_per_frame + count_err_per_frame/(N_bits*ofdm_synbols_per_frame);
end
Pe_vect(i) = Pe_avg_frames_per_frame;
end
figure()
plot(real([y_Tx1, y_Tx2, x_QAM_modulated])); xlabel('Time'); ylabel('Amplitude');
title('OFDM Signal');grid on;
figure()
plot(real([x_Rx, x_before_demodulation])); xlabel('Time'); ylabel('Amplitude');
title('OFDM Signal AFTER');grid on;
%% plot
figure
semilogy(Eb_No,Pe_vect);
title('BER vs Eb/No ' + channel_type + ' for ' + M + ' QAM');
xlabel('Eb/No (dB)');
ylabel('BER (dB)');
numerrs = biterr(x,x_Rx)
channel_encoding.m:
function x_encoded = channel_encoding(x,N_bits)
%Hamming Coding (Channel Encoding)
x_encoded = zeros(1,N_bits*(7/4)); % Output after encoding
d1 = [1;0;0;0]; % index of first element of 4 bits encoding
d2 = [0;1;0;0];
d3 = [0;0;1;0];
d4 = [0;0;0;1];
p1 = [0;1;1;1]; % First parity of encoding p1 = d2+d3+d4
p2 = [1;0;1;1];
p3 = [1;1;0;1];
G = [p1 p2 p3 d1 d2 d3 d4]; % Generator Matrix of Hamming(4,7)
k = 1;
for i = 1:4:N_bits
x_encoded(k:k+6) = mod(x(i:3+i)*G,2);
k = k+7;
end
end
Channeldecoding.m:
function x_decoded = Channeldecoding(x_demod)
p1 = [0;1;1;1]; % First parity of encoding p1 = d2+d3+d4
p2 = [1;0;1;1];
p3 = [1;1;0;1];
H = [eye(3) [p1' ;p2' ;p3']];
k = 1;
err_values = [0 0 0 0 0 0 0; 0 0 0 0 0 0 1;0 0 0 0 0 1 0;0 0 0 0 1 0 0;0 0 0 1 0 0 0;0 0 1 0 0 0 0;0 1 0 0 0 0 0;1 0 0 0 0 0 0];
syndroms = [0; 7; 6; 5; 3; 1; 2; 4];
for i = 1:7:length(x_demod)
s = mod(x_demod(i:i+6)*H',2);
s_dec = bin2dec(strjoin(string(s),''));
index = syndroms==s_dec;
err = err_values(index,:);
%x_hat = bitxor(x_demod(i:i+6),err);
x_hat = mod(err + x_demod(i:i+6),2);
x_decoded(k:k+3) = x_hat(4:7);
k = k+4;
end
end
QAM_modulation.m:
function x_QAM_modulated = QAM_modulation(x_encoded, M)
x_encoded = string(x_encoded);
M=log2(M);
greycode = generate_grey_code(M/2);
if mod(length(x_encoded),M) ~= 0
x_encoded = [x_encoded zeros(1, M - mod(length(x_encoded),M))];
end
x_QAM_modulated = zeros(1,length(x_encoded)/M);
AMi_vector = zeros(1, length(greycode));
AMq_vector = zeros(1, length(greycode));
for m = 1 : length(greycode)
AMi_vector(m) = 2*m - 1 - length(greycode);
end
AMq_vector = AMi_vector;
AMi_vector;
k=1;
for i = 1:length(x_QAM_modulated)
sequence=x_encoded(k:k-1+M);
sequence_even=sequence(1:length(sequence)/2);
sequence_odd=sequence((length(sequence)/2)+1:length(sequence));
sequence_even = strjoin(sequence_even,"");
sequence_odd = strjoin(sequence_odd,"");
index_even = find (greycode == sequence_even);
index_odd = find (greycode == sequence_odd);
AMi = AMi_vector(index_even);
AMq = AMq_vector(index_odd);
x_QAM_modulated(i) = AMi + AMq*j;
k = k + M;
end
QAM_demodulation.m
function x_QAM_demodulated = QAM_demodulation(x_QAM_modulated, M)
M=log2(M);
greycode = generate_grey_code(M/2);
x_QAM_demodulated = strings(1,length(x_QAM_modulated));
AMi_vector = zeros(1, length(greycode));
for m = 1 : length(greycode)
AMi_vector(m) = 2*m - 1 - length(greycode);
end
for i = 1:length(x_QAM_demodulated)
qam_element = x_QAM_modulated(i);
inphase_value = real(qam_element);
quadrature_value = imag(qam_element);
% get minmum error
minimm_vector_even = abs(inphase_value - AMi_vector);
index_even = find(minimm_vector_even == min(minimm_vector_even));
if length(index_even) >1
index_even = index_even(1);
end
minimm_vector_odd = abs(quadrature_value - AMi_vector);
index_odd = find(minimm_vector_odd == min(minimm_vector_odd));
if length(index_odd) > 1
index_odd = index_odd(1);
end
sequence = strjoin(greycode(index_even) + greycode(index_odd));
x_QAM_demodulated(i) = sequence;
end
x_QAM_demodulated = strjoin(x_QAM_demodulated,"");
x_QAM_demodulated = str2num(strjoin(split(x_QAM_demodulated,""),","));
Tx.m:
function [y_Tx1 ,y_Tx2, x_QAM_modulated] = Tx(x, M, N_bits, L, No_vect, h1, h2, fft_size)
% Hamming Coding (Channel Encoding)
x_encoded = channel_encoding(x,N_bits);
% Modulation
x_QAM_modulated = QAM_modulation(x_encoded, M);
% IFFT
x_QAM_modulated = sqrt(fft_size).*x_QAM_modulated;
x_ifft = ifft(x_QAM_modulated,fft_size);
%Cyclic prefix
x_ifft = [x_ifft(length(x_ifft)-L+1+1:length(x_ifft)) x_ifft];
% channel effect
noise = sqrt(No_vect/2).*randn(1,(length(x_ifft) + length(h1)-1));
y_Tx1 = conv(x_ifft,h1) + noise;
noise = sqrt(No_vect/2).*randn(1,(length(x_ifft) + length(h2)-1));
y_Tx2 = conv(x_ifft,h2) + noise;
Rx.m:
function [x_Rx, x_time_domain] = Rx(M, L, y_Tx1, y_Tx2, x_QAM_modulated, h1, h2,fft_size)
% Check which channel has bigger energy (smaller effect on signal)
% To equalize (remove channel effect) its recived signal
% And remove cyclic prefix
if norm(h1) > norm(h2)
y1 = y_Tx1(L:fft_size+L-1);
y1 = y1./sqrt(fft_size);
x_time_domain = fft(y1)./fft([h1 zeros(1,length(y1)-length(h1))]);
else
y2 = y_Tx2(L:fft_size+L-1);
y2 = y2./sqrt(fft_size);
x_time_domain = fft(y2)./fft([h2 zeros(1,length(y2)-length(h2))]);
end
% Demodulation
modulation_length = length(x_QAM_modulated);
x_demod = QAM_demodulation(x_time_domain(1:modulation_length),M);
% Channel Decoding
x_Rx = Channeldecoding(x_demod);
syndrom_table.m:
function err = syndrom_table(s)
s_dec = bin2dec(strjoin(string(s),''));
err_values = [0 0 0 0 0 0 0; 0 0 0 0 0 0 1;0 0 0 0 0 1 0;0 0 0 0 1 0 0;0 0 0 1 0 0 0;0 0 1 0 0 0 0;0 1 0 0 0 0 0;1 0 0 0 0 0 0];
syndroms = [0; 7; 6; 5; 3; 1; 2; 4];
i = find(syndroms==s_dec);
err = err_values(i,:);
end
generate_grey_code.m:
function grey_code = generate_grey_code(n)
arr = strings(1,2);
arr(1) = '0';
arr(2) = '1';
i=2;
j=0;
while(i < 2^n)
start = i-1;
step = -1;
N= length(arr);
start+step*(0:N-1);
for j = start+step*(0:N-1)
arr = [arr arr(j+1)];
end
for j = linspace(1,i,i)
arr(j) = "0" + arr(j);
end
for j = linspace(i,(2*i)-1,i)
arr(j+1) = "1" + arr(j+1);
end
i = bitshift(i,1);
end
grey_code = arr;
0 Comments
Answers (1)
Sulaymon Eshkabilov
on 11 Jan 2023
It is easier to check the syntaxes if these function files are put into one M-file and executed as whole one file (in my opinion). If you do so, everything works ok. I have made a few syntax changes by closing functions.
close all;
%% SIMO (Single Input Multiple Output)
% Paramters
%-------------------------------
% For M = 64 ---> N_bits = 3504
% For M = 16 ---> N_bits = 2336
%-------------------------------
N_bits = 2336;
M = 16;
fft_size = 1024;
frames_num = 25;
ofdm_synbols_per_frame = 25;
channel_type = "Multipath";
Eb_No = -20:3:20;
Eb = 2*(M-1)/(3*log2(M));
No_vect = Eb./(10.^(Eb_No/10));
Pe_vect = zeros(1,length(Eb_No));
for i = 1:length(Eb_No)
Pe_avg_frames_per_frame = 0;
for k = 1:frames_num
if channel_type == "Multipath"
L = 50;
h1 = (1/sqrt(2*L))*(randn(1,L)+1i*randn(1,L));
h2 = (1/sqrt(2*L))*(randn(1,L)+1i*randn(1,L));
elseif channel_type == "AWGN"
L = 1;
h1 = 1;
h2 = 1;
end
count_err_per_ofdm_symbol = 0;
count_err_per_frame = 0;
for j = 1:ofdm_synbols_per_frame
% Generate seq
x = randi([0 1],1,N_bits);
% Tx (Channel encoding, QAM modulation, OFDM)
[y_Tx1, y_Tx2, x_QAM_modulated] = Tx(x, M, N_bits, L, No_vect(i), h1, h2, fft_size);
% Rx (OFDM, QAM demodulation, Channel decoding)
[x_Rx, x_before_demodulation] = Rx(M, L, y_Tx1, y_Tx2, x_QAM_modulated, h1, h2, fft_size);
% Calc BER
count_err_per_ofdm_symbol = biterr(x,x_Rx);
% Average BER per run
count_err_per_frame = count_err_per_frame + count_err_per_ofdm_symbol;
end
Pe_avg_frames_per_frame = Pe_avg_frames_per_frame + count_err_per_frame/(N_bits*ofdm_synbols_per_frame);
end
Pe_vect(i) = Pe_avg_frames_per_frame;
end
figure()
plot(real([y_Tx1, y_Tx2, x_QAM_modulated])); xlabel('Time'); ylabel('Amplitude');
title('OFDM Signal');grid on;
figure()
plot(real([x_Rx, x_before_demodulation])); xlabel('Time'); ylabel('Amplitude');
title('OFDM Signal AFTER');grid on;
% plot
figure
semilogy(Eb_No,Pe_vect);
title('BER vs Eb/No ' + channel_type + ' for ' + M + ' QAM');
xlabel('Eb/No (dB)');
ylabel('BER (dB)');
numerrs = biterr(x,x_Rx)
function x_encoded = channel_encoding(x,N_bits)
%Hamming Coding (Channel Encoding)
x_encoded = zeros(1,N_bits*(7/4)); % Output after encoding
d1 = [1;0;0;0]; % index of first element of 4 bits encoding
d2 = [0;1;0;0];
d3 = [0;0;1;0];
d4 = [0;0;0;1];
p1 = [0;1;1;1]; % First parity of encoding p1 = d2+d3+d4
p2 = [1;0;1;1];
p3 = [1;1;0;1];
G = [p1 p2 p3 d1 d2 d3 d4]; % Generator Matrix of Hamming(4,7)
k = 1;
for i = 1:4:N_bits
x_encoded(k:k+6) = mod(x(i:3+i)*G,2);
k = k+7;
end
end
function x_decoded = Channeldecoding(x_demod)
p1 = [0;1;1;1]; % First parity of encoding p1 = d2+d3+d4
p2 = [1;0;1;1];
p3 = [1;1;0;1];
H = [eye(3) [p1' ;p2' ;p3']];
k = 1;
err_values = [0 0 0 0 0 0 0; 0 0 0 0 0 0 1;0 0 0 0 0 1 0;0 0 0 0 1 0 0;0 0 0 1 0 0 0;0 0 1 0 0 0 0;0 1 0 0 0 0 0;1 0 0 0 0 0 0];
syndroms = [0; 7; 6; 5; 3; 1; 2; 4];
for i = 1:7:length(x_demod)
s = mod(x_demod(i:i+6)*H',2);
s_dec = bin2dec(strjoin(string(s),''));
index = syndroms==s_dec;
err = err_values(index,:);
%x_hat = bitxor(x_demod(i:i+6),err);
x_hat = mod(err + x_demod(i:i+6),2);
x_decoded(k:k+3) = x_hat(4:7);
k = k+4;
end
end
function x_QAM_modulated = QAM_modulation(x_encoded, M)
x_encoded = string(x_encoded);
M=log2(M);
greycode = generate_grey_code(M/2);
if mod(length(x_encoded),M) ~= 0
x_encoded = [x_encoded zeros(1, M - mod(length(x_encoded),M))];
end
x_QAM_modulated = zeros(1,length(x_encoded)/M);
AMi_vector = zeros(1, length(greycode));
AMq_vector = zeros(1, length(greycode));
for m = 1 : length(greycode)
AMi_vector(m) = 2*m - 1 - length(greycode);
end
AMq_vector = AMi_vector;
AMi_vector;
k=1;
for i = 1:length(x_QAM_modulated)
sequence=x_encoded(k:k-1+M);
sequence_even=sequence(1:length(sequence)/2);
sequence_odd=sequence((length(sequence)/2)+1:length(sequence));
sequence_even = strjoin(sequence_even,"");
sequence_odd = strjoin(sequence_odd,"");
index_even = find (greycode == sequence_even);
index_odd = find (greycode == sequence_odd);
AMi = AMi_vector(index_even);
AMq = AMq_vector(index_odd);
x_QAM_modulated(i) = AMi + AMq*j;
k = k + M;
end
end
function x_QAM_demodulated = QAM_demodulation(x_QAM_modulated, M)
M=log2(M);
greycode = generate_grey_code(M/2);
x_QAM_demodulated = strings(1,length(x_QAM_modulated));
AMi_vector = zeros(1, length(greycode));
for m = 1 : length(greycode)
AMi_vector(m) = 2*m - 1 - length(greycode);
end
for i = 1:length(x_QAM_demodulated)
qam_element = x_QAM_modulated(i);
inphase_value = real(qam_element);
quadrature_value = imag(qam_element);
% get minmum error
minimm_vector_even = abs(inphase_value - AMi_vector);
index_even = find(minimm_vector_even == min(minimm_vector_even));
if length(index_even) >1
index_even = index_even(1);
end
minimm_vector_odd = abs(quadrature_value - AMi_vector);
index_odd = find(minimm_vector_odd == min(minimm_vector_odd));
if length(index_odd) > 1
index_odd = index_odd(1);
end
sequence = strjoin(greycode(index_even) + greycode(index_odd));
x_QAM_demodulated(i) = sequence;
end
x_QAM_demodulated = strjoin(x_QAM_demodulated,"");
x_QAM_demodulated = str2num(strjoin(split(x_QAM_demodulated,""),","));
end
function [y_Tx1 ,y_Tx2, x_QAM_modulated] = Tx(x, M, N_bits, L, No_vect, h1, h2, fft_size)
% Hamming Coding (Channel Encoding)
x_encoded = channel_encoding(x,N_bits);
% Modulation
x_QAM_modulated = QAM_modulation(x_encoded, M);
% IFFT
x_QAM_modulated = sqrt(fft_size).*x_QAM_modulated;
x_ifft = ifft(x_QAM_modulated,fft_size);
%Cyclic prefix
x_ifft = [x_ifft(length(x_ifft)-L+1+1:length(x_ifft)) x_ifft];
% channel effect
noise = sqrt(No_vect/2).*randn(1,(length(x_ifft) + length(h1)-1));
y_Tx1 = conv(x_ifft,h1) + noise;
noise = sqrt(No_vect/2).*randn(1,(length(x_ifft) + length(h2)-1));
y_Tx2 = conv(x_ifft,h2) + noise;
end
function [x_Rx, x_time_domain] = Rx(M, L, y_Tx1, y_Tx2, x_QAM_modulated, h1, h2,fft_size)
% Check which channel has bigger energy (smaller effect on signal)
% To equalize (remove channel effect) its recived signal
% And remove cyclic prefix
if norm(h1) > norm(h2)
y1 = y_Tx1(L:fft_size+L-1);
y1 = y1./sqrt(fft_size);
x_time_domain = fft(y1)./fft([h1 zeros(1,length(y1)-length(h1))]);
else
y2 = y_Tx2(L:fft_size+L-1);
y2 = y2./sqrt(fft_size);
x_time_domain = fft(y2)./fft([h2 zeros(1,length(y2)-length(h2))]);
end
% Demodulation
modulation_length = length(x_QAM_modulated);
x_demod = QAM_demodulation(x_time_domain(1:modulation_length),M);
% Channel Decoding
x_Rx = Channeldecoding(x_demod);
end
function err = syndrom_table(s)
s_dec = bin2dec(strjoin(string(s),''));
err_values = [0 0 0 0 0 0 0; 0 0 0 0 0 0 1;0 0 0 0 0 1 0;0 0 0 0 1 0 0;0 0 0 1 0 0 0;0 0 1 0 0 0 0;0 1 0 0 0 0 0;1 0 0 0 0 0 0];
syndroms = [0; 7; 6; 5; 3; 1; 2; 4];
i = find(syndroms==s_dec);
err = err_values(i,:);
end
function grey_code = generate_grey_code(n)
arr = strings(1,2);
arr(1) = '0';
arr(2) = '1';
i=2;
j=0;
while(i < 2^n)
start = i-1;
step = -1;
N= length(arr);
start+step*(0:N-1);
for j = start+step*(0:N-1)
arr = [arr arr(j+1)];
end
for j = linspace(1,i,i)
arr(j) = "0" + arr(j);
end
for j = linspace(i,(2*i)-1,i)
arr(j+1) = "1" + arr(j+1);
end
i = bitshift(i,1);
end
grey_code = arr;
end
See Also
Categories
Find more on OFDM 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!