Mengekstrak Data Kartu Binary Magnetic-Strip dari WAV mentah


23

Saya dihadapkan pada tantangan yang sulit: Untuk mengekstrak data biner dari pembaca kartu strip magnetik iPhone . Seperti inilah bentuk magnetisasi pada kartu:

masukkan deskripsi gambar di sini
Sumber

Ini adalah .WAV yang diterima iPhone saat Anda menggesek kartu (jangan terlalu berharap terlalu banyak, itu adalah kartu loyalitas bonus;)). Ngomong-ngomong, tiga gesekan dengan kecepatan berbeda. Ini adalah dump SInt16 mentah untuk babatan yang saya gunakan.

Seseorang tampaknya telah melakukannya di sini tetapi data aktual yang saya tangkap tidak terlalu mudah untuk diproses.

Pembacaan dimulai (dan selesai) dengan jumlah 'nol' - perhatikan bahwa gelombang hanya berulang setelah 2 ZEROS telah dikumpulkan, ini mewakili NS diikuti oleh SN:

masukkan deskripsi gambar di sini

(perhatikan bahwa masing-masing dari tiga garis mewakili saya menggesek kartu yang berbeda; kartu bawah dalam gambar ini berusia 15 tahun, sehingga medan magnet jelas sangat terdegradasi di beberapa tempat, tidak terlihat dalam bidikan ini)

Ini akan memungkinkan suatu algoritma untuk memastikan suatu tick jam.

Medan magnet terbalik pada setiap detak jam. Juga untuk biner 1, medan magnet terbalik tepat di tengah tanda centang:

masukkan deskripsi gambar di sini

Urutan selalu dimulai dengan 1101 + 0 (parity bit) mulai sentinel. Anda dapat memilih ini dalam ketiga bacaan di grafik di atas. Itu ditunjukkan lebih jelas dalam artikel cosmodro yang saya tautkan di bagian atas pertanyaan.

Berikut adalah contoh degradasi magnetik (diambil lebih lanjut pada pembacaan kartu bawah): masukkan deskripsi gambar di sini

Saya mencoba mencari cara yang masuk akal untuk mengubah bentuk gelombang ini menjadi urutan biner yang sesuai.

Saya telah menemukan satu PDF yang menjelaskan beberapa detail, tetapi saya tidak dapat menemukan algoritma yang mereka gunakan.

PDF ini berisi satu gambar yang menarik: masukkan deskripsi gambar di sini

Jika saya bisa mengekstrak garis merah dan biru sesuai diagram ini, saya bisa menggunakan salah satu dari mereka untuk mengekstraksi data, tetapi saya tidak dapat menemukan logika di balik konstruksi.

Jadi ini pertanyaan saya: Bagaimana cara mengekstrak urutan biner?

PS. Perhatikan bahwa kecepatan gesek tidak akan konstan. Jadi begitu jam telah ditentukan, perlu secara konstan disesuaikan dari satu centang ke yang berikutnya.

PPS. Apakah autokorelasi menangkap pasangan kutu? (melihat kutu akan menggantikan NS SN ...)


EDIT (Juni '12): Saya membutuhkan banyak bantuan untuk yang satu ini, tetapi akhirnya saya telah menyelesaikan pembaca yang solid ( http://www.magstripedecoder.com/ ). Terima kasih untuk semua yang telah membantu! Saya merekomendasikan #musicdsp di saluran efnet IRC untuk siapa pun yang berdedikasi cukup untuk mengambil tantangan untuk menguasai matematika - itu benar-benar sangat sulit!


Bisakah Anda memposting file wav yang sebenarnya?
endolith

1
Selesai! 9876543210
P i


Terima kasih banyak Yoda untuk mengedit & merapikan pertanyaan.
P i

Anda menyebutkan tiga kartu dalam pertanyaan Anda. Kartu mana yang merupakan file WAV yang Anda lampirkan terkait?
Jason R

Jawaban:


10

Ini disebut kode tanda bifase , dan Anda harus fokus pada penyilangan nol alih-alih amplitudo pulsa. Anda memiliki beberapa penyeberangan nol per pulsa, karena filter berpotongan rendah yang melekat pada pickup dan input mikrofon ponsel. Jatuhkan Anda lebih jauh dari ini di antara transisi, dan lintas nol:

masukkan deskripsi gambar di sini

Anda bisa memulihkan bentuk yang lebih berdenyut dengan menggunakan filter dorongan rendah:

masukkan deskripsi gambar di sini

dan kemudian mengukur panjang pulsa dengan berapa lama mereka menghabiskan di atas ambang batas tertentu. Mungkin ide yang lebih baik adalah membedakan input untuk membuat transisi menjadi lonjakan besar, mengambil nilai absolut, dan mendeteksi mereka ketika mereka pergi di atas ambang batas:

masukkan deskripsi gambar di sini

Kemudian mengukur waktu antara pulsa, dan ketika waktu antara dua pulsa kira-kira sama dengan dua pulsa terakhir, itu adalah 0, ketika kira-kira setengah dari apa itu antara dua pulsa terakhir, itu adalah 1.

Degradasi magnetik yang Anda bicarakan seharusnya mudah dihilangkan dengan filter low-pass.


Terima kasih! Saya telah menemukan beberapa korelasi yang sangat menarik bekerja dengan turunan kedua yang akan saya posting nanti. Bisakah Anda menguraikan filter peningkatan rendah? Saya tidak tahu bagaimana saya akan mengimplementasikan ini ...
P

@endolith Bisakah Anda menambahkan tag yang lebih baik untuk pertanyaan? Saya memberi tag kode diferensial , berdasarkan jawaban Anda, tetapi Anda lebih tahu topik ini.
Lorem Ipsum

@yoda: Haha tidak, aku tidak. Saya baru tahu beberapa jam yang lalu untuk menulis jawaban ini.
endolith

@endolith Saya baru saja menemukan ini - ini bagus - namun dapatkah Anda menjelaskan 'filter boost rendah' ​​ini? Tampaknya sangat menarik, dan google tidak banyak membantu ...
Spacey

@Mohammad: Hanya filter yang meningkatkan frekuensi rendah sambil membiarkan yang tinggi tidak berubah. Saya pikir saya menggunakan equalizer grafis di Adobe Audition. Coba filter rak crca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
endolith

4

Ini cukup tantangan. Saya mencoba setidaknya empat pendekatan sebelum memecahkannya. Beginilah cara saya melakukannya:

masukkan deskripsi gambar di sini

Saya mulai dengan merapikan data ( bacaan pertama ) dengan sederhana ...

x_new = 0.9 * x_prev + 0.1 * x_in

... filter IIR. Saya melakukan ini di kedua arah ( bacaan kedua ). Ini menghilangkan semua kebisingan fuzzy, namun itu menciptakan diskontinuitas yang kembali dengan pembalasan dalam turunannya.

Saya kemudian mendapatkan semua turunan hingga keempat ( bacaan ketiga dan keempat mewakili turunan ketiga dan keempat), dan membuat fungsi baru:

g(x) = f'''(x)^2 + k*f''''(x)^2

Mengapa? karena saya perhatikan bahwa ketika kita sampai pada turunan ketiga, apa yang kita miliki adalah sinusoid di dalam amplop:

masukkan deskripsi gambar di sini

... dan semua orang tahu dari sekolah menengah bahwa:

sin^2 + cos^2=1 

masukkan deskripsi gambar di sini

dan bahwa dosa dan cos berbeda satu sama lain:

masukkan deskripsi gambar di sini

Karenanya amplop tersirat dapat dipulihkan.

Mengapa derivatif 3 dan 4? pada dasarnya setiap turunan yang lebih tinggi memurnikan sinyal. Apa yang sinusoidal tetap sinusoidal (hanya menggeser fase 90 ° jadi sin-> cos dll) sedangkan yang tidak jatuh.

Saya ingin menggunakan 11 & 12 atau sesuatu yang gila, tetapi turunannya jatuh cukup cepat, 4 adalah yang tertinggi yang bisa saya dapatkan sebelum semuanya berantakan, bahkan kemudian garis turunan kecil yang Anda lihat dalam gambar sangat halus.

Ini menghasilkan tonjolan kecil yang indah pada setiap transisi fluks ( pembacaan kelima ).

Selanjutnya saya berjalan melalui titik balik, menolak tak berguna ( bacaan keenam ) ..

Akhirnya saya berjalan melalui maksimum ( membaca ketujuh ), mengevaluasi apakah setiap lompatan adalah setengah langkah atau seluruh langkah, dan kemudian merekonstruksi biner.

Yay!

EDIT: Sekarang beberapa bulan sejak saya menyelesaikan proyek ini. tantangan paling sulit adalah membangun beberapa transformasi yang mengisolasi transisi fluks; secara teknis, 'mengambil amplop amplitudo'. ini dilakukan dengan membangun sinyal pergeseran π / 2 fase dari aslinya (ini juga dikenal sebagai sinyal quadrature). kemudian E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.

Untuk mendapatkan sinyal quadrature, saya cukup melakukan FFT, dan memutar setiap bin seperempat putaran, kemudian menggabungkan kembali komponen spektral yang dimodifikasi.

Ada banyak terminologi pelecehan yang membingungkan di bidang ini; kata kunci adalah 'sinyal analitik', 'Transformasi Hilbert' ... Saya telah menghindari penggunaan kata kunci tersebut karena berbagai disiplin ilmu memberikan arti yang berbeda kepada mereka.

Ada cara yang jauh lebih cerdas untuk mencapai amplop amplitudo ini menggunakan filter digital, sehingga menghindari transformasi Fourier. Ini memungkinkan algoritma untuk berjalan pada mikrokontroler bertenaga sangat rendah.

Proses ini menghasilkan bentuk gelombang yang harus memiliki tonjolan unik pada setiap transisi fluks.

Decoding bentuk gelombang ini ke dalam urutan biner masih merupakan tugas nontrivial. kompleksitas dan komponen ini lebih bersifat algoritmik daripada matematis; kesulitannya sebanding.

Semua ini adalah masalah yang sangat sulit. Butuh saya bagian terbaik dari tiga bulan untuk mencapai algoritma kinerja mereka. Saya akan dengan penuh waktu mendokumentasikan pendekatan saya dan menghasilkan mesin decoder yang tersedia untuk umum.


1
Baca kepala dapat dipengaruhi oleh domain magnetik yang berdekatan serta transisi saat ini di bawah kepala baca, yang cenderung mendorong transisi membaca bolak-balik dalam waktu, tergantung pada pola bit di sekitarnya.
hotpaw2

Perhatikan bahwa teknik ini tidak dapat diandalkan. Meskipun memberikan hasil yang sangat baik untuk sebagian besar trek, ia gagal menghasilkan benjolan unik untuk setiap transisi fluks sejak awal. yaitu menciptakan bump ganda. Saya menduga karena bentuk gelombang input tidak sesuai sinusoidal pada saat ini. jadi saya masih mencari teknik.
P i

Hanya ingin tahu, apa definisi lain dari "sinyal analitik" atau "Hilbert transform" yang Anda temukan? Jika Anda mencari amplop sinyal, Anda dapat menemukannya dengan terlebih dahulu mengubahnya menjadi sinyal analitik (kompleks). Ada beberapa cara untuk melakukan ini, tetapi apa yang Anda tunjukkan biasanya tidak digunakan.
Jason R

@JR beberapa sumber tampaknya mendefinisikan sinyal analitik sebagai pergeseran fasa 90 ° yaitu Quad (f (x)). yang lain sebagai f (x) + i.Quad (f (x)). Saya pikir saya telah melihat transformasi Hilbert didefinisikan sebagai keduanya juga. Tidak sepenuhnya yakin, jadi saya terjebak dengan notasi yang seharusnya tidak ambigu. Saya tertarik pada teknik lain untuk mengambil amplop sinyal; dsp.stackexchange.com/questions/424/… sepertinya tempat yang tepat untuk mengejar utas ini.
P
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.