比较两个字节数组并获得Java中的百分比?

问题描述 投票:-1回答:3

我们想用Java编程语言创建一个系统来比较两个音频文件并获得比较的百分比。这些文件被转换为指纹作为字节数组。

任何人都可以帮我提供一个比较两个字节数组的解决方案,并获得相似度百分比?

java arrays compare bytearray
3个回答
2
投票
/** Returns percentage (0.0-100.0) of not matching bytes. If arrays are not of equal length, nonexisting bytes in the smaller array will be treated as not matching. */
public double compareByteArrays(byte[] a, byte[] b) {
  int n = Math.min(a.length, b.length), nLarge = Math.max(a.length, b.length);
  int unequalCount = nLarge - n;
  for (int i=0; i<n; i++) 
    if (a[i] != b[i]) unequalCount++;
  return unequalCount * 100.0 / nLarge;
}

这实际上只是比较字节本身(如标题中所要求的)。您还可以在两个向量之间进行某种距离(特征空间中的距离)。或者你可以在google scholar上找到其他一百万件事中的一件......

编辑:您告诉我们您使用musicg-api,因此您可以比较不同的Waves:

String track1 = "track1.wav", track2 = "track2.wav";
Wave wave1 = new Wave(track1), wave2 = new Wave(track2);

FingerprintSimilarity similarity;

// compare fingerprints:
similarity = wave1.getFingerprintSimilarity(wave2);
System.out.println("clip is found at "
                + similarity.getsetMostSimilarTimePosition() + "s in "
                + song1+" with similarity " + similarity.getSimilarity());

2
投票

使用musicg API。您必须使用Wave对象,而不是他们的指纹,但如果您可以生成指纹,您可以轻松获得Wave对象。

Wave waveA = ...
Wave waveB = ...
FingerprintSimilarity similarity;
similarity = waveA.getFingerprintSimilarity(waveB);
float result = similarity.getSimilarity();

result是浮动的相似性。乘以100得到一个百分比


0
投票

啊哈!我找到了通过指纹比较两个波形文件的功能。执行该工作的musicg-api函数是= FingerprintSimilarityComputer

这是我的C#代码,但你也得到了JAVA的想法:

public static int MatchFingerPrint(Byte[] SuspectFingerPrint, Byte[] SampleFingerPrint)
        {

            FingerprintSimilarityComputer fpComputer = new FingerprintSimilarityComputer(SuspectFingerPrint, SampleFingerPrint);
            FingerprintSimilarity fpmSimilarity = fpComputer.getFingerprintsSimilarity();
            return (int)(fpmSimilarity.getScore()*100.0f);
        }
© www.soinside.com 2019 - 2024. All rights reserved.