diff --git a/UDP-client-server.py b/UDP-client-server.py index 2a71c8676f3e6b99acb69dc6219f11d34f804478..efa15edcbb097b09a8236255a8e2e25e88c725df 100755 --- a/UDP-client-server.py +++ b/UDP-client-server.py @@ -37,11 +37,13 @@ def udp_client_receive(UDP_RECEIVE_IP, UDP_RECEIVE_PORT): global min_delay global max_delay global rt_delay_array + global jitter min_delay = 100. max_delay = 0. rt_delay_array = array('f') packet_count_rcvd = 0 cumulative_delay = 0. + jitter = 0. try: rcv_sock.bind(ADDR) @@ -144,6 +146,27 @@ def udp_client_send(UDP_DEST_IP, UDP_DEST_PORT, if rt_delay_array: print('std.dev = ', np.std(rt_delay_array)) +#CALCULATE JITTER +# Clear for a clean slate + jitter = 0 + jitter_2 = 0 + + # Simple version, no weight + for rt0, rt1 in zip(rt_delay_array[:-1], rt_delay_array[1:]): + jitter_2 += np.fabs(rt0 - rt1) + + jitter_2 = jitter_2 / (len(rt_delay_array) - 1) + + + # Version used in RFC 1889, also by iperf + for rt0, rt1 in zip(rt_delay_array[:-1], rt_delay_array[1:]): + jitter += (np.fabs(rt0 - rt1) - jitter) / 16. + + #jitter = jitter / (len(rt_delay_array) - 1) + + print("jitter = ", jitter) + print("jitter = ", jitter_2) + #NETWORK STABILITY BASED ON PACKET LOSS AND DELAY, VALUE 0-100 network_stability = 0 if packet_count_rcvd == 0: @@ -156,6 +179,26 @@ def udp_client_send(UDP_DEST_IP, UDP_DEST_PORT, print('avg.rtt = ', avg_packet_delay) print('stability = ', network_stability) +# Calculating MOS +# http://en.wikipedia.org/wiki/Mean_opinion_score +#MOS Quality Impairment +#5 Excellent Imperceptible +#4 Good Perceptible but not annoying +#3 Fair Slightly annoying +#2 Poor Annoying +#1 Bad Very annoying + + EffectiveLatency = avg_packet_delay + jitter * 2 + 10 + if EffectiveLatency < 160: + R = 93.2 - (EffectiveLatency / 40) + else: + R = 93.2 - (EffectiveLatency - 120) / 10 + # Now, let's deduct 2.5 R values per percentage of packet loss + R = R - ((packet_count_sent - packet_count_rcvd) * 2.5) + # Convert the R into an MOS value.(this is a known formula) + mos = 1 + (0.035) * R + (.000007) * R * (R-60) * (100-R) + + print("MOS: ", mos) #START THE THREADS FOR SENDER AND RECEIVER if __name__ == "__main__": @@ -178,3 +221,5 @@ if __name__ == "__main__": sender_thread.start() while sender_thread.is_alive(): time.sleep(1) +# While testing, end after one iteration + sys.exit()