We assume a cone frustum which has the volume $$V=(\pi/3) \cdot h \cdot (R^2 + R \cdot r + r^2)$$. R and r are the radii of the two frustum surface circles. Assuming that the pulse width is small compared to the range, we get $$R=r= \tan ( 0.5 \cdot \theta \cdot \pi/180 ) \cdot range$$ with theta being the aperture angle (beam width). Thus, the pulse volume simply becomes the volume of a cylinder with $$V=\pi \cdot h \cdot range^2 \cdot \tan( 0.5 \cdot \theta \cdot \pi/180)^2$$
Parameters: ranges (array) – the distances of each bin from the radar [m] h (float) – pulse width (which corresponds to the range resolution [m]) theta (float) – the aperture angle (beam width) of the radar beam [degree] output (numpy.ndarray) – Volume of radar bins at each range in ranges [$$m^3$$]