生のWAVからバイナリ磁気ストリップカードデータを抽出する


23

iPhoneの磁気ストリップカードリーダーからバイナリデータを抽出するという難しい課題に直面しています。これは、カードの磁化がどのように見えるかです:

ここに画像の説明を入力してください
ソース

カードをスワイプしたときにiPhoneが受け取る.WAVは次のとおりです(期待をかけすぎないでください、これはボーナスポイントカードです;))。ちなみに、異なる速度での3回のスワイプです。これは、使用しているスワイプの未加工のSInt16ダンプです。

ここで誰かがやったようです が、実際にキャプチャしたデータを処理するのは特に簡単ではありません。

読み取りは「ゼロ」の不定数で開始(および終了)します-波は2つのZEROSが収集された後にのみ繰り返されることに注意してください。これはNSに続いてSNを表します。

ここに画像の説明を入力してください

(3行のそれぞれが私が別のカードをスワイプすることを表していることに注意してください。この画像の一番下のカードは15歳ですので、このショットでは見えない場所で磁場が明らかに著しく低下しています)

これにより、アルゴリズムはクロックティックを確認できます。

クロックティックごとに磁場が反転します。 また、バイナリ1の場合、ティックの中央で磁場が正確に反転します。

ここに画像の説明を入力してください

シーケンスは常に1101 + 0(パリティビット)開始センチネルで始まります。上記のグラフの3つの測定値すべてでこれを選択できます。これは、質問の冒頭でリンクしたcosmodroの記事でより明確に示されています。

磁気劣化の例を次に示します(下のカードの読み取りについてさらに詳しく説明します)。 ここに画像の説明を入力してください

この波形を対応するバイナリシーケンスに変換する賢明な方法を見つけようとしています。

詳細を説明するPDF1つ見つけましたが、使用しているアルゴリズムがわかりません。

このPDFには興味深い画像が1つ含まれています。 ここに画像の説明を入力してください

この図のように赤と青の線を抽出できれば、どちらかを使用してデータを抽出できますが、構造の背後にあるロジックを理解することはできません。

これが私の質問です:バイナリシーケンスを抽出するにはどうすればよいですか?

PS。スワイプ速度は一定にならないことに注意してください。そのため、クロックが決定されたら、1つのティックから次のティックに常に調整する必要があります。

PPS。自己相関はティックのペアをキャッチしますか?(ダニがNS SNを代替するように見える...)


編集(12年6月):これについて多くの助けが必要でしたが、最終的にはしっかりした読者(http://www.magstripedecoder.com/)を完成させました。助けてくれたみんなありがとう!IRCのefnetチャンネルで#musicdspをお勧めします。数学に慣れるのに挑戦するのに十分な熱心な人なら、本当に難しいです!


実際のwavファイルを投稿できますか?
エンドリス

1
できた!9876543210
P i

うーん あなたの波形は、私が見つけることができる他のすべての例のようには見えません。 2.bp.blogspot.com/_QF4k-mng6_A/TOzDBOzIB3I/AAAAAAAAAbM/... monografias.com/trabajos43/banda-magnetica/Image4228.gif embeddedsoftwareengineering.com/img/mag-flux.gif
endolith

質問を編集して片付けてくれてありがとうございます。
P私

質問で3枚のカードに言及しています。添付したWAVファイルはどのカードに関連付けられていますか?
ジェイソンR

回答:


10

これはバイフェーズマークコードと呼ばれ、パルス振幅ではなくゼロ交差に注目する必要があります。ただし、ピックアップと電話機のマイク入力に固有のローカットフィルターのため、パルスごとに複数のゼロクロッシングがあります。トランジション間でこれよりもさらにドロップし、ゼロをクロスします。

ここに画像の説明を入力してください

低ブーストフィルターを使用することで、よりパルス状の形状を復元できます。

ここに画像の説明を入力してください

そして、ある閾値を超える時間でパルス長を測定します。おそらく、より良いアイデアは、入力を区別して遷移を大きなスパイクにし、絶対値を取得し、しきい値を超えたときにそれらを検出することです。

ここに画像の説明を入力してください

次に、パルス間の時間を測定し、2つのパルス間の時間が最後の2つのパルスとほぼ同じである場合は0、最後の2つのパルス間の時間の約半分である場合は1です。

あなたが話す磁気劣化は、ローパスフィルターで簡単に除去できるはずです。


ありがとう!私は、二次導関数と連動する非常に興味深い相関関係を見つけました。低ブーストフィルターについて詳しく説明してください。私は...私はこれを実装する方法を任意のアイデアを持っていない
Pを私

@endolith質問に対してより良いタグを追加してください。私はあなたの答えに基づいて、それをdifferential-codingとタグ付けしましたが、このトピックをよく知っています。
Loremのイプサム

@ヨーダ:笑いません。この答えを書くために、数時間前にそれについて学びました。
endolith

@endolith私はこれに出会ったばかりです-これは素晴らしいです-しかし、この「低ブーストフィルター」を説明できますか?本当に面白いと思われ、グーグルはあまり助けにならない...-
スペイシー

@Mohammad:高域はそのままで低域をブーストするフィルターです。Adobe Auditionでグラフィックイコライザーを使用したと思います。シェルビングフィルターお試しくださいcrca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
endolith

4

これはかなりの挑戦でした。クラッキングする前に、少なくとも4つのアプローチを試しました。これは私がそれをやった方法です:

ここに画像の説明を入力してください

私はシンプルでデータを平滑化することから始めます(最初の読み取り)...

x_new = 0.9 * x_prev + 0.1 * x_in

... IIRフィルター。私はこれを両方向で行います(2回目の読み取り)。これにより、すべてのファジーノイズが除去されますが、不連続性が生じ、デリバティブに復geが戻ります。

次に、4番目までのすべての導関数を取得し(3番目と4番目の読み取り値は3番目と4番目の導関数を表します)、新しい関数を作成します。

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

どうして?3次導関数に到達するまでに、エンベロープ内の正弦波が事実上あることに気づいたからです。

ここに画像の説明を入力してください

...そして、高校生なら誰でも知っていること:

sin^2 + cos^2=1 

ここに画像の説明を入力してください

そして、余弦は互いに区別されます:

ここに画像の説明を入力してください

したがって、暗黙のエンベロープを復元できます。

なぜデリバティブ3と4ですか?基本的に、各高次微分は信号を精製します。正弦波であるものは正弦波のままです(位相を90°シフトするだけなので、sin-> cosなど)。

私は11と12またはクレイジーなものを使いたいと思っていましたが、デリバティブはすぐにバラバラになります.4が物事が混乱する前に私が得ることができる最高のものであり、それでもあなたが写真に見る小さなデリバティブラインは非常に滑らかです。

これにより、すべての磁束遷移で素晴らしい小さなバンプが生成されます(5番目の読み取り値)。

次に、ターニングポイントを歩いて、男を拒否します(6番目の読書)。

最後に、最大値(7番目の読書)を調べて、各スキップが半ステップか全ステップかを評価し、バイナリを再構築します。

わーい!

編集:私はこのプロジェクトを完了してから数ヶ月になりました。最も困難な課題は、磁束遷移を分離する変換を構築することです。技術的に言えば、「振幅エンベロープの取得」。これは、オリジナルからπ/ 2位相シフト信号を作成することにより行われます(これは直交信号とも呼ばれます)。E(t)^ 2 = S(t)^ 2 + Q(S(t))^ 2

直交信号を取得するには、単純にFFTを実行し、各ビンを1/4回転させてから、修正されたスペクトル成分を再結合しました。

この分野には、多くの混乱を招く虐待的な用語があります。キーワードは「分析信号」、「ヒルベルト変換」です...異なる分野が異なる意味を割り当てるため、これらのキーワードの使用は避けました。

デジタルフィルターを使用してこの振幅エンベロープを実現するはるかにスマートな方法があり、フーリエ変換を回避します。これにより、非常に低電力のマイクロコントローラーでアルゴリズムを実行できます。

このプロセスにより、各磁束遷移上に固有のバンプを持つ波形が生成されます。

この波形をバイナリシーケンスにデコードすることは、依然として重要な作業です。複雑さとこのコンポーネントは、数学的なものではなくアルゴリズム的なものです。難易度は同等です。

全体として、これは非常に難しい問題です。パフォーマンスアルゴリズムを達成するのに3か月の中で最も良かった部分がありました。私は、時間の余裕をもって、私のアプローチを文書化し、公開されているデコーダーエンジンを作成します。


1
読み取りヘッドは、隣接する磁区や、現在の読み取りヘッドの下にある遷移の影響を受ける可能性があります。これは、周囲のビットパターンに応じて、読み取り遷移を時間的に前後にプッシュする傾向があります。
hotpaw2

この手法は信頼できないことに注意してください。ほとんどのトラックで優れた結果が得られますが、早い段階で各磁束遷移に固有のバンプを生成できません。すなわち、二重バンプを作成します。この時点で入力波形が適切に正弦波ではないため、推測しています。だから私はまだテクニックを探しています。
P i

好奇心が強い、「分析信号」または「ヒルベルト変換」の他の定義を見つけましたか?信号のエンベロープを探している場合は、まずそれを(複雑な)分析信号に変換することで見つけることができます。これを行うにはいくつかの方法がありますが、指定したものは通常使用されません。
ジェイソンR

@JR一部のソースでは、解析信号を90°位相シフト、つまりQuad(f(x))として定義しているようです。その他はf(x)+ i.Quad(f(x))として。私はこれらの両方として定義されたヒルベルト変換を見たと思います。完全には定かではないので、明確な表記法に固執しました。信号のエンベロープを取得する他の手法に興味があります。dsp.stackexchange.com/questions/424/… は、このスレッドを追求するのに適切な場所のようです。
P i
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.