Аудио-дактилоскопия и нормализация - PullRequest
3 голосов
/ 22 января 2012

Я написал приложение, которое позволяет аудио-дактилоскопии, используя метод, описанный здесь . Он в основном конвертирует mp3 в wav, а затем создает кучу хеш-кодов в базе данных. Затем я создаю запись, используя свой iphone, который имеет некоторый шум, сравниваю хэш-коды и получаю совпадения, как описано в ссылке. Вау, это круто !!

Сейчас я записываю сэмплы радио с помощью радиоприемника USB. Я получаю звуковые данные в массиве byte [], а затем делаю то же самое, где я храню хеш-коды, а затем пытаюсь сопоставить их. На этот раз это не работает.

Мне кажется, что mp3 нормализовано (к нему применено сжатие), и в этом может быть разница. Я не мог думать ни о каких других различиях, поскольку они оба (образец mp3 и радио) преобразованы в формат wav (16 бит)

Полагаю, мой вопрос двоякий:

  1. если я сожму сэмпл радио, ты думаешь, это будет работать?

  2. Чтобы сделать это, мне нужно применить функцию сжатия, которая означает, что мне нужно сделать мягкие звуки громче, а громкие звуки мягче.

Я начал писать функцию, которая принимает байтовый массив (данных wav в 16-битном формате) и хотел циклически проходить по нему и соответствующим образом корректировать значения семплов, чтобы выполнить сжатие, но я борюсь с этим:

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 голосов
/ 23 января 2012

Как уже отмечалось в его комментариях sblom , динамический диапазон не влияет на хэширование в частотной области.Согласно вашей информации, я бы подумал, что не хватает некоторых частот между вашими входами.Обратите внимание, что MP3 имеет психоакустическую модель звука, основанную на человеческом восприятии.Он точно сбрасывает или маскирует некоторые частоты.Таким образом, ваш радиоисточник может содержать или не иметь некоторых важных частот для правильного распознавания ваших входов.

0 голосов
/ 22 января 2012

Есть тонна важного фона, чтобы понять это правильно.То, что вы конкретно пытаетесь сделать, называется Сжатие динамического диапазона .

Я думаю, вам нужно измерить среднюю амплитуду по сегменту сэмплов (возможно, используя Среднеквадратичный квадрат ).А затем разделите все выборки в этом сегменте на среднюю среднеквадратичную амплитуду.Это приведет к одинаковой среднеквадратичной амплитуде для всей песни.

Вам придется поэкспериментировать с правильной длиной для каждого сегмента.Вероятно, если это будет 10-40 мс, оно будет достаточно коротким, чтобы изменения громкости не звучали слишком громко и достаточно долго, чтобы получить хорошее среднеквадратичное измерение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...