Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

sa naunang kasaysayan

Ingon usa ka mahigugmaon sa retro hardware, nakapalit ako usa ka ZX Spectrum + gikan sa usa ka magbabaligya sa UK. Lakip sa kompyuter mismo, nakadawat ako daghang mga audio cassette nga adunay mga dula (sa orihinal nga pakete nga adunay mga panudlo), ingon man mga programa nga girekord sa mga cassette nga wala’y espesyal nga mga marka. Katingad-an, ang mga datos gikan sa 40-anyos nga mga cassette mabasa ug maayo ug ako nakahimo sa pag-download sa hapit tanan nga mga dula ug mga programa gikan kanila.

Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

Bisan pa, sa pipila ka mga cassette nakit-an nako ang mga rekording nga klaro nga wala gihimo sa ZX Spectrum nga kompyuter. Lahi kaayo ang ilang tunog ug, dili sama sa mga pagrekord gikan sa nahisgutan nga kompyuter, wala sila magsugod sa usa ka mubo nga BASIC bootloader, nga kasagaran naa sa mga pagrekord sa tanan nga mga programa ug mga dula.

Sulod sa pipila ka mga panahon kini naghasol kanako - gusto ko nga mahibal-an kung unsa ang gitago sa kanila. Kung mabasa nimo ang signal sa audio ingon usa ka han-ay sa mga byte, mahimo nimong pangitaon ang mga karakter o bisan unsang butang nga nagpaila sa gigikanan sa signal. Usa ka matang sa retro-archaeology.

Karon nga nakaadto na ko ug tan-aw sa mga label sa mga cassette mismo, nagpahiyom ko tungod kay

ang tubag anaa sa atubangan sa akong mga mata sa tanan nga panahon
Sa label sa wala nga cassette mao ang ngalan sa TRS-80 nga kompyuter, ug ubos lang sa ngalan sa tiggama: "Gigama sa Radio Shack sa USA"

(Kung gusto nimo ipadayon ang intriga hangtod sa katapusan, ayaw pag-adto sa ilawom sa spoiler)

Pagtandi sa mga signal sa audio

Una sa tanan, atong i-digitize ang mga audio recording. Mahimo nimong paminawon kung unsa kini paminawon:


Ug sama sa naandan ang rekording gikan sa ZX Spectrum nga kompyuter motingog:


Sa duha ka mga kaso, sa sinugdanan sa recording adunay usa ka gitawag nga tono sa piloto - usa ka tunog sa parehas nga frequency (sa una nga pagrekord mubo ra kaayo <1 segundo, apan mailhan). Ang tono sa piloto nagsenyas sa kompyuter sa pag-andam sa pagdawat sa datos. Ingon sa usa ka lagda, ang matag kompyuter makaila lamang sa iyang "kaugalingon" nga tono sa piloto pinaagi sa porma sa signal ug sa frequency niini.

Kinahanglan nga isulti ang usa ka butang bahin sa porma sa signal mismo. Pananglitan, sa ZX Spectrum ang porma niini rectangular:

Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

Kung makit-an ang usa ka tono sa piloto, ang ZX Spectrum magpakita sa nagpulipuli nga pula ug asul nga mga bar sa utlanan sa screen aron ipakita nga ang signal nahibal-an. Natapos ang tono sa piloto synchro pulse, nga nagsenyas sa kompyuter nga magsugod sa pagdawat og data. Gihulagway kini sa usa ka mas mubo nga gidugayon (itandi sa tono sa piloto ug sa sunod nga datos) (tan-awa ang numero)

Human madawat ang pulso sa pag-sync, girekord sa kompyuter ang matag pagtaas/pagkahulog sa signal, gisukod ang gidugayon niini. Kung ang gidugayon ubos pa sa usa ka piho nga limitasyon, ang bit 1 isulat sa memorya, kung dili 0. Ang mga bit gikolekta ngadto sa mga byte ug ang proseso gisubli hangtud nga ang N bytes madawat. Ang numero N kasagarang gikuha gikan sa ulohan sa na-download nga file. Ang pagkasunod-sunod sa loading mao ang mosunod:

  1. tono sa piloto
  2. header (fixed length), naglangkob sa gidak-on sa na-download nga data (N), file name ug type
  3. tono sa piloto
  4. ang datos mismo

Aron masiguro nga ang datos gikarga sa husto, ang ZX Spectrum nagbasa sa gitawag nga parity byte (parity byte), nga kalkulado kung magtipig sa usa ka file pinaagi sa XORing sa tanang byte sa sinulat nga datos. Kung nagbasa sa usa ka file, gikalkula sa kompyuter ang parity byte gikan sa nadawat nga datos ug, kung ang resulta lahi sa naluwas, gipakita ang mensahe sa sayup nga "R Tape loading error". Sa estrikto nga pagkasulti, ang kompyuter mahimong mag-isyu niini nga mensahe sa sayo pa kung, sa pagbasa, dili kini makaila sa usa ka pulso (wala o ang gidugayon niini dili katumbas sa pipila nga mga limitasyon)

Busa, tan-awon nato karon kung unsa ang hitsura sa wala mailhi nga signal:

Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

Kini ang tono sa piloto. Ang porma sa signal lahi kaayo, apan klaro nga ang signal naglangkob sa pagsubli sa mubo nga mga pulso sa usa ka frequency. Sa sampling frequency nga 44100 Hz, ang gilay-on tali sa mga "peaks" kay gibana-bana nga 48 samples (nga katumbas sa frequency nga ~918 Hz).Atong hinumdoman kini nga numero.

Atong tan-awon karon ang data fragment:

Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

Kung atong sukdon ang gilay-on tali sa tagsa-tagsa nga mga pulso, kini nahimo nga ang gilay-on tali sa "taas" nga mga pulso mao gihapon ang ~ 48 nga mga sample, ug tali sa mga mugbo - ~ 24. Sa pagtan-aw sa unahan gamay, isulti ko nga sa katapusan nahimo nga ang "reference" nga mga pulso nga adunay frequency nga 918 Hz nagpadayon nga nagsunod, gikan sa sinugdanan hangtod sa katapusan sa file. Mahimong hunahunaon nga kung ang pagpadala sa datos, kung ang usa ka dugang nga pulso makit-an tali sa mga reference pulse, giisip namon kini nga bit 1, kung dili 0.

Unsa ang mahitungod sa sync pulse? Atong tan-awon ang sinugdanan sa datos:

Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

Ang tono sa piloto natapos ug ang datos magsugod dayon. Usa ka gamay nga ulahi, pagkahuman sa pag-analisar sa daghang lainlaing mga pagrekord sa audio, nahibal-an namon nga ang una nga byte sa datos kanunay nga parehas (10100101b, A5h). Ang kompyuter mahimong magsugod sa pagbasa sa datos human kini madawat.

Mahimo usab nimo nga hatagan ug pagtagad ang pagbalhin sa unang reperensiya nga pulso diha-diha dayon human sa kataposang 1st sa sync byte. Nadiskobrehan kini sa ulahi sa proseso sa pagpalambo sa usa ka programa sa pag-ila sa datos, kung ang datos sa sinugdanan sa file dili mabasa nga lig-on.

Karon atong sulayan ang paghulagway sa usa ka algorithm nga magproseso sa usa ka audio file ug mag-load sa datos.

Nagkarga sa Data

Una, atong tan-awon ang pipila ka mga pangagpas aron magpabilin nga simple ang algorithm:

  1. Atong tagdon lamang ang mga file sa WAV format;
  2. Ang audio file kinahanglan magsugod sa usa ka pilot tone ug kinahanglan dili adunay kahilom sa sinugdanan
  3. Ang tinubdan nga file kinahanglang adunay sampling rate nga 44100 Hz. Sa kini nga kaso, ang gilay-on tali sa mga reperensiya nga pulso sa 48 nga mga sampol determinado na ug dili na kinahanglan nga kalkulahon kini sa programmatically;
  4. Ang sampol nga format mahimong bisan unsa (8/16 bits/floating point) - tungod kay kung magbasa mahimo naton kini mabag-o sa gusto;
  5. Nagtuo kami nga ang gigikanan nga file na-normalize sa amplitude, nga kinahanglan magpalig-on sa resulta;

Ang algorithm sa pagbasa mahimong ingon sa mosunod:

  1. Gibasa namo ang file ngadto sa memorya, sa samang higayon nag-convert sa sample format ngadto sa 8 bits;
  2. Tinoa ang posisyon sa unang pulso sa audio data. Aron mahimo kini, kinahanglan nimo nga kuwentahon ang gidaghanon sa sample nga adunay labing kataas nga amplitude. Alang sa kayano, atong kuwentahon kini sa makausa sa mano-mano. Atong i-save kini sa prev_pos variable;
  3. Idugang ang 48 sa posisyon sa kataposang pulso (pos := prev_pos + 48)
  4. Tungod kay ang pagdugang sa posisyon sa 48 dili garantiya nga makaabut kami sa posisyon sa sunod nga reference pulse (mga depekto sa tape, dili lig-on nga operasyon sa mekanismo sa tape drive, ug uban pa), kinahanglan namon nga ayohon ang posisyon sa pulso pos. Aron mahimo kini, pagkuha usa ka gamay nga piraso sa datos (pos-8; pos+8) ug pangitaa ang labing taas nga kantidad sa amplitude niini. Ang posisyon nga katumbas sa kinatas-an itago sa pos. Dinhi ang 8 = 48/6 usa ka eksperimento nga nakuha nga makanunayon, nga naggarantiya nga atong mahibal-an ang husto nga maximum ug dili makaapekto sa ubang mga impulses nga mahimong duol. Sa dili maayo nga mga kaso, kung ang gilay-on tali sa mga pulso mas ubos kaysa o labaw pa sa 48, mahimo nimong ipatuman ang pinugos nga pagpangita alang sa usa ka pulso, apan sa sulud sa artikulo dili nako ihulagway kini sa algorithm;
  5. Sa miaging lakang, kinahanglan usab nga susihon kung nakit-an ang reference pulse. Kana mao, kung pangitaon ra nimo ang labing kadaghan, dili kini garantiya nga ang impulse naa sa kini nga bahin. Sa akong pinakabag-o nga pagpatuman sa programa sa pagbasa, akong gisusi ang kalainan tali sa maximum ug minimum amplitude values ​​sa usa ka bahin, ug kon kini molapas sa usa ka limitasyon, akong giihap ang presensya sa usa ka impulse. Ang pangutana mao usab kung unsa ang buhaton kung ang reference pulse dili makit-an. Adunay 2 nga mga kapilian: bisan ang datos natapos ug ang kahilom nagsunod, o kini kinahanglan nga isipon nga usa ka sayup sa pagbasa. Bisan pa, atong laktawan kini aron mapasimple ang algorithm;
  6. Sa sunod nga lakang, kinahanglan naton mahibal-an ang presensya sa usa ka pulso sa datos (bit 0 o 1), tungod niini gikuha namon ang tunga-tunga sa bahin (prev_pos;pos) middle_pos nga katumbas sa middle_pos := (prev_pos+pos)/2 ug sa pipila ka kasilinganan sa middle_pos sa bahin (middle_pos-8;middle_pos +8) atong kuwentahon ang maximum ug minimum amplitude. Kung ang kalainan tali kanila labaw pa sa 10, among isulat ang gamay nga 1 sa resulta, kung dili ang 0. 10 usa ka kanunay nga nakuha sa eksperimento;
  7. I-save ang kasamtangan nga posisyon sa prev_pos (prev_pos := pos)
  8. Balika sugod sa lakang 3 hangtod atong mabasa ang tibuok file;
  9. Ang resulta nga bit array kinahanglang i-save isip set sa bytes. Tungod kay wala namo tagda ang sync byte sa dihang nagbasa, ang gidaghanon sa mga bits mahimong dili usa ka multiple sa 8, ug ang gikinahanglan nga bit offset wala usab mahibal-i. Sa una nga pagpatuman sa algorithm, wala ako nahibal-an bahin sa paglungtad sa sync byte ug busa gitipigan ra ang 8 nga mga file nga adunay lainlaing mga numero sa mga offset bit. Ang usa niini adunay husto nga datos. Sa katapusan nga algorithm, akong tangtangon ang tanan nga mga piraso hangtod sa A5h, nga nagtugot kanako nga makuha dayon ang husto nga file sa output

Algorithm sa Ruby, para sa mga interesado
Gipili nako si Ruby isip pinulongan sa pagsulat sa programa, tungod kay... Giprograma nako kini sa kadaghanan sa oras. Ang kapilian dili taas nga pasundayag, apan ang tahas sa paghimo sa katulin sa pagbasa sa labing kadali nga mahimo dili takus niini.

# Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ 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*")

resulta

Sa pagsulay sa daghang mga variant sa algorithm ug mga makanunayon, swerte ako nga nakakuha usa ka butang nga labi ka makapaikag:

Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

Busa, sa paghukom sa mga string sa karakter, kita adunay usa ka programa alang sa pagplano sa mga graph. Bisan pa, wala’y mga keyword sa teksto sa programa. Ang tanan nga mga keyword gi-encode ingon mga byte (matag kantidad> 80h). Karon kinahanglan naton mahibal-an kung unsang kompyuter gikan sa 80s ang makatipig sa mga programa sa kini nga format.

Sa tinuud, parehas kini sa usa ka BASIC nga programa. Ang ZX Spectrum nga kompyuter nagtipig sa mga programa sa halos parehas nga pormat sa memorya ug nagtipig sa mga programa sa pag-tape. Sa kaso lang, gisusi nako ang mga keyword batok lamesa. Apan, dayag nga negatibo ang resulta.

Gisusi usab nako ang BASIC nga mga keyword sa sikat nga Atari, Commodore 64 ug ubay-ubay nga ubang mga kompyuter niadtong panahona, diin nakit-an nako ang dokumentasyon, apan walay kalampusan - ang akong kahibalo sa mga matang sa retro nga mga kompyuter nahimo nga dili kaayo lapad.

Unya nakahukom ko nga moadto ang listahan, ug dayon ang akong panan-aw nahulog sa ngalan sa tiggama nga Radio Shack ug sa TRS-80 nga kompyuter. Mao kini ang mga ngalan nga gisulat sa mga label sa mga cassette nga gibutang sa akong lamesa! Wala ko kaila niini nga mga ngalan kaniadto ug dili pamilyar sa TRS-80 nga kompyuter, mao nga alang kanako ang Radio Shack usa ka tiggama sa audio cassette sama sa BASF, Sony o TDK, ug ang TRS-80 mao ang oras sa pagdula. Ngano dili?

Computer Tandy/Radio Shack TRS-80

Lagmit kaayo nga ang audio recording nga gipangutana, nga akong gihatag isip usa ka pananglitan sa sinugdanan sa artikulo, gihimo sa usa ka kompyuter nga sama niini:

Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

Kini nahimo nga kini nga kompyuter ug ang mga lahi niini (Model I / Model III / Model IV, ug uban pa) sikat kaayo sa usa ka higayon (siyempre, dili sa Russia). Mamatikdan nga ang processor nga ilang gigamit mao usab ang Z80. Alang sa kini nga kompyuter makit-an nimo sa Internet daghang impormasyon. Sa dekada 80, ang impormasyon sa kompyuter giapod-apod sa mga magasin. Sa pagkakaron adunay pipila mga emulator mga kompyuter alang sa lainlaing mga plataporma.

Gi-download nako ang emulator trs80gp ug sa unang higayon nakita nako kung giunsa kini nga computer nagtrabaho. Siyempre, ang kompyuter wala nagsuporta sa kolor nga output; ang resolusyon sa screen mao lamang ang 128x48 pixels, apan adunay daghang mga extension ug mga kausaban nga makadugang sa resolusyon sa screen. Adunay usab daghang mga kapilian alang sa mga operating system alang sa kini nga kompyuter ug mga kapilian alang sa pagpatuman sa BASIC nga sinultian (nga, dili sama sa ZX Spectrum, sa pipila nga mga modelo wala gani "gi-flash" sa ROM ug ang bisan unsang kapilian mahimong i-load gikan sa floppy disk, sama sa ang OS mismo)

Nakakita pud ko utility aron mabag-o ang mga pagrekord sa audio sa format nga CAS, nga gisuportahan sa mga emulator, apan sa pila ka hinungdan dili posible nga mabasa ang mga rekording gikan sa akong mga cassette gamit kini.

Kay nahibal-an ang format sa CAS file (nga nahimo nga usa ka gamay nga kopya sa datos gikan sa tape nga naa na nako, gawas sa header nga adunay presensya sa usa ka sync byte), naghimo ako usa ka pipila ka mga pagbag-o sa akong programa ug nakahimo sa pag-output sa usa ka nagtrabaho nga CAS file nga nagtrabaho sa emulator (TRS-80 Model III):

Giunsa nako pagbawi ang datos sa wala mailhi nga format gikan sa magnetic tape

Gidisenyo nako ang pinakabag-o nga bersyon sa utility sa pagkakabig nga adunay awtomatik nga pagdeterminar sa unang pulso ug ang gilay-on tali sa reference pulses isip usa ka GEM package, ang source code anaa sa Github.

konklusyon

Ang dalan nga among giagian nahimong usa ka makaiikag nga panaw ngadto sa nangagi, ug ako nalipay nga sa katapusan akong nakaplagan ang tubag. Lakip sa ubang mga butang, ako:

  • Akong nahibal-an ang format alang sa pagtipig sa datos sa ZX Spectrum ug gitun-an ang built-in nga ROM nga rutina alang sa pagtipig/pagbasa sa datos gikan sa mga audio cassette
  • Nasinati nako ang TRS-80 nga kompyuter ug ang mga lahi niini, nagtuon sa operating system, nagtan-aw sa mga sample nga programa ug nakahigayon pa gani sa pag-debug sa mga code sa makina (human sa tanan, ang tanan nga Z80 mnemonics pamilyar kanako)
  • Nagsulat ug bug-os nga utility para sa pag-convert sa mga audio recording ngadto sa CAS format, nga makabasa sa datos nga wala mailhi sa "opisyal" nga gamit.

Source: www.habr.com

Idugang sa usa ka comment