「音高」(Pitch)是另一個音訊裡面很重要的特徵,直覺地說,音高代表聲音頻率的高低,而此頻率指的是「基本頻率」(Fundamental Frequency),也就是「基本週期」(Fundamental Period)的倒數。
若直接觀察音訊的波形,只要聲音穩定,我們並不難直接看到基本週期的存在,以一個 3 秒的音叉聲音來說,我們可以取一個 256 點的音框,將此音框畫出來後,就可以很明顯地看到基本週期,請見下列範例:
範例 1輸入:
close all
waveFile='soundFork.wav';
[y, fs, nbits]=wavread(waveFile);
index1=11000;
frameSize=226;
index2=index1+frameSize-1;
segment=y(index1:index2);
subplot(2,1,1);
plot(y); grid on
title(waveFile);
set(gca, 'xlim', [0, length(y)]);
limit=axis;
line(index1*[1 1], limit(3:4), 'color', 'r');
line(index2*[1 1], limit(3:4), 'color', 'r');
subplot(2,1,2);
plot(segment, '.-');
set(gca, 'xlim', [1, index2-index1+1]);
point=[7, 189];
line(point, segment(point), 'marker', 'o', 'color', 'red');
periodCount=5;
fp=((point(2)-point(1))/periodCount)/fs;
ff=fs/((point(2)-point(1))/periodCount);
pitch=69+12*log2(ff/440);
fprintf('Fundamental period = %g second\n', fp);
fprintf('Fundamental frequency = %g Hertz\n', ff);
fprintf('Pitch = %g semitone\n', pitch);
輸出訊息:
Fundamental period = 0.002275 second
Fundamental frequency = 439.56 Hertz
Pitch = 68.9827 semitone
輸出圖形:
INCLUDEPICTURE "mhtml:file://C:\\Documents%20and%20Settings\\zhou\\Desktop\\语音\\1-5%20音高.mht!http://neural.cs.nthu.edu.tw/jang/books/audioSignalProcessing/example/output/pitchSoundFork01.png" \* MERGEFORMATINET
在上述範例中,上圖紅線的位置代表音框的位置,下圖即是 256 點的音框,其中紅線部分包含了 5 個基本週期,總共佔掉了 182 單位點,因此對應的基本頻率是 fs/(182/5) = 16000/(182/5) = 439.56 Hz,相當於 68.9827 半音(Semitone),其中由基本頻率至半音的轉換公式如下:
semitone = 69 + 12*log2(frequency/440)
換句話說,當基本頻率是 440 Hz 時,對應到的半音差是 69,這就是鋼琴的「中央 La」或是「A4」,請見下圖。
提示
一般音叉的震動頻率非常接近 440 Hz,因此我們常用音叉來校正鋼琴的音準。
上z公式所轉換出來的半音差,也是 MIDI 音樂檔案所用的標準。從上述公式也可以看出:
· 每個全音階包含 12 個半音(七個白鍵和五個黑鍵)。
· 每向上相隔一個全音階,頻率會變成兩倍。例如,中央 la 是 440 Hz(69 Semitones),向上平移一個全音階之後,頻率就變成 880 Hz(81 Semitones)。
· 人耳對音高的「線性感覺」是隨著基本頻率的對數值成正比。
音叉的聲音非常乾淨,整個波形非常接近弦波,所以基本週期顯而易見。若以我的聲音「清華大學資訊系」來說,我們可以將「華」的部分放大,也可以明顯地看到基本週期,請見下列範例:
範例 2輸入:
close all
waveFile='清華大學資訊系.wav';
[y, fs, nbits]=wavread(waveFile);
index1=7450;
frameSize=512;
index2=index1+frameSize-1;
segment=y(index1:index2);
subplot(2,1,1);
plot(y); grid on
title(waveFile);
set(gca, 'xlim', [0, length(y)]);
limit=axis;
line(index1*[1 1], limit(3:4), 'color', 'r');
line(index2*[1 1], limit(3:4), 'color', 'r');
subplot(2,1,2);
plot(segment, '.-'); grid on
set(gca, 'xlim', [1, index2-index1+1]);
point=[73, 472];
line(point, segment(point), 'marker', 'o', 'color', 'red');
periodCount=6;
fp=((point(2)-point(1))/periodCount)/fs;
ff=fs/((point(2)-point(1))/periodCount);
pitch=69+12*log2(ff/440);
fprintf('Fundamental period = %g second\n', fp);
fprintf('Fundamental frequency = %g Hertz\n', ff);
fprintf('Pitch = %g semitone\n', pitch);
輸出訊息:
Fundamental period = 0.0083125 second
Fundamental frequency = 120.301 Hertz
Pitch = 46.5497 semitone
輸出圖形:
上列範例的下圖,是從「華」的韻母附近抓出來的 512 點的音框,其中紅線部分包含了 6 個基本週期,總共佔掉了 399 單位點,因此對應的基本頻率是 fs/(399/6) = 8000/(399/6) = 120.301 Hz,相當於 46.5497 半音,與「中央 La」幾乎差了兩個全音階(24個半音)。
使用「觀察法」來算出音高,並不是太難的事,但是若要電腦自動算出音高,就要有點技術了。有關音高追蹤的各種
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,會在後續章節詳細介紹。