在音频信号中嵌入数字 ID,并检索它

信息处理 fft
2022-01-31 04:26:28

问题

我正在处理一个有趣的挑战——在音频流中编码一个 32 位 ID blip,然后检索它。

像这样的东西:http: //gizmodo.com/5883215/why-lady-gaga-deploys-a-sound-only-your-smartphone-can-hear

编辑 感谢您指出我需要更详细地指定任务的评论。

  • 比特率 N/A(只需要发送一个字节)

  • 我需要在 4-10KHz 区域工作,这样才能在便宜的扬声器/声卡/甚至压缩流音频上工作

  • 我正在尝试将脉冲时间降至最低(可能是 1 FFT 帧,即 1024 个样本或 1/44 秒)

  • 我需要它来处理由典型笔记本电脑内部扬声器发出的信号,并在同一个房间的 iPhone 上接收到。目前它只有在我将 iPhone 放在扬声器旁边时才有效。

目前的技术

我目前正在尝试的方法是合成对应于各种 FFT 箱的正弦波

所以我的接收器使用 10 位(1024 个样本)FFT,它将生成 512 个 bin

我为每个位使用 3 个相邻的箱,所以位 #0 将是箱 99、100、101

我会将 bin 99 激活到 0%,将 bin 101 激活到 100%,将 bin 100 激活到零或 100%,具体取决于该位是 0 还是 1

样本数据输出显示问题

问题是我得到了一些错误的位

BINS:bin 0 = { 0.628, 7.798, 6.554 } -> 1.210 --> 1
bin 1 = { 0.471, 0.624, 7.312 } -> 0.022 --> 0
bin 2 = { 0.948, 0.374, 14.156 } -> -0.043 --> 0
bin 3 = { 1.783, 16.634, 16.600 } -> 1.002 --> 1
bin 4 = { 0.893, 0.697, 13.286 } -> -0.016 --> 0
bin 5 = { 0.511, 11.385, 9.277 } - > 1.240 --> 1
bin 6 = { 1.074, 9.621, 15.472 } -> 0.594 --> 1
bin 7 = { 0.381, 0.580, 14.623 } -> 0.014 --> 0
bin 8 = { 1.037, 0.554, 17.310 } -> -0.030 -> 0

前八个是正确的;1001 1100是我的起始哨兵!

bin 9 = { 0.817, 1.220, 5.544 } -> 0.085 --> 0
bin 10 = { 1.316, 1.193, 2.589 } -> -0.097 --> 0
bin 11 = { 2.246, 1.681, 15.257 } -> -0.043 - -> 0
bin 12 = { 1.387, 2.950, 29.683 } -> 0.055 --> 0
bin 13 = { 1.534, 3.786, 24.015 } -> 0.100 --> 0
bin 14 = { 1.523, 2.386, 15.959 } -> 0.060 --> 0
bin 15 = { 2.995, 2.066, 17.060 } -> -0.066 --> 0
bin 16 = { 1.262, 1.679, 17.068 } -> 0.026 --> 0
bin 17 = { 1.374, 1.332, 12.165 } - > -0.004 --> 0
bin 18 = { 1.060, 1.514, 13.036 } -> 0.038 --> 0
bin 19 = { 1.099, 0.892, 9.148 } -> -0.026 --> 0
bin 20 = { 0.906, 0.523, 4.556 } -> -0.105 --> 0
bin 21 = { 0.483, 0.299, 4.575 } -> -0。045 --> 0
bin 22 = { 0.776, 1.023, 5.269 } -> 0.055 --> 0
bin 23 = { 0.216, 0.475, 4.232 } -> 0.065 --> 0
bin 24 = { 0.518, 0.162, 2.393 } -> -0.190 -- > 0
bin 25 = { 0.369, 0.643, 0.737 } -> 0.744 --> 1
bin 26 = { 0.294, 0.258, 3.712 } -> -0.011 --> 0
bin 27 = { 0.228, 0.354, 2.114 } -> 0.067 --> 0
bin 28 = { 0.272, 0.212, 1.836 } -> -0.039 --> 0
bin 29 = { 0.139, 0.115, 2.036 } -> -0.013 --> 0
bin 30 = { 0.241, 0.275, 1.532 } -> 0.026 --> 0
bin 31 = { 0.118, 0.089, 1.509 } -> -0.020 --> 0
bin 32 = { 0.315, 0.256, 1.339 } -> -0.057 --> 0
bin 33 = { 0.111, 0.171 , 0.222 } -> 0.534 --> 1
bin 34 = { 0.103, 0.117, 0.351 } -> 0。054 --> 0
bin 35 = { 0.039, 0.091, 0.637 } -> 0.087 --> 0
bin 36 = { 0.087, 0.045, 0.404 } -> -0.131 --> 0
bin 37 = { 0.057, 0.129, 0.586 } -> 0.136 -- > 0
bin 38 = { 0.034, 0.040, 0.771 } -> 0.008 --> 0
bin 39 = { 0.094, 0.448, 0.791 } -> 0.507 --> 1

位:
1 0 0 1 0 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 1

但只有最后一个 bin (39) 应该包含 1。我在 25、33 时得到误报。这是直接从我的笔记本电脑扬声器播放声音并在几厘米的 iPhone 上拾取它离开。如果这失败了,那就不是好兆头......

那么我该怎么做才能获得更可靠的读数呢?

可能的解决方案

我正在考虑的可能解决方案包括:

a) 奇偶校验,可能需要额外的 8 位用于奇偶校验
b) 在 bin 中建立能量,例如 new_bin[17] = 0.9*old_bin[17] + 0.1*in_bin[17] 等
c) 使用相位

我也有点担心目标信号中会出现某种跳动效应,即某些点处的幅度尖峰——一旦波形被归一化,数据很可能会以这种方式丢失。

是否有任何既定的技术可以做到这一点?还有更强大的选择吗?

2个回答

您通过自定义编码解决了嵌入 ID的问题。这是限制性的。

从您发送的 URL:

一家名为 SonicNotify 的初创公司在音乐或任何其他音轨中嵌入了听不见的高音音频信号。

您正在寻找的是Watermarking无论是出于保护目的还是触发适当的操作,您只需在信号中添加水印并检测播放它的人。

基本上,任何信号都可以用已知的模式加水印。本质上,该水印与原始信号相加,就像可容忍的噪声一样。(加法只是功能之一)。这是一个有趣的问题,您的水印(噪声)应该足够强以经受修改,但应该足够弱,不会打扰耳朵。与视频不同,音频的优势在于您可以嵌入耳朵无法听到的更高频率的音调。

这是相当广泛的主题,所以我留给你一些进一步的阅读。

  1. Hyoung Joong Kim 的音频水印技术 - 教程

  2. 使用 Mitchell D. Swanson Signal Processing 66 (1998) 337-355 Elsevier 的感知掩蔽的鲁棒音频水印。

  3. 书籍:NEDELJKO CVEJI 的音频水印和​​隐写算法算法

对此有另一种方法。与其在信号中嵌入任何内容,不如提取有助于识别内容的最关键特征。该指纹然后驻留在单独的数据库中(不修改原始内容)。如果在门户上,如果有人上传副本,它将收到相同的指纹,这将捕捉到这样的内容不是唯一的。这相当于流的数字签名。

该领域最早的工作之一是弗劳恩霍夫研究所,名为AudioIDYouTube 也有类似的ContentID框架。

数据通信是一个经过深入研究的领域,有 100 多本关于该主题的教科书。你似乎在做一个 OFDM 的变体,有很多很多的导频,没有循环前缀,也没有冗余。有大量用于添加冗余的编码选项(可能包括 ECC、RLL 组代码、Reed-Solomon、Trellis 等)。您对 OFDM 可能存在峰值功率问题的观察是正确的。似乎有一些算法可以改变载波的相位以帮助降低 PAPR。

补充:更长的数据帧或添加足够长的循环前缀可能有助于在更远距离工作时处理多路径或反射。