Rain attenuation model based on ITU-R P.838-3 Recommendation
Show older comments
I would like to plot the rain attenuation model based on ITU-R P.838-3 Recommendation as shown in the graph below:

I tried to used "rainlp" command in MATLAB but I could not get the same graph.
Any ideas how to get this graph by MATLAB?
clear all;clc
freq=[1:1000]*1e9;
Rr=[0.25, 1.25, 5, 25, 50, 100, 150];
for i=1:7
L=rainpl(10000,freq,Rr(i));
plot(freq/1e9,L)
hold on
grid
end
2 Comments
Thomas Moore
on 21 Jul 2023
I don't see that graph in ITU-R P.838-3; What source is it from? I'm also working with the matlab rainpl and comparing it with the formulae provided in the ITU-R publication.
Thomas Moore
on 21 Jul 2023
I'm alo curious in your solution and the answers submitted in response to your question, why you provided a range of 10000 meters (10 km) rather than 1 km if you're computing dB/km rather than total attenuation.
Answers (2)
@SAM,
freq=[1:1000]*1e9;
Rr=[0.25, 1.25, 5, 25, 50, 100, 150];
for i=1:7
L=rainpl(10000,freq,Rr(i));
loglog(freq/1e9,L)
ylim([0.01 Inf]);
hold on
grid
end
legend('Rr=0.25','1.25','5','25','50','100','150');
I replaced "plot" with "loglog" and I fixed the lower y axis limit at 0.01. This is similar to the graph you gave, but not identical. It seems Matlab's rainpl() has some differenrces from ITU-R P.838-3, at least at high rain rates.
Good luck.
5 Comments
William Rose
on 9 Sep 2022
@SAM,
The curve shapes in my plot look similar to the curves in the plot you gave, but the y-values are not the same, even at low rain rates. The values returned by Matlab are larger than the values in the plot you gave.
Why the difference?
Your plot shows the specific attenuation, which is attenuation in db per km. The Matlab documentation examples for rainpl() seem to imply that the value returned by rainpl() is the attenuation for 10 km. This works in the right direction to explain the discrepancy, but the magnitude of the discrepancy does not seem to match. It is also possible that the plot you provided is from a differemnt version of the ITU model than the version implemented by Matlab. Check the source for your plot and confirm the date of the standard which is represented by that plot. Als check what polarization angle is for the plot you gave. Maybe it differs from the angle of zero which is the default for rainpl().
SAM
on 9 Sep 2022
@SAM, you are welcome.
What is the source for the figure you posted? I ask because the figure you posted does not appear in either of the defining documents cited by Matlab: ITU-R P.838-3 (2005) or ITU-R P.530-17 (2017). Perhaps the figure you posted is from an earlier version of the standard, which may have since changed. Is your figure for horizontal or vertical polarization, or some other angle? Matlab's rainpl() defaults to horizontal.
The plot you posted is for attenuation per km. You and I both made a mistake: we used range=10000 (m) when we should have used range=1000 m, to get attenuation for 1 km. When I implement this fix - see code and plot below - the Matlab plot is closer to your figure, but not identical. Therefore there is still an unexplained discrepancy.
freq=[1:1000]*1e9;
Rr=[0.25, 1.25, 5, 25, 50, 100, 150];
for i=1:7
L=rainpl(1000,freq,Rr(i)); %range=1 km
loglog(freq/1e9,L)
ylim([0.01 Inf]);
hold on
grid
end
legend('Rr=0.25','1.25','5','25','50','100','150');
The remaining discrepancy is due to the fact that rainpl() returns the attenuation in dB for a specified distance. It does not return the specific attenuation in dB/km. I expected that the attenuation when distance=1000 m would equal the specific attenuation, but this is not the case, to a distance adjustment factor, r, which is explained in the Matlab help and in section 2.4.1, equations 32, 33, of ITU-R P.530-17 (2017).
Good luck with your work.
Thomas Moore
on 21 Jul 2023
Missed your answer before I posted mine. Noted the same about the figure and the distance discrepancy. I checked older ITU pubs which did not include the attenuation plot.
The best I can determine from the limited documentation is that for default call to rainpl(range, freq, rain-rate) that elev = 0 and tau = 0 (HH pol) as you stated. In the ITU pub, if elev = 90 (straight overhead) then k defaults to k = (kh + kv)/2 and alpha defaults to alpha = (kh*ah + kv*av)/2 * k
My approach will be to use the mean heights published in ITU 839.4 (very useful stats on height of 0 deg C isotherm), with h = h0 +.36 k, slant range computed thru the resulting h, and assume that matlab rainpl is using the effective distance per P530-17. Will plan to check that for comparison
It would be helpful to be able to extract the kh, kv, and alpha_v, alpha_h from rainpl to compare with other solutions.
Appreciate your answer to the original poster.
William Rose
on 23 Jul 2023
@Thomas Moore, thank you for your careful and thoughtful analysis. You make a good point that it would be helpful to extract kh,kv,alpha_v, alpha_h.
@SAM, you could accept the answer given above. I think the differences betwwen the figure you showed originally and Matlab's plot have been throughly explained above.
Thomas Moore
on 25 Jul 2023
0 votes
Matlab's example vs elevation holds the range fixed and varies the elevation to show dependency. I think that illustrates the dependency in Rec. ITU-R P.838-3 equations 3, and 4 with the polarization angle tau defaulted at 0 deg or horizontal pol. If I want 1-way attenuation for 1km, then I believe I need to set the range to 1000 m, the elevation to 90 deg (incidence angle from direct vertical) and then either evaluate V pol (tau = 90), H pol (tau = 0), or circular (tau = 45, where the elevation angle does not impact eq 3 or 4). By my way of thinking (looking for comments) you need to set the range to the slant range of interest at the elevation of interest. Depending on your geometry, don't forget to account for earth, horizon, etc. Basically, I was experimenting with how to pass the parameters to the rainpl() and if they made sense. ITU 839.4 provides the altitudes for the 0 deg isotherm globally based on 50 years of stats. Gives a good bound on rain height to consider for a receive/transmit antenna on the surface vs lat, long. For a generic example, I picked a 4 km height for the 0 deg isotherm. At 4 km, the horizon is at ~ 226 km so a path piercing the 4 km height arrives at a 0 deg elevation w.r.t. a point on the surface.

I computed the 1-way path using the range and elevations showv above for a 10 GHz frequency and 3 mm/hour rain rate i.e.
L(n) = rainpl(range(n), 10e9, 3, elev(n)); Used the default tau for horizontal polarization.
I also computed the dB per km 1 way path computation with LdBkm = rainpl(1000, 10e9, 3, 90) and used the result to compare how the rainpl() estimate vs range and elevation compares with just a range(n)*LdBkm (straight line in plot below). The linear range*dB/km is within 0.5 dB until the slant range is about 40 km and then the rainpl() overall path attenuation starts to drop. I think this effect gets into the 'effective distance' discussed in the related ITU regs. I confess I haven't pulled that apart to compare it. Logically it makes sense in that it's difficult to image a homegenous rain layer out to 200+ km. Without knowing exactly what's under the matlab function hood I think it's building an effective distance into the range.

Categories
Find more on Polar Plots 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!
