From c29a5e9b12f5052af9749bd908a71ce7bc754d7c Mon Sep 17 00:00:00 2001 From: Chuck SmileyRekiere Date: Tue, 16 Nov 2021 11:02:29 -0700 Subject: [PATCH] py-json/port_probe.py : initial commit for VHT calculations Signed-off-by: Chuck SmileyRekiere --- py-json/port_probe.py | 200 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 199 insertions(+), 1 deletion(-) diff --git a/py-json/port_probe.py b/py-json/port_probe.py index c0992036..ca58b432 100644 --- a/py-json/port_probe.py +++ b/py-json/port_probe.py @@ -32,6 +32,9 @@ class ProbePort(LFCliBase): self.he = None self.rx_mgt_6Mb_frame = None + self.he = False + self.ofdma = False + self.tx_bitrate = None self.tx_mcs = None self.tx_nss = None @@ -72,6 +75,8 @@ class ProbePort(LFCliBase): self.signals = dict(zip(keys, values)) tx_bitrate = [x for x in text if 'tx bitrate' in x][0].replace('\t', ' ') + if 'HE' in tx_bitrate: + print("HE not supported ") print("tx_bitrate {tx_bitrate}".format(tx_bitrate=tx_bitrate)) self.tx_bitrate = tx_bitrate.split(':')[-1].strip(' ') if 'MHz' in tx_bitrate: @@ -251,7 +256,6 @@ class ProbePort(LFCliBase): self.tx_gi = T_gi_long def calculated_data_rate_rx_HT(self): - # TODO compare with standard for 40 MHz if values change N_sd = 0 # Number of Data Subcarriers based on modulation and bandwith N_bpscs = 0 # Number of coded bits per Subcarrier(Determined by the modulation, MCS) R = 0 # coding , (Determined by the modulation, MCS ) @@ -340,3 +344,197 @@ class ProbePort(LFCliBase): else: self.rx_mbit_calc = self.rx_data_rate_gi_long_Mbps self.rx_gi = T_gi_long + + + def calculated_data_rate_tx_VHT(self): + # TODO compare with standard for 40 MHz if values change + N_sd = 0 # Number of Data Subcarriers based on modulation and bandwith + N_bpscs = 0 # Number of coded bits per Subcarrier(Determined by the modulation, MCS) + R = 0 # coding , (Determined by the modulation, MCS ) + N_ss = 0 # Number of Spatial Streams + T_dft = 3.2 * 10**-6 # Constant for HT + T_gi_short = .4 * 10**-6 # Guard index. + T_gi_long = .8 * 10**-6 # Guard index. + bw = 20 + # Note the T_gi is not exactly know so need to calculate bothh with .4 and .8 + # the nubmer of Data Subcarriers is based on modulation and bandwith + try: + bw = int(self.tx_mhz) + except BaseException: + print("port_probe.py: WARNING unable to parse tx MHz (BW) , check probe output will use {bw}".format(bw=bw)) + + print("Mhz {Mhz}".format(Mhz=self.tx_mhz)) + if bw == 20: + N_sd = 52 + elif bw == 40: + N_sd = 108 + elif bw == 80: + N_sd = 234 + elif bw == 160: + N_sd = 468 + else: + print("For HT if cannot be read bw is assumed to be 20") + N_sd = 52 + self.tx_mhz = 20 + + # NSS + N_ss = self.tx_nss + # MCS (Modulation Coding Scheme) determines the constands + # MCS 0 == Modulation BPSK R = 1/2 , N_bpscs = 1, + # Only for HT configuration + if self.tx_mcs == 0 : + R = 1 / 2 + N_bpscs = 1 + # MCS 1 == Modulation QPSK R = 1/2 , N_bpscs = 2 + elif self.tx_mcs == 1 : + R = 1 / 2 + N_bpscs = 2 + # MCS 2 == Modulation QPSK R = 3/4 , N_bpscs = 2 + elif self.tx_mcs == 2 : + R = 3 / 4 + N_bpscs = 2 + # MCS 3 == Modulation 16-QAM R = 1/2 , N_bpscs = 4 + elif self.tx_mcs == 3 : + R = 1 / 2 + N_bpscs = 4 + # MCS 4 == Modulation 16-QAM R = 3/4 , N_bpscs = 4 + elif self.tx_mcs == 4 : + R = 3 / 4 + N_bpscs = 4 + # MCS 5 == Modulation 64-QAM R = 2/3 , N_bpscs = 6 + elif self.tx_mcs == 5 : + R = 2 / 3 + N_bpscs = 6 + # MCS 6 == Modulation 64-QAM R = 3/4 , N_bpscs = 6 + elif self.tx_mcs == 6 : + R = 3 / 4 + N_bpscs = 6 + # MCS 7 == Modulation 64-QAM R = 5/6 , N_bpscs = 6 + elif self.tx_mcs == 7 : + R = 5 / 6 + N_bpscs = 6 + # MCS 8 == Modulation 256-QAM R = 3/4 , N_bpscs = 8 + elif self.tx_mcs == 8 : + R = 3 / 4 + N_bpscs = 8 + # MCS 9 == Modulation 256-QAM R = 5/6 , N_bpscs = 8 + elif self.tx_mcs == 9 : + R = 5 / 6 + N_bpscs = 8 + + print("tx: mcs {mcs} N_sd {N_sd} N_bpscs {N_bpscs} R {R} N_ss {N_ss} T_dft {T_dft} T_gi_short {T_gi_short}".format( + mcs=self.tx_mcs, N_sd=N_sd, N_bpscs=N_bpscs, R=R, N_ss=N_ss, T_dft=T_dft, T_gi_short=T_gi_short)) + + self.tx_data_rate_gi_short_Mbps = ((N_sd * N_bpscs * R * float(N_ss)) / (T_dft + T_gi_short)) / 1000000 + print("tx_data_rate gi_short {data_rate} Mbit/s".format(data_rate=self.tx_data_rate_gi_short_Mbps)) + + print("tx: mcs {mcs} N_sd {N_sd} N_bpscs {N_bpscs} R {R} N_ss {N_ss} T_dft {T_dft} T_gi_long {T_gi_long}".format( + mcs=self.tx_mcs, N_sd=N_sd, N_bpscs=N_bpscs, R=R, N_ss=N_ss, T_dft=T_dft, T_gi_long=T_gi_long)) + + self.tx_data_rate_gi_long_Mbps = ((N_sd * N_bpscs * R * float(N_ss)) / (T_dft + T_gi_long)) / 1000000 + print("data_rate gi_long {data_rate} Mbps".format(data_rate=self.tx_data_rate_gi_long_Mbps)) + + if abs(self.tx_mbit - self.tx_data_rate_gi_short_Mbps) <= abs(self.tx_mbit - self.tx_data_rate_gi_long_Mbps): + self.tx_mbit_calc = self.tx_data_rate_gi_short_Mbps + self.tx_gi = T_gi_short + else: + self.tx_mbit_calc = self.tx_data_rate_gi_long_Mbps + self.tx_gi = T_gi_long + + def calculated_data_rate_rx_VHT(self): + N_sd = 0 # Number of Data Subcarriers based on modulation and bandwith + N_bpscs = 0 # Number of coded bits per Subcarrier(Determined by the modulation, MCS) + R = 0 # coding , (Determined by the modulation, MCS ) + N_ss = 0 # Number of Spatial Streams + T_dft = 3.2 * 10**-6 # Constant for HT + T_gi_short = .4 * 10**-6 # Guard index. + T_gi_long = .8 * 10**-6 # Guard index. + # Note the T_gi is not exactly know so need to calculate bothh with .4 and .8 + # the nubmer of Data Subcarriers is based on modulation and bandwith + if self.rx_mgt_6Mb_frame is True: + self.rx_mgt_6Mg_frame = False + self.rx_data_rate_gi_short_Mbps = None + self.rx_data_rate_gi_long_Mbps = None + else: + try: + bw = int(self.rx_mhz) + except BaseException: + print("port_probe.py: {} WARNING unable to parse rx MHz (BW) , check probe output will use ") + + print("Mhz {Mhz}".format(Mhz=self.rx_mhz)) + if bw == 20: + N_sd = 52 + elif bw == 40: + N_sd = 108 + elif bw == 80: + N_sd = 234 + elif bw == 160: + N_sd = 468 + else: + print("For HT if cannot be read bw is assumed to be 20") + N_sd = 52 + self.rx_mhz = 20 + + # NSS + N_ss = self.rx_nss + # MCS (Modulation Coding Scheme) determines the constands + # MCS 0 == Modulation BPSK R = 1/2 , N_bpscs = 1, + # Only for HT configuration + if self.rx_mcs == 0 : + R = 1 / 2 + N_bpscs = 1 + # MCS 1 == Modulation QPSK R = 1/2 , N_bpscs = 2 + elif self.rx_mcs == 1 : + R = 1 / 2 + N_bpscs = 2 + # MCS 2 == Modulation QPSK R = 3/4 , N_bpscs = 2 + elif self.rx_mcs == 2 : + R = 3 / 4 + N_bpscs = 2 + # MCS 3 == Modulation 16-QAM R = 1/2 , N_bpscs = 4 + elif self.rx_mcs == 3 : + R = 1 / 2 + N_bpscs = 4 + # MCS 4 == Modulation 16-QAM R = 3/4 , N_bpscs = 4 + elif self.rx_mcs == 4 : + R = 3 / 4 + N_bpscs = 4 + # MCS 5 == Modulation 64-QAM R = 2/3 , N_bpscs = 6 + elif self.rx_mcs == 5 : + R = 2 / 3 + N_bpscs = 6 + # MCS 6 == Modulation 64-QAM R = 3/4 , N_bpscs = 6 + elif self.rx_mcs == 6 : + R = 3 / 4 + N_bpscs = 6 + # MCS 7 == Modulation 64-QAM R = 5/6 , N_bpscs = 6 + elif self.rx_mcs == 7 : + R = 5 / 6 + N_bpscs = 6 + # MCS 8 == Modulation 256-QAM R = 3/4 , N_bpscs = 8 + elif self.rx_mcs == 8 : + R = 3 / 4 + N_bpscs = 8 + # MCS 9 == Modulation 256-QAM R = 5/6 , N_bpscs = 8 + elif self.rx_mcs == 9 : + R = 5 / 6 + N_bpscs = 8 + + print("mcs {mcs} N_sd {N_sd} N_bpscs {N_bpscs} R {R} N_ss {N_ss} T_dft {T_dft} T_gi_short {T_gi_short}".format( + mcs=self.rx_mcs, N_sd=N_sd, N_bpscs=N_bpscs, R=R, N_ss=N_ss, T_dft=T_dft, T_gi_short=T_gi_short)) + + self.rx_data_rate_gi_short_Mbps = ((N_sd * N_bpscs * R * float(N_ss)) / (T_dft + T_gi_short)) / 1000000 + print("rx_data_rate gi_short {data_rate} Mbit/s".format(data_rate=self.rx_data_rate_gi_short_Mbps)) + + print("mcs {mcs} N_sd {N_sd} N_bpscs {N_bpscs} R {R} N_ss {N_ss} T_dft {T_dft} T_gi_long {T_gi_long}".format( + mcs=self.rx_mcs, N_sd=N_sd, N_bpscs=N_bpscs, R=R, N_ss=N_ss, T_dft=T_dft, T_gi_long=T_gi_long)) + + self.rx_data_rate_gi_long_Mbps = ((N_sd * N_bpscs * R * float(N_ss)) / (T_dft + T_gi_long)) / 1000000 + print("rx_data_rate gi_long {data_rate} Mbps".format(data_rate=self.rx_data_rate_gi_long_Mbps)) + + if abs(self.rx_mbit - self.rx_data_rate_gi_short_Mbps) <= abs(self.rx_mbit - self.rx_data_rate_gi_long_Mbps): + self.rx_mbit_calc = self.rx_data_rate_gi_short_Mbps + self.rx_gi = T_gi_short + else: + self.rx_mbit_calc = self.rx_data_rate_gi_long_Mbps + self.rx_gi = T_gi_long