问题
我正在处理一个有趣的挑战——在音频流中编码一个 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) 使用相位
我也有点担心目标信号中会出现某种跳动效应,即某些点处的幅度尖峰——一旦波形被归一化,数据很可能会以这种方式丢失。
是否有任何既定的技术可以做到这一点?还有更强大的选择吗?