[英]Compare Two Byte Arrays & Get The Percentage in Java?
我們想用Java編程語言創建一個系統來比較兩個音頻文件並獲得比較的百分比。 文件將被轉換為字節數組的指紋。
誰能幫助我提供一種解決方案,比較兩個字節數組並以百分比形式獲得相似性?
使用musicg API。 您必須使用Wave
對象,而不是它們的指紋,但是如果可以生成指紋,則可以輕松獲得Wave
對象。
Wave waveA = ...
Wave waveB = ...
FingerprintSimilarity similarity;
similarity = waveA.getFingerprintSimilarity(waveB);
float result = similarity.getSimilarity();
result
是作為浮點數的相似性。 乘以100得到一個百分比
/** 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學術搜索中找到...
編輯:您告訴我們您使用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());
啊哈! 我發現了通過指紋比較兩個波形文件的功能。 做這項工作的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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.