İkili Manyetik Şerit Kartı Verilerini ham WAV'dan Çıkarma


23

Zor bir zorlukla karşı karşıya kaldım: İkili verileri bir iPhone manyetik şerit kart okuyucusundan çıkarmak . Karttaki mıknatıslanma şöyle görünüyor:

görüntü tanımını buraya girin
Kaynak

İşte bir kartı kaydırdığınızda iPhone'un aldığı WAV . (Çok fazla umutlanmayın, bu bir bonus sadakat kartı;). Bu arada, farklı hızlarda üç tokatlamak. Bu kullanıyorum tokatlamak için ham SInt16 dökümü .

Biri burada yapmış gibi görünüyor, ancak yakaladığım gerçek verilerin işlenmesi özellikle kolay değil.

Okuma, belirsiz sayıda 'sıfır' ile başlar (ve biter) - dalganın sadece 2 ZEROS toplandıktan sonra tekrar ettiğini unutmayın; bu, NS ve SN'yi gösterir:

görüntü tanımını buraya girin

(üç çizgiden her birinin farklı bir kartı kaydırdığımı gösterdiğine dikkat edin; bu görüntüdeki alt kart 15 yaşındadır, bu nedenle manyetik alan bu çekimde görünmeyen bazı yerlerde ciddi şekilde bozulur)

Bu, bir algoritmanın bir saat tikini tespit etmesine izin verecektir.

Manyetik alan her saat teneğinde ters çevrilir. Ayrıca bir ikili 1 için, manyetik alan tam olarak bir kenenin ortasında tersine döner:

görüntü tanımını buraya girin

Dizi her zaman bir 1101 + 0 (parite biti) başlangıç ​​sentineliyle başlar. Bunu, yukarıdaki grafikteki her üç okumadan da seçebilirsiniz. Sorunun başında bağladığım kozmodro makalesinde daha açık bir şekilde belirtilmiştir.

İşte manyetik bozulma örneği (alt kart okuması boyunca daha ileri götürülür): görüntü tanımını buraya girin

Bu dalga biçimini karşılık gelen ikili diziye dönüştürmenin mantıklı bir yolunu bulmaya çalışıyorum.

Bazı ayrıntılara giren bir PDF buldum , ancak kullandıkları algoritmayı bulamıyorum.

Bu PDF ilginç bir resim içeriyor: görüntü tanımını buraya girin

Kırmızı ve mavi çizgileri bu şemaya göre çıkarabilirsem, ikisinden birini veriyi çıkarmak için kullanabilirim, ancak yapının arkasındaki mantığı bulamıyorum.

Öyleyse benim sorum şu: İkili diziyi nasıl çıkartırım?

PS. Kaydırma hızının sabit olmayacağını unutmayın. Bu yüzden, saat bir kez belirlendiğinde, bir onaydan diğerine sürekli olarak ayarlanması gerekir.

PPS. Otokorelasyon kene çiftlerini yakalar mı? (keneler olarak görerek NS SN'yi değiştirir ...)


EDIT (Haziran '12): Bu konuda çok yardıma ihtiyacım vardı, ama sonunda sağlam bir okuyucu okudum ( http://www.magstripedecoder.com/ ). Yardım eden herkese teşekkürler! IRC'nin efnet kanalında #musicdsp'i, matematikle uğraşmakta zorluk çekebilecek kadar kararlı biri için öneriyorum - gerçekten çok zor!


Gerçek wav dosyasını gönderir misiniz?
endolith

1
Bitti! 9876543210
ı P


Düzenleme ve soruyu toplama için Yoda teşekkür ederiz.
P

Sorunuzda üç karttan bahsediyorsunuz. Taktığınız WAV dosyası hangi kartla ilişkili?
Jason R

Yanıtlar:


10

Buna bifaz işareti kodu adı verilir ve darbe genlikleri yerine sıfır geçişlerine odaklanmanız gerekir. Ancak, alıcıya ve telefonun mikrofon girişine özgü düşük kesilmiş filtreler nedeniyle darbe başına birden fazla sıfır geçişiniz var. Sizinkiler geçişler arasında bundan daha uzağa düşüyor ve sıfırı geçiyor:

görüntü tanımını buraya girin

Düşük takviyeli bir filtre kullanarak daha pürüzlü bir şekli geri yükleyebilirsiniz:

görüntü tanımını buraya girin

ve sonra nabız uzunluklarını, bir eşiğin üstünde ne kadar zaman harcadıklarını ölçün. Belki de daha iyi bir fikir, geçişleri büyük yükselmelere dönüştürmek, mutlak değeri almak ve bazı eşik değerlerin üstüne çıktıklarında tespit etmek için girişi farklılaştırmaktır:

görüntü tanımını buraya girin

Sonra nabızlar arasındaki süreyi ölçün ve iki nabız arasındaki süre, son iki nabızla yaklaşık olarak aynı olduğunda, 0'tır, son iki nabız arasındaki değerin yaklaşık yarısı olduğunda, bu bir 1 olur.

Bahsettiğiniz manyetik bozulma, düşük geçişli bir filtreyle kolayca çıkarılabilir.


Teşekkürler! Ders sırasında göndereceğim ikinci türev ile çalışan çok ilginç bazı korelasyonlar buldum. Düşük takviyeli filtreyi açıklayabilir misiniz? Bunu nasıl uygulayacağım hakkında hiçbir fikrim yok ...
P i

@endolith Lütfen soru için daha iyi etiketler ekleyebilir misiniz? Cevabınıza göre, diferansiyel kodlamayı etiketledim , ama bu konuyu daha iyi biliyorsun.
Lorem Ipsum

@ yoda: Haha hayır bilmiyorum. Bu cevabı yazmak için birkaç saat önce öğrendim.
endolith

@endolith Bu şeye yeni rastladım - bu çok hoş - ancak bu 'düşük güçlendirme filtresini' açıklayabilir misiniz? Gerçekten ilginç görünüyor ve google çok fazla yardım
almıyor

@Mohammad: Sadece yüksekleri değişmeden bırakırken düşük frekansları artıran bir filtre. Adobe Audition'da grafik ekolayzer kullandığımı düşünüyorum. Bir raf filtresi deneyin crca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
Endolit

4

Bu oldukça zordu. Çatlamadan önce en az dört yaklaşım denedim. Ben böyle yaptım:

görüntü tanımını buraya girin

Verileri pürüzsüzleştirerek başlıyorum ( ilk okuma ) basit bir ...

x_new = 0.9 * x_prev + 0.1 * x_in

... IIR filtresi. Bunu her iki yönde de yapıyorum ( ikinci okuma ). Bu, tüm bulanık gürültüden kurtulur, ancak türevlerde intikamla geri dönen kesintiler yaratır.

Daha sonra tüm türevleri dördüncü sıraya koyarım ( üçüncü ve dördüncü okumalar üçüncü ve dördüncü türevi temsil eder) ve yeni bir fonksiyon yaratırım:

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

Niye ya? çünkü üçüncü türevine geldiğimizde, sahip olduğumuzun bir zarf içinde etkili bir sinüzoit olduğunu fark ettim:

görüntü tanımını buraya girin

... ve herkes liseden biliyor ki:

sin^2 + cos^2=1 

görüntü tanımını buraya girin

ve bu günah ve cos birbirinden farklılaşır:

görüntü tanımını buraya girin

Böylece zımni zarf kurtarılabilir.

Neden türev 3 ve 4? temel olarak her bir yüksek türev, sinyali temizler. Sinüzoidal olan, sinüzoidal olmaya devam eder (sadece faz 90 ° kayır, yani vb.

11 ve 12'yi ya da çılgınca bir şey kullanmak istedim, ancak türevler oldukça hızlı bir şekilde dağıldı, 4, işler yoluna girmeden önce elde edebileceğim en yüksek miktar, hatta fotoğrafta gördüğünüz küçük türev çizgileri ağır düzeliyor.

Bu, her akı geçişinde harika bir şişlik yaratır ( beşinci okuma ) .

Sonra dönüm noktalarından geçip dudsları reddedeceğim ( altıncı okuma ).

Sonunda maksimadan geçiyorum ( yedinci okuma atlamadan ) her atlamanın yarım adım mı yoksa bütün adım mı olduğunu değerlendiriyorum ve ardından ikili dosyayı yeniden yapılandırıyorum.

Yuppi!

EDIT: Bu projeyi tamamladığımdan bu yana birkaç ay geçti. En zor zorluk, akı geçişlerini izole eden bir dönüşüm oluşturmak; teknik olarak konuşursak, 'genlik zarfı alınıyor'. bu, orijinalden π / 2 faz kayması sinyali oluşturularak yapılır (bu, kuadratür sinyali olarak da bilinir). sonra E (t) ^ 2 = S (t) ^ 2 + Q (S (t)) ^ 2.

Çeyreklik sinyalini almak için basitçe bir FFT yaptım ve her bölmeyi çeyrek tur döndürdüm, sonra değiştirilmiş spektral bileşenleri yeniden birleştirdim.

Bu alanda kafa karıştırıcı çok amaçlı terminoloji var; Anahtar kelimeler 'analitik sinyal', 'Hilbert dönüşümü' ... Bu anahtar kelimeleri farklı disiplinler olarak onlara farklı anlamlar atayarak kullanmaktan kaçınıyorum.

Dijital filtreler kullanarak bu genlik zarfı elde etmenin çok daha akıllı bir yolu var, böylece Fourier dönüşümünden kaçınılır. Bu, algoritmanın çok düşük güçlü mikrodenetleyiciler üzerinde çalışmasını sağlar.

Bu işlem, her akı geçişi üzerinde benzersiz bir şişliğe sahip olması gereken bir dalga şekli üretir.

Bu dalga biçimini ikili bir diziye dönüştürmek hala önemsiz bir iştir. karmaşıklık ve bu bileşen matematiksel değil algoritmiktir; zorluk karşılaştırılabilir.

Sonuçta bu son derece zor bir sorundur. Performans algoritmalarını elde etmek üç ayın en iyi kısmını aldı. Zamanımın tamamını yaklaşımımı belgeleyip halka açık bir kod çözücü motor üreteceğim.


1
Okuma kafaları, bitişik manyetik alanların yanı sıra, okuma başlığını çevreleyen bit modeline bağlı olarak zaman içinde ileri geri itme eğiliminde olan okuma kafasının altında bulunan geçişten etkilenebilir.
hotpaw2

bu tekniğin güvenilir olmadığını unutmayın. Pistin çoğu için mükemmel sonuçlar vermesine rağmen, erken dönemde her akı geçişi için benzersiz bir darbe üretmiyor. yani çift çarpma yaratır. Tahmin ediyorum, çünkü giriş dalga biçimi bu noktada uygun şekilde sinüzoidal değildir. bu yüzden hala teknikleri arıyorum.
P,

Merak ediyorum, "analitik sinyal" veya "Hilbert dönüşümü" nün diğer tanımlarını buldunuz? Sinyalin zarfını arıyorsanız, önce onu (karmaşık) bir analitik sinyale dönüştürerek bulabilirsiniz. Bunu yapmanın birkaç yolu vardır, ancak belirttiğiniz şey genellikle kullanılmaz.
Jason R

@JR bazı kaynaklar analitik sinyali 90 ° faz kayması, yani Quad (f (x)) olarak tanımlamaktadır. diğerleri f (x) + iQuad (f (x)) şeklindedir. Sanırım ikisinin de tanımlandığı Hilbert dönüşümünü gördüm. Tamamen emin değilim, bu yüzden açık olması gereken bir gösterimde kaldım. Sinyalin zarfını almak için diğer tekniklerle ilgileniyorum; dsp.stackexchange.com/questions/424/… bu konuyu takip etmek için doğru yer gibi görünüyor.
P
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.