Three common causes of screwy speed readings are
Range to target - errors in range can really mess up your speed
Speed of your submarine - Unless your target is +/- 10 degrees from either 000 or 180 relative bearing, your speed calculations will be inaccurate.
Duration between readings - Accuracy in speed calculations improves the longer you observe your target. Also multiple observations help your accuracy. In real life subs tracked targets for many many minutes to get accurate course and speed.
I find using the speed estimation functions in SH4 to be inaccurate.
Personally I prefer using alternate means to get speed estimations
1. 3:15 (3:00) rule works well if you have the contact plot activated
2. Often I will use the direct observation method. This works well as you do not have to know the range to the target to get the speed.
a. Identify the target ship and determine the length in meters
b. Either stop your boat or have your target at 000/180 relative bearing to minimize your speeds influences
c. Put your periscope cross hair just in front of the target ship. Do not move the periscope!
d. When the bow of the target ship touches the cross-hair, start your stopwatch
e. When the stern of the target ship touches the cross-hair, stop your stopwatch
f. Speed (kts) = 1.94 x (length in meters)/(time in seconds)
f1. I "think" the conversion to imperial is Speed (kts) = 0.58 x (length in feet) / (time in seconds) but I am not sure as I do that metric thing all the time
This works for targets at any range and at "most" AoBs
Good luck and good hunting