Index exceeds the number of array elements. Index must not exceed 512.

10 views (last 30 days)
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;

Answers (1)

Sulaymon Eshkabilov
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
  1 Comment
Puscas Daniel
Puscas Daniel on 11 Jan 2023
I know it works with fft_size of 1024 but when I try to change that value to 512 it gives me this error:
Index exceeds the number of array elements. Index must not exceed 512.
Error in untitled>Rx (line 207)
x_demod = QAM_demodulation(x_time_domain(1:modulation_length),M);
Error in untitled (line 43)
[x_Rx, x_before_demodulation] = Rx(M, L, y_Tx1, y_Tx2, x_QAM_modulated, h1, h2, fft_size);

Sign in to comment.

Products


Release

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by