Underwater acoustic channel is giving me a flat BER vs SNR curve

I need to do OFDM and GFDM signal transmission in underwater acoustic channel. I have my underwater acoustic channel as follow.

function [h,delay_bar,gain_tap,varargout] = acousticChannel(setup,gain,delay,doppler)
% Generating the distrubition of delays

distribution_delay = makedist('exponential','mu',delay.mean);  % Generating an exponential pdf for Dtau

Dtau        = random(distribution_delay,setup.paths,1);        % Vector of Dtau exponentially distributed
Dtau_index  = ceil(Dtau/setup.Ts); % Indexes of Dtau vector in disrete time

v = sum(Dtau_index);
delay_index = cumsum(Dtau_index);                              % Calculating indexes of multipaths for discrete time
delay       = (delay_index - 1)*setup.Ts;

% Generating the distribution of gains

alpha = log(10^(gain.attenuation/10))/setup.delayspread;       % Exponential attenuation power factor

gain_variance = exp(-alpha*delay);                             % Calculating the gain variance for each multipath
gain_tap      = raylrnd(sqrt(gain_variance*2/(4 - pi)));       % Calculating the gain for each multipath

gain_tap = gain_tap/norm(gain_tap);                            % Normalizing gain taps

% Doppler effect

c = 1500; % Sound speed

% Testing type of doppler effect in channel

if(strcmp(doppler.type,'none'))
a_max = 0;
varargout{1} = 1;
varargout{2} = 1;
elseif(strcmp(doppler.type,'uniform'))
a_max = doppler.velocity/c;
[Q,M] = rat(1+a_max);
varargout{1} = Q;
varargout{2} = M;
elseif (strcmp(type,'non-uniform'))
a = doppler.velocity/c;
a_max = max(a);
[Q,M] = rat(1+a_max);
varargout{1} = Q;
varargout{2} = M;
else
error('Invalid type.')
end
delay_index_bar = ceil(delay_index./(1 + a_max))  ;          % Calculating new delays indexes corrected by DSF
delay_bar       = (delay_index_bar - 1)*setup.Ts;              % Calculating new delays corrected by DSF
h(delay_index_bar) = gain_tap;                              % Channel impulse response
end


I am using these parameters to get the CIR.

setup.Ts = 25e-6;

setup.paths = 6;

gain.attenuation = 20;

delay.mean= 0.001;

doppler.type= 'none';

Bandwidth = 4000;


Since the CIR is a real value, and I need it to pass to baseband, so I did the following

function hl = channel(gain_tap, delay_bar, Bandwidth)
L=20;   %channel taps
f=10000;
fl=0;
hl = zeros(1,L);
for i=1:L
for n=1:length(delay_bar)
g=(gain_tap(n))*exp(-sqrt(-1)*2*pi*f*(delay_bar(n)))*sinc((i-1)-delay_bar(n)*W);
fl = fl+g;
end
hl(i)=fl;
fl=0;
end


So my CIR now is in complex and I can do convolution with my OFDM and GFDM signal. My OFDM and GFDM signal is in time domain. However, everytime I simulate I always get a flat BER vs SNR curve, which mean the range of my BER is too small. I guess that it is the channel that had gave me the problem. Can anyone tell me where is the problem and how can I improve it?

• haven't really looked through your code, but: that's an strongly fast-fading channel (fast fading: channel is "coherent", i.e. not much phase and amplitude variation in your symbol duration, and G/OFDM symbols are loooong). You might simply see the effect of the fading induced error floor! – Marcus Müller Oct 11 '19 at 9:07
• also: actually showing the plot might be very helpful here! – Marcus Müller Oct 11 '19 at 9:08