څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

له تاریخ څخه دمخه

د ریټرو هارډویر مینه وال په توګه ، ما یوځل په انګلستان کې له پلورونکي څخه ZX سپیکٹرم + اخیستی. پخپله کمپیوټر کې شامل شوي، ما د لوبو سره څو آډیو کیسټونه ترلاسه کړل (د لارښوونو سره په اصلي بسته بندۍ کې)، او همدارنګه د ځانګړو نښه کولو پرته په کیسټونو کې ثبت شوي پروګرامونه. په حیرانتیا سره، د 40 کلنو کیسټونو ډاټا په ښه توګه د لوستلو وړ وه او ما د دې توان درلود چې نږدې ټولې لوبې او پروګرامونه له دوی څخه ډاونلوډ کړم.

څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

په هرصورت، په ځینو کیسټونو کې ما ریکارډونه وموندل چې په ښکاره ډول د ZX سپیکٹرم کمپیوټر لخوا ندي جوړ شوي. دوی په بشپړ ډول مختلف غږ وکړ او د ذکر شوي کمپیوټر څخه د ریکارډونو برعکس، دوی د لنډ BASIC بوټلوډر سره پیل نه کړل، کوم چې معمولا د ټولو پروګرامونو او لوبو ریکارډونو کې شتون لري.

د یو څه وخت لپاره دا ما ځوروي - ما واقعیا غوښتل چې ومومئ چې په دوی کې څه پټ دي. که تاسو د آډیو سیګنال د بایټونو د ترتیب په توګه لوستلی شئ ، تاسو کولی شئ د کرکټرونو یا هر هغه څه په لټه کې شئ چې د سیګنال اصل په ګوته کوي. یو ډول لرغونپوهنه

اوس چې زه ټوله لاره تللې یم او پخپله د کیسټونو لیبل ګورم ، زه موسکا شوم

ځواب زما د سترګو په وړاندې سم و
د کیڼ کیسټ په لیبل کې د TRS-80 کمپیوټر نوم دی، او د تولید کونکي نوم لاندې دی: "په متحده ایالاتو کې د راډیو شیک لخوا تولید شوی"

(که غواړې چې دسیسې تر اخره پورې وساتې، نو د سپیلر لاندې مه ځئ)

د آډیو سیګنالونو پرتله کول

لومړی، راځئ چې د آډیو ریکارډونه ډیجیټل کړو. تاسو کولی شئ هغه څه واورئ چې دا ورته ښکاري:


او د معمول په څیر د ZX سپیکٹرم کمپیوټر غږونه ثبتوي:


په دواړو حالتونو کې، د ثبت په پیل کې یو تش په نامه دی پیلوټ ټون - د ورته فریکونسۍ غږ (په لومړي ریکارډ کې دا خورا لنډ دی <1 ثانیه ، مګر د توپیر وړ دی). پیلوټ ټون کمپیوټر ته سیګنال ورکوي ترڅو د معلوماتو ترلاسه کولو لپاره چمتو کړي. د یوې قاعدې په توګه، هر کمپیوټر یوازې د سیګنال شکل او د هغې فریکونسۍ له مخې خپل "خپل" پیلوټ ټون پیژني.

دا اړینه ده چې پخپله د سیګنال شکل په اړه یو څه ووایاست. د مثال په توګه، په ZX سپیکٹرم کې دا شکل مستطیل دی:

څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

کله چې د پیلوټ ټون کشف شي ، د ZX سپیکٹرم د سکرین په پوله کې بدیل سور او نیلي بارونه ښیې ترڅو دا په ګوته کړي چې سیګنال پیژندل شوی. پیلوټ ټون پای ته رسیږي synchro نبض، کوم چې کمپیوټر ته سیګنال کوي ترڅو د معلوماتو ترلاسه کول پیل کړي. دا د لنډې مودې لخوا مشخص شوی (د پیلوټ ټون او وروسته معلوماتو په پرتله) (شکل وګورئ)

وروسته له دې چې د ترکیب نبض ترلاسه شي، کمپیوټر د سیګنال هر لوړوالی / راټیټ ثبتوي، د هغې موده اندازه کوي. که موده له ټاکلې حد څخه کمه وي، بټ 1 په حافظه کې لیکل کیږي، که نه نو 0. بټونه په بایټ کې راټولیږي او پروسه تر هغه وخته تکرار کیږي چې N بایټ ترلاسه شي. N شمیره معمولا د ډاونلوډ شوي فایل سرلیک څخه اخیستل کیږي. د بارولو لړۍ په لاندې ډول ده:

  1. پیلوټ ټون
  2. سرلیک (ثابت شوی اوږدوالی)، د ډاونلوډ شوي ډاټا اندازه (N)، د فایل نوم او ډول لري
  3. پیلوټ ټون
  4. ډاټا پخپله

د دې لپاره چې ډاډ ترلاسه کړئ چې ډاټا په سمه توګه بار شوې، د ZX سپیکٹرم په نوم یادیږي برابري بایټ (parity byte)، کوم چې محاسبه کیږي کله چې د لیکل شوي ډاټا ټول بایټ XOR کولو سره د فایل خوندي کول. کله چې د فایل لوستل ، کمپیوټر د ترلاسه شوي ډیټا څخه د برابري بایټ محاسبه کوي او که پایله له خوندي شوي څخه توپیر ولري ، د خطا پیغام "R ټیپ بار کولو غلطی" ښیې. په کلکه ووایو، کمپیوټر کولی شي دا پیغام دمخه خپور کړي که چیرې د لوستلو په وخت کې نبض ونه پیژني (یاد شوی یا د هغې موده د ځینو محدودیتونو سره سمون نه لري)

نو، راځئ چې اوس وګورو چې نامعلوم سیګنال څه ډول ښکاري:

څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

دا د پیلوټ ټون دی. د سیګنال شکل د پام وړ توپیر لري، مګر دا روښانه ده چې سیګنال د یوې ټاکلې فریکونسۍ لنډ نبض تکرار څخه جوړ دی. د 44100 Hz د نمونې کولو فریکونسۍ کې، د "چوکیو" تر مینځ فاصله نږدې 48 نمونې دي (کوم چې د ~ 918 Hz فریکونسۍ سره مطابقت لري). راځئ چې دا ارقام په یاد ولرو.

اوس راځئ چې د معلوماتو ټوټې وګورو:

څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

که موږ د انفرادي دالونو تر مینځ فاصله اندازه کړو، نو دا معلومه شوه چې د "اوږدو" دالونو ترمنځ فاصله لاهم ~ 48 نمونه ده، او د لنډو ترمنځ - ~ 24. یو څه وړاندې په لټه کې ، زه به ووایم چې په پای کې دا معلومه شوه چې د 918 Hz فریکونسۍ سره د "حوصلې" نبض په دوامداره توګه تعقیبوي ، د فایل له پیل څخه تر پای پورې. داسې انګیرل کیدی شي چې د ډیټا لیږدولو په وخت کې، که د حوالې نبضونو ترمنځ اضافي نبض سره مخ شي، موږ دا د 1 په توګه په پام کې نیسو، که نه نو 0.

د ترکیب نبض په اړه څه؟ راځئ چې د معلوماتو په پیل کې وګورو:

څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

پیلوټ ټون پای ته رسیږي او ډاټا سمدلاسه پیل کیږي. یو څه وروسته ، د څو مختلف آډیو ریکارډونو تحلیل کولو وروسته ، موږ وتوانیدو چې د ډیټا لومړی بایټ تل یو شان وي (10100101b, A5h). کمپیوټر ممکن د معلوماتو ترلاسه کولو وروسته لوستل پیل کړي.

تاسو کولی شئ په همغږي بایټ کې د وروستي 1st وروسته سمدلاسه د لومړي حوالې نبض بدلون ته هم پاملرنه وکړئ. دا د ډیټا پیژندنې برنامې رامینځته کولو په پروسه کې خورا وروسته وموندل شو ، کله چې د فایل په پیل کې ډاټا په ثابت ډول لوستل کیدی نشي.

اوس راځئ هڅه وکړو چې یو الګوریتم تشریح کړو چې د آډیو فایل پروسس کوي او ډاټا به پورته کړي.

د معلوماتو بارول

لومړی، راځئ چې د الګوریتم ساده ساتلو لپاره یو څو انګیرنې وګورو:

  1. موږ به یوازې د WAV بڼه کې فایلونه په پام کې ونیسو؛
  2. د آډیو فایل باید د پیلوټ ټون سره پیل شي او په پیل کې باید چوپتیا ونه لري
  3. د سرچینې فایل باید د نمونې اخیستنې کچه 44100 Hz ولري. په دې حالت کې، د 48 نمونو د حوالې نبض ترمنځ فاصله لا دمخه ټاکل شوې او موږ اړتیا نلرو چې دا په پروګرام کې محاسبه کړو؛
  4. د نمونې بڼه کیدای شي هر ډول وي (8/16 بټونه / فلوټینګ ټکی) - ځکه چې د لوستلو پر مهال موږ کولی شو دا مطلوب ته بدل کړو؛
  5. موږ فرض کوو چې د سرچینې فایل د طول البلد لخوا نورمال شوی ، کوم چې پایله باید ثبات کړي؛

د لوستلو الګوریتم به په لاندې ډول وي:

  1. موږ فایل په حافظه کې لوستلو، په ورته وخت کې د نمونې بڼه 8 بټونو ته بدلوو؛
  2. په آډیو ډیټا کې د لومړي نبض موقعیت مشخص کړئ. د دې کولو لپاره، تاسو اړتیا لرئ د نمونې شمیره د اعظمي اندازې سره محاسبه کړئ. د سادگي لپاره، موږ به دا یو ځل په لاسي توګه محاسبه کړو. راځئ چې دا متغیر ته خوندي کړو prev_pos؛
  3. د وروستي نبض موقعیت ته 48 اضافه کړئ (pos:= prev_pos + 48)
  4. څرنګه چې د 48 لخوا د موقعیت زیاتوالی تضمین نه کوي چې موږ به د راتلونکي حوالې نبض حالت ته ورسیږو (د ټیپ نیمګړتیاوې، د ټیپ ډرایو میکانیزم بې ثباته عملیات، او نور)، موږ اړتیا لرو چې د پوز نبض موقعیت تنظیم کړو. د دې کولو لپاره، د معلوماتو یوه کوچنۍ ټوټه واخلئ (pos-8؛ pos + 8) او په هغې کې د اعظمي اندازې ارزښت ومومئ. د اعظمي سره ورته موقعیت به په pos کې زیرمه شي. دلته 8 = 48/6 په تجربه کې ترلاسه شوی ثابت دی، کوم چې تضمین کوي ​​​​چې موږ به سمه اعظمي اندازه وټاکو او نور محرکونه به اغیزه ونکړي چې ممکن نږدې وي. په خورا بدو قضیو کې ، کله چې د نبضونو ترمینځ فاصله له 48 څخه خورا کم یا ډیر وي ، تاسو کولی شئ د نبض لپاره جبري لټون پلي کړئ ، مګر د مقالې په چوکاټ کې به زه دا په الګوریتم کې تشریح نه کړم؛
  5. په مخکینۍ مرحله کې، دا به هم اړین وي چې وګوري چې د حوالې نبض په ټوله کې موندل شوی. دا دی ، که تاسو په ساده ډول اعظمي ته ګورئ ، دا تضمین نه کوي چې تسلسل پدې برخه کې شتون لري. زما د لوستلو برنامې وروستي پلي کولو کې ، زه په یوه برخه کې د اعظمي او لږترلږه طول البلد ارزښتونو ترمینځ توپیر ګورم ، او که دا له یو ټاکلي حد څخه تیر شي ، زه د تسلسل شتون حسابوم. پوښتنه دا هم ده چې که د حوالې نبض ونه موندل شي څه وکړي. دلته 2 اختیارونه شتون لري: یا دا ډاټا پای ته رسیدلې او خاموشي تعقیبوي، یا دا باید د لوستلو تېروتنه وګڼل شي. په هرصورت، موږ به دا د الګوریتم ساده کولو لپاره پریږدو؛
  6. په بل ګام کې، موږ اړتیا لرو چې د ډیټا نبض شتون وټاکو (bit 0 یا 1)، د دې لپاره موږ د برخې منځنۍ برخه اخلو (prev_pos;pos) Middle_pos د Middle_pos := (prev_pos+pos)/2 او د منځنۍ_pos په ځینو برخو کې د برخې په شاوخوا کې (midle_pos-8;midle_pos +8) راځئ چې اعظمي او لږترلږه طول محاسبه کړو. که د دوی ترمنځ توپیر له 10 څخه ډیر وي، موږ په پایله کې 1 بټ لیکو، که نه نو 0. 10 یو ثابت دی چې په تجربه کې ترلاسه شوی.
  7. اوسنی موقعیت په prev_pos کې خوندي کړئ (prev_pos := pos)
  8. د 3 مرحلې څخه پیل بیا تکرار کړئ تر هغه چې موږ ټول فایل ولوستل شو؛
  9. پایله لرونکی بټ سري باید د بایټس سیټ په توګه خوندي شي. څرنګه چې موږ د لوستلو پر مهال همغږي بایټ په پام کې نه و نیولی، د بټونو شمیر ممکن د 8 څخه څو چنده نه وي، او اړین بټ آفسیټ هم نامعلوم دی. د الګوریتم په لومړي پلي کولو کې ، زه د سنک بایټ شتون په اړه نه پوهیدم او له همدې امله په ساده ډول 8 فایلونه د مختلف شمیر آفسیټ بټونو سره خوندي کړل. یو له دوی څخه درست معلومات لري. په وروستي الګوریتم کې، زه په ساده ډول د A5h پورې ټول بټونه لرې کوم، کوم چې ما ته اجازه راکوي چې سمدلاسه د سم محصول فایل ترلاسه کړم

په روبي کې الګوریتم، د لیوالتیا لپاره
ما د پروګرام لیکلو لپاره روبي د ژبې په توګه غوره کړه، ځکه چې ... زه ډیری وخت په دې اړه پروګرام کوم. اختیار لوړ فعالیت ندی، مګر د امکان تر حده د لوستلو سرعت ګړندی کولو دنده د ارزښت وړ ندي.

# Используем gem 'wavefile'
require 'wavefile'

reader = WaveFile::Reader.new('input.wav')
samples = []
format = WaveFile::Format.new(:mono, :pcm_8, 44100)

# Читаем WAV файл, конвертируем в формат Mono, 8 bit 
# Массив samples будет состоять из байт со значениями 0-255
reader.each_buffer(10000) do |buffer|
  samples += buffer.convert(format).samples
end

# Позиция первого импульса (вместо 0)
prev_pos = 0
# Расстояние между импульсами
distance = 48
# Значение расстояния для окрестности поиска локального максимума
delta = (distance / 6).floor
# Биты будем сохранять в виде строки из "0" и "1"
bits = ""

loop do
  # Рассчитываем позицию следующего импульса
  pos = prev_pos + distance
  
  # Выходим из цикла если данные закончились 
  break if pos + delta >= samples.size

  # Корректируем позицию pos обнаружением максимума на отрезке [pos - delta;pos + delta]
  (pos - delta..pos + delta).each { |p| pos = p if samples[p] > samples[pos] }

  # Находим середину отрезка [prev_pos;pos]
  middle_pos = ((prev_pos + pos) / 2).floor

  # Берем окрестность в середине 
  sample = samples[middle_pos - delta..middle_pos + delta]

  # Определяем бит как "1" если разница между максимальным и минимальным значением на отрезке превышает 10
  bit = sample.max - sample.min > 10
  bits += bit ? "1" : "0"
end

# Определяем синхро-байт и заменяем все предшествующие биты на 256 бит нулей (согласно спецификации формата) 
bits.gsub! /^[01]*?10100101/, ("0" * 256) + "10100101"

# Сохраняем выходной файл, упаковывая биты в байты
File.write "output.cas", [bits].pack("B*")

نتيجه

د الګوریتم او ثابتو څو ډولونو هڅه کولو سره، زه خوشحاله وم چې یو څه خورا په زړه پورې ترلاسه کړم:

څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

نو، د کرکټر تارونو په واسطه قضاوت کول، موږ د ګرافونو د جوړولو لپاره یو پروګرام لرو. په هرصورت، د پروګرام متن کې هیڅ کلیدي کلمې شتون نلري. ټولې کلیمې د بایټ په توګه کوډ شوي دي (هر ارزښت> 80h). اوس موږ اړتیا لرو چې معلومه کړو چې د 80s څخه کوم کمپیوټر کولی شي په دې بڼه کې پروګرامونه خوندي کړي.

په حقیقت کې، دا د BASIC پروګرام سره ورته دی. د ZX سپیکٹرم کمپیوټر پروګرامونه تقریبا په ورته بڼه په حافظه کې ذخیره کوي او پروګرامونه ټیپ ته خوندي کوي. یوازې په هغه حالت کې، ما د کلیدي کلمې په مقابل کې چک کړې میز. په هرصورت، پایله په ښکاره ډول منفي وه.

ما د مشهور اتاري، کموډور 64 او د هغه وخت ډیری نورو کمپیوټرونو BASIC کلیدي کلمې هم چیک کړې، د کوم لپاره چې ما د اسنادو موندلو توان درلود، مګر د بریالیتوب پرته - د ریټرو کمپیوټرونو ډولونو په اړه زما پوهه دومره پراخه نه وه.

بیا ما پریکړه وکړه چې لاړ شم لیست، او بیا زما سترګې د تولید کونکي راډیو شیک او TRS-80 کمپیوټر په نوم راوتلې. دا هغه نومونه دي چې د کیسټونو په لیبل باندې لیکل شوي وو چې زما په میز کې پراته وو! زه دا نومونه مخکې نه پیژنم او د TRS-80 کمپیوټر سره بلد نه وم، نو ما ته داسې بریښي چې راډیو شیک د آډیو کیسټ جوړونکی و لکه BASF، سوني یا TDK، او TRS-80 د پلې بیک وخت و. ولې نه؟

د کمپیوټر ټینډي/راډیو شیک TRS-80

دا خورا احتمال لري چې په پوښتنې کې د آډیو ثبت کول ، کوم چې ما د مقالې په پیل کې د مثال په توګه ورکړ ، په کمپیوټر کې په لاندې ډول جوړ شوی و:

څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

دا معلومه شوه چې دا کمپیوټر او د هغې ډولونه (ماډل I/Model III/Model IV، او نور) په یو وخت کې خورا مشهور وو (البته، په روسیه کې نه). دا د یادونې وړ ده چې هغه پروسیسر چې دوی یې کارولی هم Z80 و. د دې کمپیوټر لپاره تاسو کولی شئ په انټرنیټ کې ومومئ ډیر معلومات. په 80s کې، کمپیوټر معلومات په کې ویشل شوي مجلې. په اوس وخت کې یو شمیر شتون لري emulators کمپیوټرونه د مختلفو پلیټ فارمونو لپاره.

ما ایمولیټر ډاونلوډ کړ trs80gp او د لومړي ځل لپاره زه وکولی شوم وګورم چې دا کمپیوټر څنګه کار کوي. البته، کمپیوټر د رنګ محصول ملاتړ نه کوي؛ د سکرین ریزولوشن یوازې 128x48 پکسلز و، مګر ډیری توسیعونه او بدلونونه شتون لري چې کولی شي د سکرین ریزولوشن زیات کړي. د دې کمپیوټر لپاره د عملیاتي سیسټمونو لپاره ډیری اختیارونه او د BASIC ژبې پلي کولو اختیارونه هم وو (کوم چې د ZX سپیکٹرم برعکس، په ځینو ماډلونو کې حتی په ROM کې "فلش" نه و او هر ډول اختیار د فلاپي ډیسک څخه پورته کیدی شي، لکه څنګه چې OS پخپله)

ما هم وموندل افادیت د آډیو ریکارډونو په CAS فارمیټ کې بدلولو لپاره، کوم چې د ایمولیټرونو لخوا ملاتړ کیږي، مګر د ځینو دلیلونو لپاره دا ممکنه نه وه چې زما د کیسټونو څخه د دوی په کارولو سره ریکارډونه ولولئ.

د CAS فایل فارمیټ موندلو سره (کوم چې د ټیپ څخه د ډیټا یو څه بټ کاپي وګرځید چې ما دمخه په لاس کې درلود ، پرته له دې چې د سنک بایټ شتون سره سرلیک پرته) ، ما یو جوړ کړ. زما په برنامه کې یو څو بدلونونه او د کار کولو CAS فایل تولیدولو توان درلود چې په ایمولیټر کې کار کاوه (TRS-80 ماډل III):

څنګه ما د مقناطیسي ټیپ څخه په نامعلوم شکل کې معلومات ترلاسه کړل

ما د تبادلې افادیت وروستۍ نسخه د لومړي نبض د اتوماتیک تعیین او د GEM کڅوړې په توګه د حوالې نبض ترمینځ فاصله سره ډیزاین کړې ، د سرچینې کوډ دلته شتون لري Github.

پایلې

هغه لاره چې موږ یې سفر کړی په تیرو وختونو کې یو زړه راښکونکی سفر وګرځید، او زه خوښ یم چې په پای کې ما ځواب وموند. د نورو شیانو په منځ کې، زه:

  • ما په ZX سپیکٹرم کې د ډیټا خوندي کولو فارمیټ معلوم کړ او د آډیو کیسټونو څخه د ډیټا خوندي کولو/لوستلو لپاره جوړ شوي ROM روټینونه مطالعه کړل
  • زه د TRS-80 کمپیوټر او د هغې ډولونو سره آشنا شوم، عملیاتي سیسټم یې مطالعه کړ، د نمونې پروګرامونه یې ولیدل او حتی د ماشین کوډونو کې د ډیبګ کولو فرصت یې درلود (په هرصورت، ټول Z80 میمونیکونه ما سره اشنا دي)
  • د CAS ب formatه کې د آډیو ریکارډونو بدلولو لپاره یو بشپړ افادیت لیکلی ، کوم چې کولی شي هغه معلومات ولولي چې د "رسمي" افادیت لخوا نه پیژندل شوي

سرچینه: www.habr.com

Add a comment