Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

هيلو حبر. ممڪن آهي ته هر ماڻهو جنهن ڪڏهن جهاز تي مائٽن يا دوستن سان ملاقات ڪئي هجي يا ڏٺو هجي مفت Flightradar24 سروس استعمال ڪئي آهي. هي حقيقي وقت ۾ جهاز جي پوزيشن کي ٽريڪ ڪرڻ لاء هڪ تمام آسان طريقو آهي.

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

В پهريون حصو اهڙي آن لائن سروس جي آپريٽنگ اصول بيان ڪيو ويو آهي. اسان ھاڻي اڳتي وڌنداسين ۽ معلوم ڪنداسين ته جهاز مان ڪھڙي ڊيٽا موڪلي ۽ وصول ڪئي پئي وڃي ۽ پٿون استعمال ڪندي پاڻ ان کي ڊيڪوڊنگ ڪريون.

История

ظاهر آهي، جهاز جي ڊيٽا منتقل نه ڪئي وئي آهي صارفين لاء انهن جي اسمارٽ فونز تي ڏسڻ لاء. سسٽم کي ADS-B (خودڪار انحصار نگراني-براڊ ڪاسٽ) سڏيو ويندو آهي، ۽ خودڪار طور تي جهاز جي باري ۾ معلومات کي ڪنٽرول سينٽر ڏانهن منتقل ڪرڻ لاء استعمال ڪيو ويندو آهي - ان جي سڃاڻپ ڪندڙ، همراه، هدايت، رفتار، اونچائي ۽ ٻيا ڊيٽا منتقل ڪيا ويندا آهن. اڳي، اهڙي نظام جي اچڻ کان اڳ، موڪليندڙ صرف رادار تي هڪ نقطو ڏسي سگهي ٿو. اهو هاڻي ڪافي نه هو جڏهن تمام گهڻا جهاز هئا.

تخنيقي طور تي، ADS-B هڪ جهاز تي هڪ ٽرانسميٽر تي مشتمل آهي جيڪو وقتي طور تي معلومات سان گڏ پيڪٽ موڪليندو آهي 1090 ميگا هرٽز جي انتهائي تيز تعدد تي (ٻيا طريقا آهن، پر اسان کي انهن ۾ دلچسپي نه آهي، ڇو ته همراه صرف هتي منتقل ڪيا ويا آهن). يقينن، ٽرانسميٽر کان علاوه، ايئرپورٽ تي هڪ رسيور پڻ آهي، پر اسان لاء، صارفين جي طور تي، اسان جو پنهنجو رسيور دلچسپ آهي.

رستي جي لحاظ کان، مقابلي لاء، پهريون اهڙو سسٽم، Airnav Radarbox، عام استعمال ڪندڙن لاء ٺهيل، 2007 ۾ ظاهر ٿيو، ۽ تقريبا $ 900 جي قيمت؛ نيٽ ورڪ خدمتن جي رڪنيت جي قيمت $ 250 هڪ سال.

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

انهن پهرين روسي مالڪن جا جائزو فورم تي پڙهي سگهجي ٿو ريڊيو اسڪينر. هاڻي ته RTL-SDR وصول ڪندڙ وڏي پيماني تي دستياب ٿي چڪا آهن، هڪ اهڙي ڊوائيس $ 30 لاء گڏ ڪري سگهجي ٿي؛ ان بابت وڌيڪ پهريون حصو. اچو ته پاڻ پروٽوڪول ڏانهن وڃو - اچو ته ڏسو ته اهو ڪيئن ڪم ڪري ٿو.

سگنل وصول ڪرڻ

پهرين، سگنل کي رڪارڊ ڪرڻ جي ضرورت آهي. پوري سگنل جو عرصو صرف 120 مائڪرو سيڪنڊن جو آهي، تنهن ڪري آرام سان ان جي اجزاء کي ڌار ڪرڻ لاءِ، گهٽ ۾ گهٽ 5 MHz جي نموني جي تعدد سان هڪ SDR رسيور گهربل آهي.

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

رڪارڊنگ کان پوءِ، اسان کي 5000000 نموني/سيڪنڊ جي نموني جي شرح سان WAV فائل ملي ٿي؛ 30 سيڪنڊن جي اهڙي رڪارڊنگ ”وزن“ اٽڪل 500MB. ميڊيا پليئر سان ان کي ٻڌڻ، يقينا، بيڪار آهي - فائل ۾ آواز نه آهي، پر هڪ سڌو ڊجيٽل ريڊيو سگنل - اهو بلڪل ڪيئن آهي سافٽ ويئر بيان ڪيل ريڊيو ڪم ڪندو آهي.

اسان Python استعمال ڪندي فائل کي کوليو ۽ پروسيس ڪنداسين. جيڪي پاڻ تي تجربا ڪرڻ چاھين ٿا، اھي ڊائون لوڊ ڪري سگھن ٿا مثال رڪارڊنگ لنڪ.

اچو ته فائل ڊائون لوڊ ڪريو ۽ ڏسو ته اندر ڇا آهي.

from scipy.io import wavfile
import matplotlib.pyplot as plt
import numpy as np

fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav")
data = data.astype(float)
I, Q = data[:, 0], data[:, 1]
A = np.sqrt(I*I + Q*Q)

plt.plot(A)
plt.show()

نتيجو: اسان پس منظر جي شور جي خلاف واضح "پلس" ڏسون ٿا.

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

هر "نبض" هڪ سگنل آهي، جنهن جي جوڙجڪ واضح طور تي نظر اچي ٿي جيڪڏهن توهان گراف تي قرارداد وڌايو.

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

جئين توهان ڏسي سگهو ٿا، تصوير بلڪل مطابقت رکي ٿي جيڪا مٿي ڏنل بيان ۾ ڏنل آهي. توھان ڊيٽا کي پروسيسنگ شروع ڪري سگھو ٿا.

ڊيڪوڊنگ

پهرين، توهان کي ٿورو وهڪرو حاصل ڪرڻ جي ضرورت آهي. سگنل پاڻ انڪوڊ ٿيل آهي مانچسٽر انڪوڊنگ استعمال ڪندي:

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

nibbles ۾ سطح جي فرق کان حقيقي "0" ۽ "1" حاصل ڪرڻ آسان آهي.

    bits_str = ""
    for p in range(8):
        pos = start_data + bit_len*p
        p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len]
        avg1, avg2 = np.average(p1), np.average(p2)
        if avg1 < avg2:
            bits_str += "0"
        elif avg1 > avg2:
            bits_str += "1"

سگنل جي جوڙجڪ خود هن ريت آهي:

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

اچو ته وڌيڪ تفصيل سان شعبن کي ڏسو.

DF (ڊائون لنڪ فارميٽ، 5 بٽس) - پيغام جو قسم طئي ڪري ٿو. اتي ڪيترائي قسم آھن:

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول
(ٽيبل جو ذريعو)

اسان صرف DF17 قسم ۾ دلچسپي رکون ٿا، ڇاڪاڻ ته ... اهو ئي آهي جنهن ۾ جهاز جي همراهن تي مشتمل آهي.

آئي سي اي (24 بٽ) - جهاز جو بين الاقوامي منفرد ڪوڊ. توهان جهاز کي ان جي ڪوڊ ذريعي چيڪ ڪري سگهو ٿا آن لائن (بدقسمتي سان، ليکڪ ڊيٽابيس کي اپڊيٽ ڪرڻ بند ڪري ڇڏيو آهي، پر اهو اڃا تائين لاڳاپيل آهي). مثال طور، ڪوڊ 3c5ee2 لاءِ اسان وٽ ھيٺ ڏنل معلومات آھي:

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

ترميم ڪريو: ۾ مضمون تي تبصرا ICAO ڪوڊ جو تفصيل وڌيڪ تفصيل سان ڏنو ويو آهي؛ مان سفارش ڪريان ٿو ته دلچسپي رکندڙ ان کي پڙهن.

ڊيٽا (56 يا 112 بٽ) - اصل ڊيٽا جنهن کي اسين ڊيڪوڊ ڪنداسين. ڊيٽا جا پهريان 5 بٽ فيلڊ آهن ڪوڊ جو قسم، ذخيرو ٿيل ڊيٽا جي ذيلي قسم تي مشتمل (DF سان پريشان نه ٿيڻ). انهن قسمن مان ڪافي ٿورا آهن:

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول
(ٽيبل جو ذريعو)

اچو ته پيڪيجز جا چند مثال ڏسو.

هوائي جهاز جي سڃاڻپ

بائنري فارم ۾ مثال:

00100 011 000101 010111 000111 110111 110001

ڊيٽا جا ميدان:

+------+------+------+------+------+------+------+------+------+------+
| TC,5 | EC,3 | C1,6 | C2,6 | C3,6 | C4,6 | C5,6 | C6,6 | C7,6 | C8,6 |
+------+------+------+------+------+------+------+------+------+------+

TC = 00100b = 4، هر اکر C1-C8 ۾ لڪير ۾ اشارن سان لاڳاپيل ڪوڊ شامل آهن:
#ABCDEFGHIJKLMNOPQRSTUVWXYZ####_################0123456789#####

تار کي ڊيڪوڊنگ ڪندي، جهاز جو ڪوڊ حاصل ڪرڻ آسان آهي: EWG7184

symbols = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######"
code_str = ""
for p in range(8):
     c = int(bits_str[8 + 6*p:8 + 6*(p + 1)], 2)
     code_str += symbols[c]
print("Aircraft Identification:", code_str.replace('#', ''))

هوائي جهاز جي پوزيشن

جيڪڏهن نالو سادو آهي، ته پوءِ همراهن وڌيڪ پيچيده آهن. اهي 2 جي صورت ۾ منتقل ڪيا ويا آهن، هڪ به ۽ بي جوڙ فريم. فيلڊ ڪوڊ TC = 01011b = 11.

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول

هموار ۽ بي جوڙ پيڪيٽ جا مثال:

01011 000 000101110110 00 10111000111001000 10000110101111001
01011 000 000110010000 01 10010011110000110 10000011110001000

همراهن جو ڳڻپ پاڻ هڪ مشڪل فارمولا جي مطابق ٿئي ٿو:

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول
(ذريعو)

مان هڪ GIS ماهر نه آهيان، تنهنڪري مون کي خبر ناهي ته اهو ڪٿان اچي ٿو. ڪير ڄاڻي ٿو، تبصرن ۾ لکندا.

اونچائي کي آسان سمجهيو ويندو آهي - مخصوص ساٽ تي منحصر ڪري، ان کي 25 يا 100 فوٽن جي گھڻن جي طور تي نمائندگي ڪري سگهجي ٿو.

هوا جي رفتار

پيڪيج سان گڏ TC = 19. هتي دلچسپ ڳالهه اها آهي ته رفتار يا ته صحيح ٿي سگهي ٿي، زمين جي نسبت سان (گرائونڊ اسپيڊ)، يا هوائي جهاز جي سينسر (ايئر اسپيڊ) ذريعي ماپي ويندي. ڪيترائي مختلف شعبا پڻ منتقل ڪيا ويا آهن:

Flightradar24 - اهو ڪيئن ڪم ڪندو آهي؟ حصو 2، ADS-B پروٽوڪول
(ذريعو)

ٿڪل

جئين توهان ڏسي سگهو ٿا، ADS-B ٽيڪنالاجي هڪ دلچسپ symbiosis بڻجي چڪو آهي، جڏهن هڪ معيار مفيد آهي نه رڳو پروفيسر، پر عام استعمال ڪندڙن لاء. پر يقينن، ان ۾ هڪ اهم ڪردار ڊجيٽل SDR وصول ڪندڙن جي سستي ٽيڪنالاجي طرفان ادا ڪيو ويو، جيڪو ڊوائيس لفظي طور تي سگنل وصول ڪرڻ جي اجازت ڏئي ٿو گيگا هرٽز کان مٿي فريڪوئنسي سان "پيني لاء."

معيار پاڻ ۾، يقينا، اتي تمام گهڻو آهي. دلچسپي رکندڙ ماڻهو پي ڊي ايف تي ڏسي سگهن ٿا آئي سي اي يا مٿي ذڪر ڪيل هڪ جو دورو ڪريو ويب سائيٽ.

اهو ممڪن ناهي ته مٿين سڀني مان ڪيترن ئي لاء مفيد هوندا، پر گهٽ ۾ گهٽ عام خيال ته اهو ڪيئن ڪم ڪري ٿو، مون کي اميد آهي، باقي رهي ٿو.

رستي ۾، پٿون ۾ هڪ تيار ڪيل ڊيڪوڊر اڳ ۾ ئي موجود آهي، توهان ان کي پڙهي سگهو ٿا هتي. ۽ SDR وصول ڪندڙن جا مالڪ گڏ ڪري سگھن ٿا ۽ لانچ ڪري سگھن ٿا تيار ٿيل ADS-B ڊيڪوڊر صفحي کان، هن ۾ وڌيڪ تفصيل سان بحث ڪيو ويو آهي پهريون حصو.

مضمون ۾ بيان ڪيل پارسر جو سورس ڪوڊ ڪٽ هيٺ ڏنل آهي. ھي ھڪڙو امتحاني مثال آھي جيڪو پروڊڪشن جو اڳڪٿي نٿو ڪري، پر ڪجھ شيون ان ۾ ڪم ڪن ٿيون، ۽ اھو مٿي ڏنل فائل کي پارس ڪرڻ لاءِ استعمال ڪري سگھجي ٿو.
ماخذ ڪوڊ (Python)

from __future__ import print_function
from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np
import math
import sys
def parse_message(data, start, bit_len):
max_len = bit_len*128
A = data[start:start + max_len]
A = signal.resample(A, 10*max_len)
bits = np.zeros(10*max_len)
bit_len *= 10
start_data = bit_len*8
# Parse first 8 bits
bits_str = ""
for p in range(8):
pos = start_data + bit_len*p
p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len]
avg1, avg2 = np.average(p1), np.average(p2)
if avg1 < avg2:
bits_str += "0"
elif avg1 > avg2:
bits_str += "1"
df = int(bits_str[0:5], 2)
# Aircraft address (db - https://junzis.com/adb/?q=3b1c5c )
bits_str = ""
for p in range(8, 32):
pos = start_data + bit_len * p
p1, p2 = A[pos: pos + bit_len / 2], A[pos + bit_len / 2: pos + bit_len]
avg1, avg2 = np.average(p1), np.average(p2)
if avg1 < avg2:
bits_str += "0"
elif avg1 > avg2:
bits_str += "1"
# print "Aircraft address:", bits_str, hex(int(bits_str, 2))
address = hex(int(bits_str, 2))
# Filter specific aircraft (optional)
# if address != "0x3c5ee2":
#    return
if df == 16 or df == 17 or df == 18 or df == 19 or df == 20 or df == 21:
# print "Pos:", start, "DF:", msg_type
# Data (56bit)
bits_str = ""
for p in range(32, 88):
pos = start_data + bit_len*p
p1, p2 = A[pos: pos + bit_len/2], A[pos + bit_len/2: pos + bit_len]
avg1, avg2 = np.average(p1), np.average(p2)
if avg1 < avg2:
bits_str += "0"
# bits[pos + bit_len / 2] = 50
elif avg1 > avg2:
bits_str += "1"
# http://www.lll.lu/~edward/edward/adsb/DecodingADSBposition.html
# print "Data:"
# print bits_str[:8], bits_str[8:20],  bits_str[20:22], bits_str[22:22+17], bits_str[39:39+17]
# Type Code:
tc, ec = int(bits_str[:5], 2), int(bits_str[5:8], 2)
# print("DF:", df, "TC:", tc)
# 1 - 4  Aircraft identification
# 5 - 8  Surface position
# 9 - 18  Airborne position (w/ Baro Altitude)
# 19  Airborne velocities
if tc >= 1 and tc <= 4: # and (df == 17 or df == 18):
print("Aircraft address:", address)
print("Data:")
print(bits_str[:8], bits_str[8:14],  bits_str[14:20], bits_str[20:26], bits_str[26:32], bits_str[32:38], bits_str[38:44])
symbols = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789######"
code_str = ""
for p in range(8):
c = int(bits_str[8 + 6*p:8 + 6*(p + 1)], 2)
code_str += symbols[c]
print("Aircraft Identification:", code_str.replace('#', ''))
print()
if tc == 11:
print("Aircraft address:", address)
print("Data: (11)")
print(bits_str[:8], bits_str[8:20],  bits_str[20:22], bits_str[22:22+17], bits_str[39:39+17])
# Bit 22 contains the F flag which indicates which CPR format is used (odd or even)
# First frame has F flag = 0 so is even and the second frame has F flag = 1 so odd
# f = bits_str[21:22]
# print("F:", int(f, 2))
# Altitude
alt1b = bits_str[8:20]
if alt1b[-5] == '1':
bits = alt1b[:-5] + alt1b[-4:]
n = int(bits, 2)
alt_ft = n*25 - 1000
print("Alt (ft)", alt_ft)
# lat_dec = int(bits_str[22:22+17], 2)
# lon_dec = int(bits_str[39:39+17], 2)
# print("Lat/Lon:", lat_dec, lon_dec)
# http://airmetar.main.jp/radio/ADS-B%20Decoding%20Guide.pdf
print()
if tc == 19:
print("Aircraft address:", address)
print("Data:")
# print(bits_str)
print(bits_str[:5], bits_str[5:8], bits_str[8:10], bits_str[10:13], bits_str[13] ,bits_str[14:24], bits_str[24], bits_str[25:35], bits_str[35:36], bits_str[36:65])
subtype = int(bits_str[5:8], 2)
# https://mode-s.org/decode/adsb/airborne-velocity.html
spd, hdg, rocd = -1, -1, -1
if subtype == 1 or subtype == 2:
print("Velocity Subtype 1: Ground speed")
v_ew_sign = int(bits_str[13], 2)
v_ew = int(bits_str[14:24], 2) - 1       # east-west velocity
v_ns_sign = int(bits_str[24], 2)
v_ns = int(bits_str[25:35], 2) - 1       # north-south velocity
v_we = -1*v_ew if v_ew_sign else v_ew
v_sn = -1*v_ns if v_ns_sign else v_ns
spd = math.sqrt(v_sn*v_sn + v_we*v_we)  # unit in kts
hdg = math.atan2(v_we, v_sn)
hdg = math.degrees(hdg)                 # convert to degrees
hdg = hdg if hdg >= 0 else hdg + 360    # no negative val
if subtype == 3:
print("Subtype Subtype 3: Airspeed")
hdg = int(bits_str[14:24], 2)/1024.0*360.0
spd = int(bits_str[25:35], 2)
vr_sign = int(bits_str[36], 2)
vr = int(bits_str[36:45], 2)
rocd = -1*vr if vr_sign else vr         # rate of climb/descend
print("Speed (kts):", spd, "Rate:", rocd, "Heading:", hdg)
print()
# print()
def calc_coordinates():
def _cprN(lat, is_odd):
nl = _cprNL(lat) - is_odd
return nl if nl > 1 else 1
def _cprNL(lat):
try:
nz = 15
a = 1 - math.cos(math.pi / (2 * nz))
b = math.cos(math.pi / 180.0 * abs(lat)) ** 2
nl = 2 * math.pi / (math.acos(1 - a/b))
return int(math.floor(nl))
except:
# happens when latitude is +/-90 degree
return 1
def floor_(x):
return int(math.floor(x))
lat1b, lon1b, alt1b = "10111000111010011", "10000110111111000", "000101111001"
lat2b, lon2b, alt2b = "10010011101011100", "10000011000011011", "000101110111"
lat1, lon1, alt1 = int(lat1b, 2), int(lon1b, 2), int(alt1b, 2)
lat2, lon2, alt2 = int(lat2b, 2), int(lon2b, 2), int(alt2b, 2)
# 131072 is 2^17, since CPR lat and lon are 17 bits each
cprlat_even, cprlon_even = lat1/131072.0, lon1/131072.0
cprlat_odd, cprlon_odd = lat2/131072.0, lon2/131072.0
print(cprlat_even, cprlon_even)
j = floor_(59*cprlat_even - 60*cprlat_odd)
print(j)
air_d_lat_even = 360.0 / 60
air_d_lat_odd = 360.0 / 59
# Lat
lat_even = float(air_d_lat_even * (j % 60 + cprlat_even))
lat_odd = float(air_d_lat_odd * (j % 59 + cprlat_odd))
if lat_even >= 270:
lat_even = lat_even - 360
if lat_odd >= 270:
lat_odd = lat_odd - 360
# Lon
ni = _cprN(lat_even, 0)
m = floor_(cprlon_even * (_cprNL(lat_even)-1) - cprlon_odd * _cprNL(lat_even) + 0.5)
lon = (360.0 / ni) * (m % ni + cprlon_even)
print("Lat", lat_even, "Lon", lon)
# Altitude
# Q-bit (bit 48) indicates whether the altitude is encoded in multiples of 25 or 100 ft (0: 100 ft, 1: 25 ft)
# The value can represent altitudes from -1000 to +50175 ft.
if alt1b[-5] == '1':
bits = alt1b[:-5] + alt1b[-4:]
n = int(bits, 2)
alt_ft = n*25 - 1000
print("Alt (ft)", alt_ft)
fs, data = wavfile.read("adsb_20190311_191728Z_1090000kHz_RF.wav")
T = 1/fs
print("Sample rate %f MS/s" % (fs / 1e6))
print("Cnt samples %d" % len(data))
print("Duration: %f s" % (T * len(data)))
data = data.astype(float)
cnt = data.shape[0]
# Processing only part on file (faster):
# cnt = 10000000
# data = data[:cnt]
print("Processing I/Q...")
I, Q = data[:, 0], data[:, 1]
A = np.sqrt(I*I + Q*Q)
bits = np.zeros(cnt)
# To see scope without any processing, uncomment
# plt.plot(A)
# plt.show()
# sys.exit(0)
print("Extracting signals...")
pos = 0
avg = 200
msg_start = 0
# Find beginning of each signal
while pos < cnt - 16*1024:
# P1 - message start
while pos < cnt - 16*1024:
if A[pos] < avg and A[pos+1] > avg and pos - msg_start > 1000:
msg_start = pos
bits[pos] = 100
pos += 4
break
pos += 1
start1, start2, start3, start4 = msg_start, 0, 0, 0
# P2
while pos < cnt - 16*1024:
if A[pos] < avg and A[pos+1] > avg:
start2 = pos
bits[pos] = 90
pos += 1
break
pos += 1
# P3
while pos < cnt - 16*1024:
if A[pos] < avg and A[pos+1] > avg:
start3 = pos
bits[pos] = 80
pos += 1
break
pos += 1
# P4
while pos < cnt - 16*1024:
if A[pos] < avg and A[pos+1] > avg:
start4 = pos
bits[pos] = 70
pos += 1
break
pos += 1
sig_diff = start4 - start1
if 20 < sig_diff < 25:
bits[msg_start] = 500
bit_len = int((start4 - start1) / 4.5)
# print(pos, start1, start4, ' - ', bit_len)
# start = start1 + 8*bit_len
parse_message(A, msg_start, bit_len)
pos += 450
# For debugging: check signal start
# plt.plot(A)
# plt.plot(bits)
# plt.show()

مون کي اميد آهي ته ڪنهن کي دلچسپي هئي، توهان جي توجه جي مهرباني.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو