7-9 How to Increase Pitch Resolution (悛R蛌)

另一個常碰到的問題,是音高解析度的問題。通常一個半音差等於 100 個「音分」(Cents),若希望能得到高解析度的音高,我們可以調高取樣頻率以增加音訊在時域的解析度,這也會使 ACF 或是 AMDF 的解析度隨之提高,進而提高音高的解析度。從數學上來說,音高和基本頻率的關係如下:
p = 69 + 12*log2(f/440) = 69 + 12*log2((fs/L)/440)
其中 L 是基本週期的點數。當 L 增加 1 時,音高的改變量可以表示如下:
DP = (69 + 12*log2((fs/L)/440)) - (69 + 12*log2((fs/(L+1))/440)) = -12*log2(1+1/L) = -12*log2(1+f/fs)
其中 f 是基本頻率,fs 則是取樣頻率,DP 隨 fs 的變化情況可以使用下列範例來畫圖說明:

Example 1: pitchResolution01.m% Pitch resolution w.r.t. sampling rate and pitch fs=linspace(4000, 44100, 20)'; pitch=12*(1:7); deltaP=[]; for i=1:length(pitch) f=440*2^((pitch(i)-69)/12); deltaP=[deltaP, 12*log2(1+f./fs)]; end plot(fs, 100*deltaP, '.-'); axis tight; grid on xlabel('Samplinte rate (Hz)'); ylabel('\Delta p (Cents)'); title('\Delta p (Pitch resolution) w.r.t. fs and pitch'); % Display legends pitchStr={}; for i=1:length(pitch) pitchStr={pitchStr{:}, ['pitch = ', int2str(pitch(i))]}; end legend(pitchStr);

由以上圖形可以看出,當取樣頻率降低時,或是基本頻率提高時,音高的誤差就會變大(解析度降低)。通常基本頻率不是我們所能控制的,因此若要提高音高的解析度,對於在時域上的音高追蹤方法,我們可以提高取樣頻率,或是對聲波(或是 ACF、AMDF)進行向上取樣(Up Sampling)或是內差(Interpolation)。

同理,若要提高音高的解析度,對於在頻域上的音高追蹤方法,我們可以直接在每個音框進行補零(Zero Padding),此時在頻譜的解析度就會提高,所計算出來的音高解析度也就跟著提高了。


Audio Signal Processing and Recognition (音訊處理與辨識)