对热门片段进行逆向工程(2013)

2020-09-28 11:09:12

如今,如果没有某种iDevice在闪亮的白色耳机上注入高保真的192kbps立体声无损音频,很难看到任何一个孩子在户外,但在我那个时代,iPod还没有发明出来。他们的选择很少。虽然随身听过时了,CD播放器很贵,尽管有ESP功能,但如果被撞来撞去就会跳过,迷你盘是另一种胎死腹中的索尼格式,MP3播放器仍然丑陋和昂贵得离谱(至少苹果解决了丑陋的部分)。

因此,老虎电子,麦当劳开心乐园餐玩具高科技市场的先驱,发明了热门的夹子;

热门短片是小而便宜的数字音频播放器,可以用小塑料盒播放音乐。虽然音频是单声道的,听起来很糟糕,而且只包括了一首歌的60秒样本。

尽管如此,这些歌曲还是获得了官方授权,其中包括后街男孩乐队、亚伦·卡特乐队、苏格·雷乐队和……梦幻街乐队。

不管是谁,在帮我17岁的表弟搬家具的时候,我们偶然发现了一大堆热门弹夹,但没有播放器。怀旧之情袭来,我问是否可以拿一支来拆掉。

拆开它,我希望找到一些可识别的硬件,但却发现了在超低成本、低功耗电子产品中非常受欢迎的板载芯片结构,以及一些分立的元件。

在这团环氧树脂下面是硅丝键合芯片。*这首歌很可能是直接硬编码到硅片中的,而不是事后使用闪存或OTP存储器在那里编程的。如果你生产足够的数量,那样会更便宜。

这并没有给我一个完整的工作,但假设电容器是一个旁路电容器(相当好的假设),我至少对如何给它供电有了一些想法。我四处摸索了一下,给了我这样的示意图:

我不确定这两个No Connect插针是做什么用的,但显然有一个版本的热门剪辑可以将音乐录制到特殊的盒式磁带上,所以我猜它们与此有关。

我不确定这个部件需要多少电压,但在eBay上快速搜索一下就知道了:

3个AAA表示4.5V。此外,你能相信人们为这些东西出价40美元以上吗?

在我认真调试之前,我需要一些方法来轻松地将轨迹连接到电路板。但我最终焊接了一些插头引脚,并将其插入面包板:

我最初的假设是,左下角的引脚与神秘芯片的连接次数比其他电源引脚要多。你会注意到这些划掉的东西表明我错了。在这种配置下,芯片在我保持连接的半秒内吸引了200+mA。大概有一个反向偏压保护二极管是我引爆的。

调换电源针脚,电流在280安左右开始,然后降至零。

我确信我是对的,于是我搬到了另一个针脚上。有四个针脚可供选择,电压测量显示其中两个针脚位于4.5V钢轨,另外两个针脚稳定在接近0V的位置。

因为我已经确定了我的两个电源引脚,所以我不得不假设这四个引脚以某种方式用于数据,并且这两个高引脚有内部上拉电阻。

将引脚1连接到地,从该引脚下沉约12 mA。对于一个简单的上拉电阻器来说,12 mA的电流太高了。但我猜这是某种输出针,用来告诉玩家子弹是完全插入的。我决定不去管它,转到Pin 3。

将引脚3连接到地导致电路的电流消耗从零上升到300A。消除这一短路并没有改变电流的增加,尽管它确实在大约60秒后稳定下来。

这就是我知道我找到了什么东西的时候。大约60秒的当前抽签意味着这部分正在输出它的音乐样本!我原本以为播放器需要做一些更复杂的事情,比如通过SPI总线从盒式磁带中拉出几个字节的音乐,或者至少提供一个时钟源,但事实证明,盒式磁带可以自己处理。我猜这两个板载串联电阻器是用来微调芯片印刷后的内部时钟源的。

当我在一个不同的热门短片(“谁让巴哈男放狗出来”)中做类似的工作时,我发现了不同的行为。将引脚3连接到接地没有任何作用,而注释引脚1到接地在数据和无数据之间切换。我不确定热门短片的设计是几代人都在改变,还是我记的笔记不准确。“两个夹子的PCB布局明显不同,看起来第三针在第二个夹子上是NC。

我注意到一个间歇性方波,周期几乎正好是24 kHz,占空比随时间变化。Pin 4也有类似的数据。

所以这里肯定发生了什么,而且肯定是数字的,但我需要一些方法来捕捉大量的数字数据,以便稍后分析。幸运的是,圣诞老人给了我一个8位的Saleae逻辑分析仪作为圣诞节礼物:

我实际上是在寻找一个好的项目来测试这个东西的时候拿起了这个热门的剪辑。这是一款非常不错的设备,Windows/Mac/Linux兼容的软件也非常流畅。

任何人,在Saleae连接到Pin 2和Pin 4的情况下,我重新激活电路并以24 MHz的采样率进行跟踪。但我想出了这个:

起初看到这两条数据线是如何轮流出现的很奇怪,但一旦我记起热门剪辑只以单声道输出,这就变得更有意义了。但这两条线路正在编码相同的单声道音频流。

仔细观察下面的光点,我注意到它们是量子化的。每个光点的长度总是接近0.3333秒的某个整数倍。

知道我对音频放大器的了解后,我推测这两个输出是用来直接驱动D类放大器的实时推挽FET的。换句话说,一条线路上的一个小光点会将波形输出电压拉高,而另一条线路上的一个小光点则会将波形输出电压拉低。*斑点的宽度指示它拉动的力度(或拉动时间)。

虽然从技术上讲,它是一种数字输出,但它的编码方式可以直接送入模拟电路。

我想,如果我能给自己一个这样的数据流,我可能就能以数字方式模拟输出。为了减少样本数量,我将跟踪导出到一个CSV文件,该文件只在发生变化时记录时间戳。

为了利用这些数据,我只需要记录信号从降低到再次上升之间经过了多少时间,我应该让这样的数据点几乎精确到24 kHz。*一个管脚的所有数据都被赋予正值,而另一个管脚的数据被赋予负值。

我还尝试通过将时间延迟除以0.33333秒来量化数据,虽然这种方法对小数字有效,但我注意到一些较大的数字与实数相差甚远。

看起来0.33333秒是对实际量化时间的错误估计。再仔细想想,我注意到一个24 kHz的波有41.67秒的周期。当除以我的量化时间时,结果几乎正好是125,相当于128的2次方。

我的第一次尝试只是将它们压缩到一个wav文件中,然后进行监听。在此设置下,所有负数都是波形上的负点。这是前400个样品:

我获取了这些值,将它们填满一个16位的wav文件,并进行了监听:

首先,我很震惊地发现了任何与音频非常相似的东西。尤其是一些如此容易辨认的东西。话虽如此,但音质并不是最好的。墨盒外的原始值仅从-60到+60左右扩展,这让我相信它被编码为7位有符号整数(-64到+63)。7位音频并不是完全无损的,但我并不确信这是我能做的最好的。

我注意到,查看Saleae轨迹时,在24 kHz的数字数据流中有许多周期,两条轨迹都没有闪烁。

因为我的脚本只看点点,所以我简单地跳过了这些数据点。但最终的结果是,音乐的播放速度略快于应有的速度。*当我的输出WAV文件比原始轨迹短时,这一点很明显。

我修改了脚本,以检测何时在连续的斑点之间传递的时间超过,并且只需重复先前的值就可以在适当的位置插入斑点。

后来我注意到,我并不是真的在模拟热门剪辑可能使用的推拉式驱动程序。数字编码实际上更多的是输出波形的派生,而不是波形本身。“换句话说,一个正值并不能保证产出是正的,而是它会有一个正的斜率。*较大的值指定较大的坡度。

我修改了我的脚本,使运行值从零开始,其中来自盒式磁带的输入值与前一个值相加,以生成下一个值。存在直流漂移的问题,因为这些值加起来并不都是零。在我第一次浏览时,我发现最大的值是1,而最小的值在-50,000左右,这溢出了我的带符号的16位WAV输出。

在存储之前,我通过将输出值乘以0.99解决了这个问题。这相当于一个非常简单的高通滤波器,因为随着时间的推移,直流偏移量会慢慢降到零。

音频是100%可辨认的,这比我认为我会从这个项目中得到的要多得多。虽然它远不是完美的,但由于没有比较的基础,很可能热门短片听起来真的有那么糟糕。可能还有大量过滤是由热门剪辑播放器执行的,我很难尝试复制这些过滤。但他们可能会专门混合曲目,以适应他们可以廉价而轻松地制作的任何音频阶段,所以如果没有更多的信息,我就没有太多事情可以做来修复它。

像这样的项目最大的问题是音频很容易从电路中拉出来。“人类的耳朵非常善于从噪音中辨别信号,所以很难判断我做得是否正确。”*Heck,当我试图让WAV脚本在Python中工作时,有几次我选择了错误的位深度,产生了刺耳的全尺寸噪音,但我仍然能够听到杰克逊五人在这一切之下演奏。

从波形上看,没有任何明显的地方我可能做错了,然而,我不能让音频听起来比你在上面听到的乱码样本好很多。

下面,我提供了一个链接,您可以从my Saleae和我的Python脚本下载跟踪的CSV文件。*如果您对音频处理有一定的经验,并且对如何改善音频输出有想法,请随意下载并尝试。如果你想出了什么,一定要报告!

读者科里接受了我的挑战,提高了音质,实际上修复了一大堆!他的方法在给我的一封电子邮件中解释道:

从技术上讲,热门剪辑音频是PWM,但解调原理是相同的。你只需要一个低通滤波器。命中的剪辑设备将包含一对晶体管、一个截止频率在20 kHz左右的RC或LC滤波器,以及一个扬声器。您也可以使用数字低通滤波器来实现相同的效果。

我已经附上了我写的一个脚本,就是为了做到这一点。它读取您提供的CSV数据,将ch0和ch1转换为三进制(+1,0,-1)表示,并以24*128 kHz的速率将其展开为样本。扩展后的数据使用SciPy抽取到48 kHz,同时以24 kHz的奈奎斯特速率对数据进行低通滤波。然后,该数据被写出到WAV文件中,以供您欣赏收听。结果出乎意料的好!听起来绝对更像我小时候的样子。