从原始WAV提取二进制磁条卡数据


23

我面临着一个棘手的挑战:从iPhone磁条卡读取器中提取二进制数据。卡上的磁化强度如下所示:

在此处输入图片说明
资源

这是当您刷卡时iPhone收到的.WAV(不要将希望寄予太大希望,这是奖励会员卡;))。顺便说一下,这是以不同的速度刷了三下。这是我正在使用的滑动的原始SInt16转储

似乎有人在这里做过, 但是我捕获的实际数据并不是特别容易处理。

读数以不确定的“ 0”开始(并结束)-请注意,只有在收集到2个ZEROS之后,该波才会重复,这表示NS后跟SN:

在此处输入图片说明

(请注意,三行中的每一行都代表我要刷一张不同的卡;此图像中的底部卡已使用了15年,因此磁场在某些地方明显退化严重,在这张照片中看不到)

这将允许算法确定时钟滴答。

磁场在每个时钟滴答处反转。 同样对于二进制1,磁场恰好在刻度线的中间反转:

在此处输入图片说明

该序列始终以1101 + 0(奇偶校验位)开始标记开始。您可以在上图中的所有三个读数中进行选择。我在问题顶部链接的cosmodro文章中更清楚地表明了这一点。

这是一个磁性衰减的示例(在底下的卡片读取中进一步记录): 在此处输入图片说明

我试图找出一种明智的方法来将该波形转换为其相应的二进制序列。

我已经找到了一份详细介绍的PDF,但是我无法弄清楚他们使用的算法。

该PDF包含一个有趣的图像: 在此处输入图片说明

如果我可以按照该图提取红线和蓝线,则可以使用其中之一来提取数据,但是我无法弄清楚构造背后的逻辑。

所以这是我的问题:如何提取二进制序列?

PS。请注意,滑动速度不会保持恒定。因此,一旦确定了时钟,就需要将时钟从一个滴答声一直调整到下一个滴答声。

PPS。自相关会捕捉成对的滴答声吗?(看到滴答声会交替显示NS SN ...)


编辑(12年6月):在这方面我需要很多帮助,但是最后我完成了坚实的阅读器(http://www.magstripedecoder.com/)。感谢大家的帮助!我建议IRC的efnet频道上的#musicdsp给那些有足够的心力去迎接挑战,掌握数学的人-这真的很难!


您可以发布实际的wav文件吗?
endlith 2011年

1
做完了!9876543210
P I


非常感谢Yoda编辑和整理问题。
P I

您在问题中提到三张卡片。您附加的WAV文件与哪张卡关联?
詹森·R

Answers:


10

这称为双相标记代码,您必须专注于过零而不是脉冲幅度。但是,由于拾音器和电话的麦克风输入固有的低切滤波器,每个脉冲有多个零交叉。在过渡之间,您的下降幅度远不止于此,并且过零:

在此处输入图片说明

您可以使用低升压滤波器恢复更脉冲的形状:

在此处输入图片说明

然后通过脉冲长度超过某个阈值的时间来测量脉冲长度。也许更好的主意是区分输入,以将过渡转变为大的尖峰,获取绝对值,并在超过某个阈值时对其进行检测:

在此处输入图片说明

然后测量脉冲之间的时间,当两个脉冲之间的时间与最后两个脉冲大致相同时,则为0,而当其大约为最后两个脉冲之间的一半时,则为1。

您所谈论的磁性能下降应该易于通过低通滤波器消除。


谢谢!我发现一些与二阶导数有关的非常有趣的相关性,我将在适当时候发布。您能否详细说明低升压滤波器?我没有任何想法,我将如何实现这...
P I

@endolith您能否为这个问题添加更好的标签?我根据您的回答将其标记为“ differential-coding”,但您对此主题的了解更好。
Lorem Ipsum

@yoda:哈哈,不,我不知道。我是几个小时前才知道的,因此可以编写此答案。
endlith 2011年

@endolith我刚刚碰到这个-很好-但是您能解释一下这个“低升压滤波器”吗?似乎真的很有趣,而Google并没有太多帮助...
Spacey 2012年

@穆罕默德:只是一个滤波器,可以在不改变高音的情况下提高低频。我想我在Adobe Audition中使用了图形均衡器。尝试使用货架过滤器crca.ucsd.edu/~msp/techniques/latest/book-html/node142.html
endolith 2012年

4

这是一个很大的挑战。在破解之前,我尝试了至少四种方法。这是我的方法:

在此处输入图片说明

我首先用一个简单的平滑数据(初读)...

x_new = 0.9 * x_prev + 0.1 * x_in

... IIR滤波器。我双向进行此操作(二读)。这消除了所有的模糊噪声,但是会产生不连续性,并在导数上出现复仇。

然后,我得到所有的导数到四阶(第三和第四读数分别表示三和四阶导数),并创建一个新函数:

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

为什么?因为我注意到当我们到达三阶导数时,我们所拥有的实际上是信封内的正弦曲线:

在此处输入图片说明

...而且所有人从高中就知道:

sin^2 + cos^2=1 

在此处输入图片说明

COS分化成对方:

在此处输入图片说明

因此,可以恢复隐含的信封。

为什么衍生3和4?基本上每个高阶导数都会净化信号。正弦波保持正弦波(只需将相位移90°,使sin-> cos等),而正弦波不会消失。

我想使用11和12或一些疯狂的东西,但是导数很快就崩溃了,在事情发生麻烦之前,我可以得到的最高数是4。

这在每个磁通过渡处都会产生一个奇妙的小颠簸(第五读数)。

接下来,我浏览转折点,拒绝废话(第六读)。

最后,我遍历最大值(第七读),评估每个跳过是半步还是整步,然后重建二进制。

好极了!

编辑:现在距离我完成这个项目已经几个月了。最困难的挑战是构造一些隔离通量转换的变换;从技术上讲,“检索幅度包络”。这是通过从原始信号构造π/ 2相移信号(也称为正交信号)来完成的。那么E(t)^ 2 = S(t)^ 2 + Q(S(t))^ 2。

为了获得正交信号,我只需执行FFT,然后将每个bin旋转四分之一圈,然后重新组合修改后的频谱分量。

这个领域有很多令人困惑的辱骂术语。关键字是“分析信号”,“希尔伯特变换” ...我避免使用这些关键字,因为不同的学科为其赋予了不同的含义。

有一种使用数字滤波器来实现此幅度包络的更智能的方法,从而避免了傅立叶变换。这允许算法在功耗非常低的微控制器上运行。

此过程产生的波形在每个磁通过渡上都应具有唯一的凸起。

将该波形解码为二进制序列仍然是一项艰巨的任务。复杂性,该组件是算法而非数学的;难度是可比的。

总而言之,这是一个极其困难的问题。我花了三个月的大部分时间来实现他们的性能算法。我将在充分的时间里记录我的方法,并制作一个公开可用的解码器引擎。


1
读磁头可能会受到相邻磁畴以及当前在读磁头下的过渡的影响,这往往会根据周围的位模式在时间上前后推动读过渡。
2011年

请注意,此技术不可靠。尽管它在大多数磁道上都能提供出色的结果,但它并不能在早期就为每个磁通过渡产生独特的冲击。即,它会产生双重冲击。我猜是因为此时输入波形不是正弦波。所以我还在寻找技术。

很好奇,您发现“解析信号”或“希尔伯特变换”还有哪些其他定义?如果您正在寻找信号的包络线,则可以先将其转换为(复杂的)分析信号来找到它。有几种方法可以执行此操作,但是通常不会使用您所指示的内容。
杰森R

@JR一些来源似乎将分析信号定义为90°相移,即Quad(f(x))。其他形式为f(x)+ i.Quad(f(x))。我想我也看到了希尔伯特变换也被定义为这两者。不能完全确定,因此我坚持使用明确的表示法。我对检索信号包络的其他技术感兴趣;dsp.stackexchange.com/questions/424/… 似乎是追求此主题的正确位置。
P I
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.