將研究的內容,實作到C code後,發覺encoder energy ratio一直不符合理論推導,所以重新檢查,也幾乎重寫之後,發覺一個很奇怪的問題。
依據公式推導,Rho = ((LRAbs^2 + 1) / LRAbs^2)^0.5
※寫法一:
LRAbs[j] += pow(LRReal[j] * LRReal[j] + LRImag[j] * LRImag[j],0.5); //計算LR訊號的能量
LRAbs[j] += 10e-16; //加入一個很小的數值至LRAbs,原因為避免以後使用時在除數=0
Rho[j] = pow((LRAbs[j] * LRAbs[j] + 1) / (LRAbs[j] * LRAbs[j]), 0.5); //變數Rho由這樣計算出來
這樣算出的Rho,讓downmix signal有聲音
※寫法二:
LRAbs[j] += pow(LRReal[j] * LRReal[j] + LRImag[j] * LRImag[j],0.5); //計算LR訊號的能量
Rho[j] = pow(((LRAbs[j]+10e-16) * (LRAbs[j]+10e-16) + 1) / ((LRAbs[j]+10e-16) * (LRAbs[j] + 10e-16)), 0.5); //同寫法一,差別在運算Rho時才加很小的數值到LRAbs
這樣算出來的Rho,讓downmix signal沒聲音
※寫法三:
LRAbs[j] += pow(LRReal[j] * LRReal[j] + LRImag[j] * LRImag[j],0.5); //計算LR訊號的能量
Rho[j] = pow((LRAbs[j] * LRAbs[j] + 1) / (LRAbs[j] * LRAbs[j] + 10e-16), 0.5); //僅在除數加入很小的數值,以免除以0的狀態
這樣算出來的Rho,讓downmix signal沒聲音
真正的寫法,應該是寫法三,但居然沒聲音。且寫法二和一,理論上是要相同的,為什麼也會有不同的結果?這讓我真的很困惑...

你是在什麼平台上run這個段code的?用什麼compiler呢? 如果變數型態是double的話,要看你的儲存的value的scale, 我覺得可能是精確度的問題 如果你 LRAbs的值是遠大於1e-16的話,就算你加上1e-16,也可能在轉成IEEE754 double格式的時候被忽略掉。
喔喔!抱歉今晚先忙老師要求別的東西,所以到現在才回。 平台:windows compiler:VS2008 方法一: LRAbs = 0.000000 Rho = 1000000000000000 方法二: LRAbs = 0.000000 Rho = 1000000000000000 方法三: LRAbs = 0.000000 Rho = 31622776.601684 其實我會加1e-16,純屬為了不讓除數為0。但被忽略...會喔?! 但我怎麼想又覺得這個問題,好像不是我寫的那麼單純,我再重看code一下。 謝謝你的回覆,有問題我在bbs發mail跟你討論好了!哈哈~