How to get accurate channel in NTN - TDL model?

Hi,
I'm reading the TDL channel model in the example NR NTN PDSCH Throughput and I have some questions about it, can you explain for me please:
  • (not my main question, but I am wondering) In the step "Obtain a precoding matrix (wtx) to use in the transmission of the first transport block"
[estChannelGrid,sampleTimes] = HelperNRNTNThroughput.getInitialChannelEstimate(...
carrier,simLocal.NumTransmitAntennas,channel,simLocal.DataType);
in that HelperNRNTNThroughput.getInitialChannelEstimate function, I saw the nrPerfectChannelEstimate function - this is what I am wondering, because I think we just can only estimate the channel, and this step is the estimation for the precoding, how can we do perfect channel estimation? - as I understand, nrPerfectChannelEstimate is the function that we can convert the channel in expression (carrier,pathGains,pathFilters) to the ChannelGrid expression, there is no estimation here.
I checked here and saw that the values of estChannelGrid are in range [0.5, 0.7].
  • In the step "Perform least squares channel estimation between the received grid and each transmission layer"
[estChannelGrid,noiseEst] = nrChannelEstimate(rxCarrier,rxGrid,...
refDMRSIndices,refDMRSSymbols,'CDMLengths',pdsch.DMRS.CDMLengths);
I checked the values of estChannelGrid here and saw the values are in range 10^-6 x [3, 7.5].
I saw a line "Apply path loss to the signal" in the second step:
txWaveform = txWaveform*db2mag(-pl_dB(carrier.NSlot+1));
Plathloss here db2mag(-pl_dB(carrier.NSlot+1)) is 1.5678e-08
I want to generate the acurate (perfect) channel in this case, so I tried to multiply the estChannelGrid from nrPerfectChannelEstimate with db2mag(-pl_dB(carrier.NSlot+1)) but the results are in range 10^-9, not 10^-6 (to be near to the estimated channel). - So I am thinking this is not a correct approach to generate the accurate channel.
So my question is, how can I generate the perfect (accurate) channel, so I can compare the estimated channel and the accurate one?
Thank you so much

 Accepted Answer

Hi @Thien Hieu,

I read your post about the NR NTN PDSCH Throughput example and wanted to clarify. The function `nrPerfectChannelEstimate` is not a receiver-side estimate but simply a way to obtain the ground-truth channel grid from the channel model. That’s why its values look much larger than those from `nrChannelEstimate`, which operates on the received signal after normalization, path loss, and noise.

To compare the two, the perfect channel needs to be scaled consistently with the transmit waveform and DM-RS power. Applying only the path loss factor is not enough, since additional normalization (waveform and FFT) also affects the estimated channel. Aligning these scalings allows you to compute a fair comparison, such as MSE, between perfect and estimated channels.

7 Comments

Thank you for your answer.
I mean, in reality, between the transmitter and receiver, we do not know the perfect channel in advance. We just know it here because it is in the simulation, we are modeling the channel by the TDL channel, we generate its all parameters, so of course we can regenerate it to a perfect channel. In that function (helper.getInitialChannelEstimate), I think it is more reasonable if we just use nrChannelEstimate, instead of nrPerfectChannelEstimate.
For the channel range mismatch, I still don't understand. I will check again if we need to multiply with some think else.
I understand now, thank you for your explanation
At the nrChannelEstimate function, the function used DMRS symbol since we generate the waveform (its value in range of txWaveform0)
But when we transmit, we perform:
txWaveform0 ./max(abs(txWaveform0)) * db2mag(powerScaling) *db2mag(-pl_dB(carrier.NSlot+1))
So the received signal is something like
Y = txWaveform0 ./max(abs(txWaveform0)) * db2mag(powerScaling) *db2mag(-pl_dB(carrier.NSlot+1)) * H_tdl
H_tdl is the channel generated from TDL model, and if I do
H = nrPerfectChannelEstimate(carrier,pathGains,pathFilters)
I will get the channel grid of that TDL channel (which is already normalized)
With the nrChannelEstimate function, it is something like
H_est = Y./DMRS ~ similar to ~ Y./txWaveform0
then
H_est ~ H_tdl ./max(abs(txWaveform0)) * db2mag(powerScaling) *db2mag(-pl_dB(carrier.NSlot+1))
Actually, to call it a channel, I think it is just
H_tdl*db2mag(-pl_dB(carrier.NSlot+1)), or H_tdl * PathLoss
The max(abs(txWaveform0)) and db2mag(powerScaling) elements are just for scaling (preprocessing) purpose, I don't think it should be included in channel

Hi @Thien Hieu,

Thank you for your follow-up comments and for working through the channel estimation scaling issues. I'm pleased to see you've reached a good understanding of the channel estimation process in the NR NTN PDSCH Throughput example. Let me provide some additional clarification and validation of your conclusions.

Your Understanding is Correct

Your analysis in your latest comments is absolutely correct. You've accurately identified the key distinction between the "perfect channel" from the TDL model and the estimated channel obtained through practical receiver processing, and you've correctly traced through the scaling factors that account for the difference in their magnitudes.

Regarding Your First Comment About Using nrChannelEstimate Instead of nrPerfectChannelEstimate

You raised an excellent point about the use of nrPerfectChannelEstimate in the helper function getInitialChannelEstimate. You're right that in a real-world receiver implementation, you would only have access to nrChannelEstimate since the true channel is unknown. However, in this simulation example, the use of nrPerfectChannelEstimate for the initial precoding matrix calculation serves a specific purpose: it provides an idealized starting point that demonstrates the best-case performance achievable by the precoding scheme. According to the MathWorks documentation at https://www.mathworks.com/help/5g/ref/nrperfectchannelestimate.html, the nrPerfectChannelEstimate function reconstructs the channel impulse response from the channel path gains and path filter impulse response, then performs OFDM demodulation to create the channel grid. This is fundamentally different from nrChannelEstimate which performs practical least-squares estimation using reference signals from the received waveform.

The example uses perfect channel knowledge initially because: * It allows the transmitter to compute optimal precoding matrices (via SVD) for the first transmission * After the first slot, the example switches to using practical channel estimation (nrChannelEstimate) for all subsequent slots * This approach demonstrates the system's ability to track the channel and adapt precoding based on realistic receiver feedback

If you wanted to make the simulation more realistic, you could indeed modify getInitialChannelEstimate to use nrChannelEstimate instead, though this would require transmitting an initial slot without optimized precoding to obtain the first practical channel estimate.

Regarding Your Channel Scaling Analysis

Your mathematical analysis of the channel scaling is excellent and demonstrates deep understanding. Let me validate and expand on your conclusions:

The Perfect Channel from TDL Model:

When you call H = nrPerfectChannelEstimate(carrier, pathGains, pathFilters), you obtain a channel grid that represents the frequency-domain channel response after OFDM demodulation. As documented at https://www.mathworks.com/help/5g/ref/nrperfectchannelestimate.html, this function:

  • Reconstructs the channel impulse response from pathGains and pathFilters
  • Performs OFDM demodulation to convert to frequency domain
  • Returns normalized channel coefficients

The Transmit Signal Processing:

As you correctly identified, the transmitted waveform undergoes this processing chain: txWaveform = txWaveform0 / max(abs(txWaveform0)) * db2mag(powerScaling) * db2mag(-pl_dB(carrier.NSlot+1))

Where: * txWaveform0 is the base OFDM waveform * Division by max(abs(txWaveform0)) normalizes to unit peak amplitude * db2mag(powerScaling) scales to desired transmit power * db2mag(-pl_dB(carrier.NSlot+1)) applies path loss attenuation

The Received Signal Model:

The received signal can be expressed as: Y = [txWaveform0 / max(abs(txWaveform0)) * db2mag(powerScaling) * db2mag(-pl_dB)] * H_tdl + noise

Where H_tdl is the time-domain channel impulse response that gets applied through the channel object.

The Practical Channel Estimate:

The nrChannelEstimate function performs least-squares estimation using DM-RS symbols. As you correctly analyzed:

    H_est ≈ Y / DMRS_symbols ≈ Y / txWaveform0

This gives: H_est ≈ [1/max(abs(txWaveform0))] * db2mag(powerScaling) * db2mag(- pl_dB) * H_tdl

Defining "The Channel":

Your final conclusion is particularly insightful. You stated: "Actually, to call it a channel, I think it is just H_tdl * db2mag(-pl_dB(carrier.NSlot+1)), or H_tdl * PathLoss. The max(abs(txWaveform0)) and db2mag(powerScaling) elements are just for scaling (preprocessing) purpose, I don't think it should be included in channel."

This is absolutely correct from a physical channel modeling perspective. The true wireless channel consists of:

  • H_tdl: The multipath fading channel (small-scale fading) from the TDL model
  • PathLoss: The large-scale path loss due to distance and atmospheric effects

The normalization factor max(abs(txWaveform0)) and power scaling db2mag(powerScaling) are indeed transmitter implementation details rather than channel characteristics.

Comparing Perfect and Estimated Channels

If you want to compare the perfect channel knowledge with the practical estimate for performance analysis, you should scale them consistently. Here's the recommended approach:

Option 1 - Compare in the Received Signal Domain:

Scale the perfect channel estimate to match the receiver's perspective: H_perfect_scaled = H * (1/max(abs(txWaveform0))) * db2mag(powerScaling) * db2mag(-pl_dB(carrier.NSlot+1));

Then compute error metrics like Mean Square Error (MSE):

   channelError = abs(H_est - H_perfect_scaled).^2;
   MSE = mean(channelError(:));

Option 2 - Compare in the Physical Channel Domain:

Remove the transmitter scaling from the estimated channel: H_est_descaled = H_est / ((1/max(abs(txWaveform0))) * db2mag(powerScaling) * db2mag(-pl_dB(carrier.NSlot+1)));

Then compare with the perfect channel H directly.

Option 3 - Normalized Comparison:

For many performance analyses, you can compare the normalized channels: H_perfect_norm = H ./ abs(H); H_est_norm = H_est ./ abs(H_est);

This removes the amplitude scaling effects entirely and focuses on phase and relative magnitude errors.

Why the Magnitude Ranges Differ

You observed that nrPerfectChannelEstimate returns values in the range [0.5, 0.7] while nrChannelEstimate returns values around 10^-6 times [3, 7.5]. This difference arises from:

1. Path Loss Attenuation: The path loss value of 1.5678e-08 (approximately -157 dB) causes massive attenuation, reducing the received signal level by about 8 orders of magnitude. This is typical for NTN scenarios with satellites at 600 km altitude. 2. Waveform Normalization: The division by max(abs(txWaveform0)) scales the waveform, and this scaling propagates through to the channel estimate. 3. Reference Point: The perfect channel estimate represents the channel at unit input power, while the practical estimate reflects the actual received signal levels after all transmitter processing and channel effects.

Additional Technical Considerations

Regarding Use in Precoding:

The example uses SVD-based precoding, which operates on the channel estimate to compute optimal precoding matrices. For precoding purposes, only the relative structure of the channel matrix matters (spatial characteristics across antennas and subcarriers), not the absolute magnitude scaling. This is why the getPrecodingMatrix function can work with either perfect or estimated channels - the SVD extracts the spatial eigenmodes regardless of overall scaling.

Regarding Noise Estimation:

The nrChannelEstimate function also returns a noise estimate (noiseEst) which is properly scaled relative to the estimated channel. This noise estimate is crucial for the MMSE equalizer (nrEqualizeMMSE) to properly weight the channel inversion. The noise level is computed from unused DM-RS tones and is automatically consistent with the channel estimate magnitude.

Regarding Power Normalization in OFDM:

The OFDM demodulation process (nrOFDMDemodulate) includes an inherent IFFT/FFT normalization. The perfect channel estimate accounts for this automatically since it performs OFDM demodulation internally. The practical channel estimate inherits the same normalization through the received signal processing chain.

Relevant Documentation Links

For your continued study of this topic, I recommend these MathWorks resources:

Core Functions:

Related Concepts: * Model 5G NR Communication Links: https://www.mathworks.com/help/5g/gs/model-5g-nr-communication-links.html * DL-SCH and PDSCH Processing Chain: https://www.mathworks.com/help/5g/gs/dl-sch-and-pdsch-transmit-and-receive-processing-chain.html

Summary

Your understanding is excellent, and your analysis correctly identifies that: 1. nrPerfectChannelEstimate provides ground-truth channel knowledge by directly converting the TDL model's pathGains and pathFilters to a frequency-domain channel grid. It is not a "receiver estimate" but rather a simulation convenience for obtaining the true channel. 2. nrChannelEstimate performs practical least-squares estimation from the received signal using DM-RS reference symbols, and its output magnitude includes all the transmitter scaling factors and path loss. 3. The physical channel consists of the TDL fading channel and path loss: H_channel = H_tdl * PathLoss. The transmitter normalization and power scaling factors are implementation choices, not channel characteristics. 4. For comparison purposes, you must scale the perfect and estimated channels to a common reference frame, accounting for all the transmitter processing steps that affect signal amplitude.

Your conclusion that the transmitter normalization and power scaling shouldn't be considered part of the channel is physically correct - these are signal processing operations, not propagation effects. The channel itself is the combination of multipath fading and path loss that the electromagnetic wave experiences during propagation.

I hope this clarifies the relationship between perfect channel knowledge and practical channel estimation in the context of the NR NTN PDSCH Throughput example. Your systematic approach to understanding the signal flow and scaling factors demonstrates excellent engineering analysis.

Thank you so much for your response.
So as I understand, the first time we use PerfectChannelEstimation is just for precoding purpose only? If we don't do that, we need to do some optimization? (I am not familiar much with precoding, beamforming,...) so to keep it simple, we use the perfect channel to calculate the optimal precoding, right?
Thank you so much. I will read more about precoding/beamforming to understand deeper.

Hi @Thien Hieu,

Yes, your understanding is exactly correct.

The initial use of nrPerfectChannelEstimate serves solely to compute an optimal precoding matrix for the first transmission slot. This is documented in the NR NTN PDSCH Throughput example, which states: " Obtain a precoding matrix (wtx) to use in the transmission of the first transport block."

Without perfect channel knowledge at startup, you would need to either:

1. Transmit the first slot without precoding (open-loop transmission),

or

2. Use suboptimal precoding based on statistical channel models

The example uses perfect knowledge initially to demonstrate best-case performance from the start. After the first slot, it switches to practical channel estimation (nrChannelEstimate) based on DM-RS for all subsequent precoding updates, making the remainder of the simulation realistic.

In SVD-based precoding, the precoding matrix is computed from the channel's singular vectors, which align the transmitted signals with the channel's spatial eigenmodes. This maximizes received signal power and is particularly important in MIMO systems.

Thank you so much for your answers.
I understand much better now.

Sign in to comment.

More Answers (0)

Categories

Asked:

on 2 Oct 2025

Commented:

on 6 Oct 2025

Community Treasure Hunt

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

Start Hunting!