Why is it that when I use OTFS modulation on a CDL channel, the Doppler index is concentrated in a region smaller than N/2?

6 views (last 30 days)
My code is the following
close all
clear
clc
%% OTFS frame parameters
M=128;
N=32;
f0=5.9*10^9;
c=299792458;
df=15*10^3;
T=1/df;
Tf=N*T;
samplerate=M*N/Tf;
X_DD=zeros(M,N);
xp=1;
mp=1;
np=N/2;
X_DD(mp,np)=xp;
X_tilda=ifft(X_DD,[],2);
s=reshape(X_tilda,N*M,1);
nu_max=1/T/2;
tau_max=T;
cdl = nrCDLChannel('DelayProfile', 'CDL-A');
cdl.DelaySpread =tau_max;
cdl.CarrierFrequency = f0;
cdl.MaximumDopplerShift =nu_max;
cdl.TransmitAntennaArray.Size = [1 1 1 1 1];
cdl.ReceiveAntennaArray.Size = [1 1 1 1 1];
ChannelFiltering = true;
cdl.SampleRate = samplerate;
cdl.Seed = randi([0,1000]);
r=cdl(s);
Y_tilda=reshape(r,M,N);
Y_otfs=fft(Y_tilda,[],2);
figure(1)
[X,Y]=meshgrid(1:N,1:M);
plot3(X,Y,abs(Y_otfs))
xlim([1,N])
ylim([1,M])
title('DD-channel')
The result is as follows,It looks like all Doppler indexes are less than N/2
When I set :cdl.MaximumDopplerShift =0,The result is as follows,the Doppler indexes are equal to N/2,This looks normal.
When I set :cdl.MaximumDopplerShift =0,cdl.DelaySpread =0;The results are as follows,The impulse response appears in the(N/2,8),but theoretically it should be at (N/2,1)

Accepted Answer

Deepak
Deepak on 20 Jun 2025
Hi @CC,
I understand that you are seeing shifts in the DD-domain impulse response under different channel conditions, such as the impulse appearing at (N/2,8) instead of the expected (N/2,1). This behavior is largely due to how the OTFS modulation uses FFT/IFFT and reshaping, and not an error in the channel model itself. In ideal channels (no delay or Doppler), the impulse should theoretically remain at the original DD bin, but indexing and transform conventions in MATLAB can lead to apparent shifts.
To ensure the impulse response aligns with theoretical expectations, I suggest the following:
  1. Check FFT centering: Use fftshift or place your impulse at floor(N/2)+1 in Doppler (column index) to align with the "zero-Doppler" bin in MATLAB’s unshifted FFT.
  2. Verify reshape consistency: Make sure the reshape(r, M, N) matches the way the transmitted signal was formed. Any mismatch here will rotate or misplace the DD grid.
  3. Specify FFT dimensions explicitly: Always use dimension arguments in fft/ifft, like fft(Y_tilda, [], 2) to ensure transforms are applied along the correct axes.
  4. Use standard OTFS transform sequence: Follow the ISFFT (IFFT in Doppler, FFT in delay) and SFFT (reverse) exactly, including any transpose or normalization steps.
  5. Validate with a trivial channel: Try passing the signal through a flat channel (gain = 1, no delay/Doppler) and confirm the impulse lands at the expected DD index.
These steps will help you get a correctly aligned DD-domain output in line with OTFS theory.
Please find attached the documentation of functions used for reference:
I hope this helps.

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!