AudioFingerprinting and Normalization

本文关键字:Normalization and AudioFingerprinting | 更新日期: 2023-09-27 18:21:06

我已经编写了一个应用程序,它允许使用此处描述的方法进行音频指纹识别。它基本上将mp3转换为wav,然后在数据库中创建一组哈希代码。然后,我用我的iphone创建了一个有一些噪音的录音,并比较哈希代码,获得链接中记录的匹配项。哇,太酷了!!

我现在用USB无线电接收器录制无线电样本。我在byte[]数组中获取声音数据,然后在存储哈希代码的地方做完全相同的事情,然后尝试匹配它。这次它不起作用。

我的感觉是mp3已经被标准化了(对其进行了压缩),这可能就是区别。我想不出任何其他区别,因为它们都被转换为wav格式(16位)

我想我的问题有两个:

  1. 如果我压缩无线电样本,你觉得行吗?

  2. 要做到这一点,我需要应用一个压缩函数,这意味着我需要让柔和的声音更大,更大的声音更柔和。

我开始写一个函数,它采用字节数组(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);
        }

AudioFingerprinting and Normalization

正如sblom在他的评论中所述,频域哈希不受动态范围的影响。根据你提供的信息,我认为你的输入之间缺乏一些频率。注意,MP3具有基于人类感知的心理声学音频模型。它精确地丢弃或屏蔽了一些频率。因此,你的无线电源可能包括或缺乏一些重要的频率来正确识别你的输入。

要做到这一点,需要大量的重要背景。您特别想做的是动态范围压缩。

我想你想做的是测量一段样本的平均振幅(可能使用均方根)。然后将该段中的所有样本除以RMS平均振幅。这将导致在整个歌曲上具有相同的RMS幅度。

你必须试验一下每个片段的正确长度。也许,如果它是10-40毫秒,它会足够短,音量变化听起来不会太刺耳,而且足够长,你会得到一个很好的RMS测量。