У меня есть (в основном) рабочая программа для сравнения двух файлов wav, чтобы увидеть, находится ли меньший в большем. Это сделано в Java.
Я делаю это, сначала убедившись, что оба wav-файла представлены в каноническом волновом формате. Затем я получаю из них байтовый массив данных, используя AudioInputStream. Я вынимаю данные порциями с определенной частотой кадров (например, прямо сейчас: 4096 байт). Я беру первый блок меньшего ввода и прохожу фрагменты того же размера на большом входе.
Я беру эти куски и создаю двойные массивы с одинаковыми данными. Я получаю их БПФ и использую функцию корреляции, чтобы найти пик в результирующем массиве коэффициентов корреляции. Затем я перехожу к следующему фрагменту меньшего входа и вижу, появляется ли аналогичный пик.
Это работает, пики очевидны, когда файлы одинаковы, и в большинстве случаев результаты верны. Я не получаю ложных срабатываний. Я, однако, получаю ложные негативы.
Это потому, что я не уверен, как "выровнять" данные. Меньший файл может прийти из любой точки большего файла. В большинстве случаев это происходит с помощью метода чанкинга, который я делаю. Но иногда, это как если бы файлы отличались, и пик не был найден, хотя файлы должны возвращать высокую корреляцию.
Если я возьму один из файлов, которые являются ложноотрицательными (без пика), и немного подправлю их, отбросив в конце или начале их несколько тысяч байт, и снова запущу программу, она внезапно найдет пик, и это очень четкое совпадение. Таким образом, он работает, просто как-то не находит вершины, где корреляция очевидна. Имеющаяся у меня корреляционная функция переводит БПФ так, чтобы они соответствовали, поэтому я думаю, что это будет охватывать все, но, очевидно, я не охватываю все данные.
Я не уверен, как «выровнять» кусок меньшего файла по месту его появления в большем файле, чтобы функция корреляции определяла, где происходит корреляция. Все работает, мне просто нужно устранить ложные негативы. Любой совет?