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

信息处理 数字通信 解调
2022-01-07 23:35:42

我面临一个棘手的挑战:从iPhone 磁条读卡器中提取二进制数据。这是卡片上的磁化强度:

在此处输入图像描述
资源

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

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

读数以不确定数量的“零”开始(和结束)——请注意,波仅在收集到 2 个零后重复,这表示 NS 后跟 SN:

在此处输入图像描述

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

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

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

在此处输入图像描述

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

这是一个磁性退化的例子(在底部读卡器中进一步介绍): 在此处输入图像描述

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

我找到了一份包含一些细节的 PDF,但我无法弄清楚他们使用的算法。

此 PDF 包含一张有趣的图片: 在此处输入图像描述

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

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

PS。请注意,滑动速度不会是恒定的。所以一旦时钟确定了,就需要从一个滴答声到下一个滴答声不断调整。

聚苯乙烯。自相关会捕获成对的刻度吗?(看到蜱会交替 NS SN ...)


编辑(2012 年 6 月):我需要很多帮助,但最后我完成了一个可靠的阅读器(http://www.magstripedecoder.com/)。感谢所有帮助过的人!我推荐 IRC 的 efnet 频道上的#musicdsp 给任何愿意接受挑战以掌握数学的人——这真的很难!

2个回答

这称为双相标记代码,您必须关注过零而不是脉冲幅度。但是,由于拾音器和手机的麦克风输入固有的低切滤波器,每个脉冲都有多个过零。你的在转换之间下降得比这更远,并且越过零:

在此处输入图像描述

您可以通过使用低增强滤波器来恢复更脉冲的形状:

在此处输入图像描述

然后通过它们花费超过某个阈值的时间来测量脉冲长度。也许更好的想法是区分输入以使转换变成大尖峰,取绝对值,并在它们超过某个阈值时检测它们:

在此处输入图像描述

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

您所说的磁退化应该很容易用低通滤波器去除。

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

在此处输入图像描述

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

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 

在此处输入图像描述

并且sincos相互区分:

在此处输入图像描述

因此可以恢复隐含的包络。

为什么是导数 3 和 4?基本上每个更高的导数都会净化信号。正弦的仍然是正弦的(只是将相位移动 90°,所以 sin->cos 等),而不是的则消失。

我想使用 11 和 12 或者一些疯狂的东西,但是导数很快就崩溃了,4 是我在事情变得混乱之前能得到的最高值,即使你在图片中看到的小导数线也被严重平滑了。

这会在每个通量转换(第五读上产生一个美妙的小凸起。

接下来我走过转折点,拒绝无用(第六读)..

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

耶!

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

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

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

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

这个过程会产生一个波形,该波形应该在每个通量转换上都有一个独特的凸起。

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

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