2010-10-06 87 views
0

我有兩個G729編碼文件,我把它們的pcm版本。我想測量這兩個文件之間的相似度。這些文件是二進制文件,所以如何測量二進制文件之間的相似性,我在C中編寫了一個代碼,它從第一個文件中獲取模式並在第二個文件中搜索相似的代碼,但是我想要有一個相似性度量。我在文獻中搜索了很多,我發現了jaccard和其他人,但仍然無法確定他們哪一個符合我的情況。 提前感謝您的幫助..測量兩個二進制文件之間的相似性?

+0

http://en.wikipedia.org/wiki/Acoustic_fingerprint – 2010-10-06 15:46:58

+0

你想究竟如何量化'相似'?你想每個樣本有絕對的差異嗎?最小二乘迴歸的R^2值?這兩個文件是什麼? – JoshD 2010-10-06 15:50:33

+0

我想找到一個比率來定義兩個文件相互之間的相似程度......這兩個文件是G729編解碼器的輸出...我們可以從每個文件中取出20個字節的幀並測量這兩個文件之間的相似度字符串和最後的平均值......足夠嗎? – Dobs 2010-10-09 09:43:53

回答

2

由於您提到的文件是音頻文件,最好是根據音頻特徵定義相似性度量,而不是簡單地進行二進制比較。快速搜索提出了一個名爲MusicMiner的研究項目,您可能想要了解進一步的想法。

+0

首先感謝你的回覆...我試圖對純文本級別進行分析......我的意思是在二進制級別..我想比較編碼器的輸出......謝謝 – Dobs 2010-10-09 09:40:13

0

我有同樣的需要,我想出了一個解決方案,在我的情況下工作,但我不能保證這是普遍的:

我把創建的差異文件庫。鑑於fileA和fileB這個庫創建了第三個文件fileDiff,它告訴如何從fileA傳遞到fileB要複製的字節和要添加的字節。 (有關格式的更多信息:http://www.w3.org/TR/NOTE-gdiff-19970901.html

用函數獲得一個百分比。 我知道這不是100%真實的,例如,如果你有fileB等於fileA的一半,這個函數的相似度是100%。

這是DiffWriter實現:

public class Distance implements DiffWriter { 

    private long newData = 0; 
    private long copiedData = 0; 

    @Override 
    public void flush() throws IOException {} 

    @Override 
    public void close() throws IOException {} 

    @Override 
    public void addData(byte arg0) throws IOException { 
     newData++; 
    } 

    @Override 
    public void addCopy(long arg0, int arg1) throws IOException { 
     copiedData += arg1; 
    } 

    public double getSimilarity() { 

     double a = (double) newData; 
     double c = (double) copiedData; 

     return ((c/(c + a)) * 100.0); 

    } 

} 

這是我如何稱呼它:

import com.nothome.delta.Delta; 

    File f1 = new File(...); 
    File f2 = new File(...); 

      Distance dw = new Distance(); 

    try { 
     new Delta().compute(f1, f2, dw); 

     dw.getSimilarity(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
相關問題