AudioFingerprinting和Normalization

时间:2012-01-22 01:37:11

标签: c# audio compression

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

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

我的感觉是mp3已经被标准化(已经应用了压缩),这可能是不同的。我无法想到任何其他差异,因为它们(mp3和无线电样本)转换为wav格式(16位)

我想我的问题有两个:

  1. 如果我压缩无线电样本你认为它会起作用吗?

  2. 要做到这一点,我需要应用压缩功能,这意味着我需要让柔和的声音更响亮,声音更响亮。

  3. 我开始编写一个函数,它接受一个字节数组(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);
            }
    

2 个答案:

答案 0 :(得分:0)

为了做到这一点,有很多重要的背景知识。您特别想要做的是Dynamic Range Compression

我认为您要做的是测量一段样本的平均幅度(可能使用Root Mean Square)。然后将该段中的所有样本除以该RMS平均幅度。这将导致整首歌曲的RMS幅度相同。

您必须尝试每个细分受众群的正确长度。可能,如果它是10-40毫秒,它会足够短,音量变化不会听起来过于刺耳和足够长,以至于你将获得良好的RMS测量。

答案 1 :(得分:0)

正如 sblom 在评论中已经说明的那样,频域散列不受动态范围的影响。根据您提供的信息,我认为您的输入之间缺少一些频率。注意,MP3具有基于人类感知的心理声学音频模型。它精确地丢弃或掩盖某些频率。因此,您的无线电源可能包含或缺少某些重要频率,无法正确识别您的输入。