音频指纹和标准化
Posted
技术标签:
【中文标题】音频指纹和标准化【英文标题】:AudioFingerprinting and Normalization 【发布时间】:2012-01-22 01:37:10 【问题描述】:我编写了一个应用程序,它允许使用here 描述的方法进行音频指纹识别。它基本上将 mp3 转换为 wav,然后在数据库中创建一堆哈希码。然后,我使用我的 iphone 创建一个录音,该录音有一些噪音,并比较哈希码并获取链接中记录的匹配项。哇,好酷!!
我现在正在使用 USB 无线电接收器录制无线电样本。我在 byte[] 数组中获取声音数据,然后在存储哈希码的地方做完全相同的事情,然后尝试匹配它。这次不行了。
我的感觉是 mp3 已被标准化(对其应用了压缩),这可能是不同之处。我想不出任何其他差异,因为它们(mp3 和收音机样本)都转换为 wav 格式(16 位)
我想我的问题是双重的:
如果我压缩收音机样本,你认为它会起作用吗?
为此,我需要应用压缩功能,这意味着我需要使柔和的声音更响亮,而响亮的声音更柔和。
我已经开始编写一个函数,它需要一个字节数组(16 位格式的 wav 数据),并希望循环通过它并相应地调整样本值以进行压缩,但我正在努力解决这个问题:
List<short> ints = new List<short>();
for (int j = 0; j < byteArray.Count; j+=2)
//so for 16 bits every 2 bytes in the array is a sample
short sample16 = 0;
byte[] sample = new byte[2];
sample[0] = byteArray[j];
sample[1] = byteArray[j+1];
sample16 = (short)(double)BitConverter.ToInt16(sample, 0);
//at this point change the sample according to the compression needed
ints.Add(sample16);
//back again to test it
byte[] buffer11 = BitConverter.GetBytes(sample16);
【问题讨论】:
OP:我删除了“规范化”标签,因为这个标签是指数据库规范化,而不是数据压缩。 【参考方案1】:正如 sblom 在他的 cmets 中所述,频域散列不受动态范围的影响。根据您提供的信息,我认为您的输入之间缺少一些频率。请注意,MP3 具有基于人类感知的心理声学音频模型。它精确地丢弃或掩盖了一些频率。因此,您的无线电源可能包含或缺少一些重要频率来正确识别您的输入。
【讨论】:
谢谢大家,我目前以 44100hz、16 位和 1 通道采样。降低采样范围会有所帮助吗? 这取决于来源 IMO。如果它主要具有高频,则降低采样范围将消除这些频率(或降低它们)。根据您的实现描述,您会在源代码中丢失一些重要的指纹。我认为,理想情况下,两个输入应该具有相同的采样率。 我想我需要改变我的散列函数来更宽容一点。【参考方案2】:为了做到这一点,有很多重要的背景。您具体尝试做的事情称为Dynamic Range Compression。
我认为您要做的是测量一段样本的平均幅度(可能使用Root Mean Square)。然后将该段中的所有样本除以该 RMS 平均幅度。这将导致整首歌曲具有相同的 RMS 幅度。
您必须试验每个段的正确长度。可能,如果它是 10-40 毫秒,那么它足够短,音量变化不会听起来太刺耳,并且足够长,您可以获得良好的 RMS 测量结果。
【讨论】:
谢谢,您觉得添加动态范围压缩会使其产生正确的数据吗?还是您认为需要对数据进行其他处理? 这很难说,完全取决于您选择的音频哈希。我的预感是收音机也引入了其他失真。但是究竟什么失真以及如何使您的哈希函数对它们具有鲁棒性,这远远超出了我在这里的经验。 :( 好吧——实际上看看你链接的文章,哈希完全是在频域数据上完成的。我描述的动态范围压缩算法实际上不应该改变频域数据的任何内容。所以我不认为这是正在发生的事情。以上是关于音频指纹和标准化的主要内容,如果未能解决你的问题,请参考以下文章