2014-01-17 34 views
-1

確定,所以基本上,我在執行下面的算法:譜圖 - 計算是錯誤的

1)切片與128

2的重疊大小256的信號)乘以每個塊與海寧窗

3)獲取DFT

4)計算值ABS sqrt(re*re+im*im)

PL奧廷這些值,爲imshow我得到以下結果:

enter image description here

這看起來不錯,它清楚地顯示出一定的差異,即在信號具有最振幅節目秒殺。然而,在Python我得到這樣的結果:

enter image description here

我知道我在做正確的事情,但是,也做錯了什麼。我似乎無法找出哪些因素使我不認爲自己做得正確。

任何粗略的想法,我可能會在這裏出錯?我的意思是,在這裏繪製abs價值是否正確?

enter image description here

感謝

編輯:夾緊後

結果..

enter image description here

UPDATE:

代碼:

for(unsigned j=0; (j < stft_temp[i].size()/2); j++) 
    { 
     double v = 10 * log10(stft_temp[i][j].re * stft_temp[i][j].re + stft_temp[i][j].im * stft_temp[i][j].im); 

     double pixe = 1.5 * (v + 100); 

     STFT[i][j] = (int) pixe; 
    } 
+0

通常你會轉換爲對數幅度(即dB)而不是線性幅度,所以它會像'10 * log10(re * re + im * im)'。 –

+0

@PaulR請使用您建議的公式查看我的更新後的帖子。它看起來不正確。有很多負值,並且Y軸也是錯誤的。繪製頻率(maxBin_index * Fs/size)通過信號給出相同的結果。有什麼建議麼?將不勝感激。 – Phorce

+0

您可能需要對這些值進行偏移/縮放以使其看起來合理 - dB值可能介於-100到+20之間,並且您可能需要顏色或強度值從0到255,因此您需要偏移和相應地縮放(也可以限制最大/最小值)。 –

回答

0

通常,您可能需要使用對數幅度,然後縮放到所需的範圍,通常爲0到255。在僞代碼中:

mag_dB = 10 * log10(re * re + im * im);  // get log magnitude (dB) 

pixel_intensity = 1.5 * (mag_dB + 100);  // offset and scale 

pixel_intensity = min(pixel_intensity, 255); // clamp to 0..255 
pixel_intensity = max(pixel_intensity, 0); 
+0

沒有變化。請看我更新的帖子 – Phorce

+0

我不明白你的意思是'pixel_intensity = min(pixel_intensity,255)'這是一個循環嗎? – Phorce

+0

不,它將最大值限制爲255. –