我想用AForge 2.2.5
來計算2個聲音樣本的相關係數。計算FFT相關係數
我讀過here計算互相關的公式。
And here我讀過關於計算相關係數的公式。
這是我目前所擁有的:
在調用CrossCorrelation()之前,已經執行了FFT。
static Complex[] CrossCorrelation(Complex[] ffta, Complex[] fftb)
{
var conj = ffta.Select(i => new Complex(i.Re, -i.Im)).ToArray();
for (int a = 0; a < conj.Length; a++)
conj[a] = Complex.Multiply(conj[a], fftb[a]);
FourierTransform.FFT(conj, FourierTransform.Direction.Backward);
return conj;
}
static double CorrelationCoefficient(Complex[] ffta, Complex[] fftb)
{
var correlation = CrossCorrelation(ffta, fftb);
var a = CrossCorrelation(ffta, ffta);
var b = CrossCorrelation(fftb, fftb);
// Not sure if this part is correct..
var numerator = correlation.Select(i => i.SquaredMagnitude).Max();
var denominatora = a.Select(i => i.Magnitude).Max();
var denominatorb = b.Select(i => i.Magnitude).Max();
return numerator/(denominatora * denominatorb);
}
我不知道這是實現該功能的正確方法(或處理數據),因爲我很新的DSP。如果有人能指出我正確的方向,將非常感激。
你用測試數據試試嗎?它是否會返回預期的結果?爲每個通過特定輸入的函數編寫一些單元測試,並將實際結果與期望值進行比較。你*不需要傳遞一個完整的聲音文件,只需創建一些你可以手動計算的小數組(或使用其他程序) –
我同意Panagiotis Kanavos。例如,你知道兩個相同信號之間的相關性會使你的相關性爲1. –
我認爲在返回結果之前需要一個根平方(在第二個鏈接公式中給出),這裏你有平方係數 –