在不知道原始信号的情况下实时同步音频

信息处理 声音的 互相关 即时的 同步 倒谱分析
2022-02-23 18:41:56

怀疑这是否是问我(详细)问题的正确 SE 论坛,所以如果不是,请不要犹豫让我知道。另外,如果有人知道为问题命名的更好方法,请随时更改。

背景

设置如下:两台电脑站在一个房间里。一个有扬声器(TX),一个有麦克风(RX)。

TX 获取一些位作为输入,从它存储的文件(例如歌曲)中挑选出一个 .wav 文件,并使用回声数据隐藏方法更改其样本(更多内容在这里;基本思想是信号是分割成相等长度的段——每个比特隐藏到信号中——之后,回声被嵌入到每个段中,延迟为δ0或者δ1取决于段应该分别代表 0 还是 1)。最后,TX 在未知时间通过扬声器播放结果;房间里的人只会注意到音乐,而不会注意到嵌入的回声。

RX 不断刷新麦克风样本缓冲区,并不断对其进行分析。在某个标记上,RX 开始将传入的麦克风数据记录到长期存储中。在第二个标记处,它停止并开始解码信号。

为了解码回波隐藏位,解码器必须分析每个原始片段(这是使用“倒谱”分析完成的,该分析通过采用幅度的对数的 FFT 将每个片段转换为将延迟时间与回波突出度相关的函数段的 FFT 的;通过比较突出δ0δ1,解码器知道哪个位最有可能嵌入)。如果这样的解码器没有在片段开头的非常接近的区域开始分析,那么它很可能会误解它认为是片段的样本块,从而导致数据错误。我试过在下面画一个视觉效果: 回声解码器:同步和非同步

给定的

我用 Python 编写了一个编码器和一个解码器。当以数字方式将 TX 的信号传递到 RX时(因此,当解码器知道信号从第一个样本开始时),解码器能够完美地重建编码数据。

问题

这是一个大问题:我不知道TX 如何准确地向 RX 指示环境噪声停止和播放信号开始的位置这实际上意味着 RX 根本无法解码 TX 的信号。

乍一看不能使用起始位,因为要检测到这些,RX 必须知道它们从哪里开始。使用指示频率会违反听不见,并且在硬件条件下使用超声波是不可能的。(进一步说明为什么不希望使用指示频率:理想情况下,我希望在整个 TX 信号中间隔多个开始和结束指示符,这样如果 RX 尚未在开始。那将意味着多次“哔”。)

尝试寻找解决方案

我考虑过的一种解决方案是逐个样本地在麦克风缓冲区中滑动假装段,同时将解码器应用于该段,尝试检测起始位。问题在于:假装段大约有 2000 个样本,并且解码器相当耗费资源(每次解码 1 毫秒,因此滑过 2000 个样本的缓冲区需要 2 秒,这意味着它很容易落后麦克风以每秒 44100 个样本录制)。其次,您需要某种倒谱阈值来确定假装段是否不仅仅是噪音。这样的标准必须考虑输入信号的功率,我没有经验。

我考虑过的另一个解决方案是使用这种假装段和与预期模式的互相关,它只需要几微秒或更短的时间来执行。问题在于,RX 不知道 TX 的信号听起来是什么样的,因为 TX 有一个完整的 .wav 文件数据库可供选择,并用未知数据更改所选文件。将输入信号与自身的偏移进行互相关以检测回声,这是我尝试过的,但到目前为止失败了。

相关来源

我已经考虑了两个星期了(当我第一次接触信号处理的概念时,我已经在整个隐写系统上工作了两个月),但是我没有试图解决这个问题的想法同步问题。我已经向 SE 寻求帮助,但大多数同步 线程都假设 RX 接收到易于解释的位流,但这里的情况并非如此。我发现的与 RX 同步最密切相关的问题是this one,但它使用射频调制,这与这个问题无关。描述回声隐藏也讨论同步的论文数量接近于 0,而那些这样做的论文太模糊而无法很好地解释。

为文字墙道歉。任何想法、观点、技巧等都会有所帮助;编写一个我可以管理的解决方案,如果我知道什么解决方案!

1个回答

您可能在这里遇到了错误的问题:回声数据隐藏似乎是声学通道(扬声器 - > 麦克风)的次优选择。

在房间内以声学方式传输数据非常困难。通道非常复杂且难以处理:扬声器往往非常不平坦,并且有相当多的非线性失真。麦克风通常很吵,许多计算机的声卡和前置放大器都很差。但最困难的可能是房间本身:典型的住宅房间的混响时间约为 300 毫秒,并会产生数千次反射。您需要确保您的解码器能够可靠地检测编码回声和房间产生的回声之间的差异。

我会先用你心目中的房间和硬件记录你收到的信号,手动同步,然后检查你的解码器是否真的能处理信道问题。如果是,您可以继续解决同步问题。如果不是,您需要重新考虑您的方法。

回到实际问题。通常这是通过发送前导码或各种唯一标记来完成的。一个简单的标记将是一个短音突发,例如 19 kHz。如果您的硬件足够好,这是听不见的,但很容易检测到。