1日目(5,6時限) MATLABの使い方と音入門

今回学ぶ事項


目次

  1. 演習を始める前に
  2. MATLABの使い方
    1. MATLABの起動
    2. セミコロンと表示
    3. Mファイル
    4. サブルーチン
    5. 行列用の演算子
    6. 参考
  3. 音入門
    1. 音の種類
    2. 純音の作成
    3. 純音の周波数を変える
    4. 複合音の作成
  4. 音の録音・再生
    1. 音のファイルフォーマット
    2. 音の録音・再生・保存
    3. 音の分析
    4. 課題1−1

 



1 演習を始める前に

**********************************************************************

音 (信号処理) ---  聴覚 = 人間 (心理学)  

**********************************************************************

人間の聴覚の特性を調べ機械に応用すると、人間が使い易くなったりコストを
下げることが出来たりといったメリットがあります(前ページ参照)。

音を信号として扱う学問が信号処理です。この演習では、信号処理のさわりを勉強します。
更に、聴覚心理の実験では、データ解析を行なう必要があります。解析のために
統計処理を行なうので、初歩的な統計についても勉強します。

 

この演習では、音の信号処理を行なうためにツールとしてMATLABを使います。
第1回では、MATLABを使える様になりましょう。また、音を数式で扱えることを
学び、自分で音を作ってみましょう。



2 MATLABの使い方

2.a MATLABの起動

ここではMATLABの起動方法とヘルプの使い方を覚えましょう。

操作手順

  1. MATLABのアイコンをダブルクリックします。
    コマンド入力画面が起動されます。
  2. ヘルプ画面を出してみましょう。

    > helpwin

    とコマンド画面で入力して下さい。ヘルプのウインドウが立ち上がります。
  3. まず今日の日付を出すコマンドを入力してみましょう。

    > date

    ここで、リターンキーを押すと、次の様な答えが返ってきます。

    ans =

    13-Apr-2001

  4. dateコマンドのヘルプを見たい時は、幾つか方法がありますが、
    2つの方法を挙げておきます。
    1. コマンド入力画面でhelpコマンドを使う。

      > help date
    2. ヘルプウインドウで検索を行う。

*********************************************************************

ワンポイント(再入力): 
もう一度前と同じコマンドを入力したいときは、
               ↑(上矢印キー)を押して下さい。前のコマンドが
               現れます。連続して↑キーを押すと、入力した
               コマンドの履歴がたどれます。

> ↑
> help date
> ↑
>
date
> ↑
>
helpdesk

*********************************************************************


2.b セミコロンと表示

MATLABでは、コマンドの最後にセミコロンを付けるか否かが重要です。
セミコロンはコマンド画面への出力を出さないようにしたり、命令を区切る
機能を持ちます。

操作手順

  1. セミコロンを付けたもの、付けないものを試してみる。

    > date
    ans =
    07-Apr-2001

    > date;


  2. セミコロンを付けると何も出力が返ってこないことが分かります。
    しかし、多くのコマンドは、実行結果を変数として返すので、下記の様に
    して実行内容を確かめることが出来ます。

    > res=date;
    > res

    res =
    07-Apr-2001

  3. セミコロンなしで表示しなくても、disp関数やfprintf関数を
    用いて文字列を表示することが出来ます。

    > disp(res);
    07-Apr-2001


    > fprintf('%s\n',res);
    07-Apr-2001

  4. 表示関数は、文字列でなく整数・実数などの変数を表示する時はコツが
    必要です。詳しくはヘルプを参照して下さい。


    > res2=12;
    > res3=12.3456789;
    >
    >disp(int2str(res2));
    <---注:int2strは整数から文字列への変換
    12
    >disp(num2str(res3));
    <---注:num2strは実数から文字列への変換
    12.3457 
    > fprintf('%d\n',res2); <---注:\nは改行マーク
    12
    > fprintf('%f\n',res3);
    12.345679




2.c Mファイル

MATLABでは、コマンド入力画面以外にも、ファイルにコマンド群を書いておいて
実行することが出来ます。この実行ファイルは、Mファイルといい、
拡張子は必ず
.m にします

操作手順

  1. コマンド画面で edit と打ち、エディタを起動します。

    > edit
  2. エディタに実行コマンドを記入します。コメントには、% 記号を用います。また、
    改行しても続けたいときには、行の最後に3個のピリオド
    ... を付けます。

    %
    %  test1.m
    %    by s025000
    %    4/13/2001
    %


    mon=4;
    day=13;

    fprintf('Month is %d, Day is %d\n',mon,day);



  3. 保存コマンド('アップル'+'S' キー)を押し、ファイル名を訊かれるので、
    test1 と入力します。これでtest1.m というファイルが出来たはずです。

    注:上書きしますか?と訊いてくる場合は、前の人がtest1.mを作成していたの
      でしょう。前の人が保存していると仮定して、上書きしてください。
  4. 再びMATLABのコマンド画面に戻り、test1という作成したコマンドを入力します。
    お分かりでしょうか。Mファイルは、
    拡張子を除いたファイル名がそのままコマンド
    名になるのです。便利でしょう。

    > test1
    Month is 4, Day is 13


2.d サブルーチン

functionコマンドを用いて、Mファイルの中でサブルーチンを定義することが
出来ます。returnコマンドでfunctionの効果は終わりです。

操作手順

  1. test1を起動した後で、メモリに読み込まれている変数を見てみましょう。
    コマンド who を使って下さい。

    > who
    >
    Your variables are:
    day mon
    >
    >

  2. この様に、test1で定義した変数 day やmon が残っています。
    いままでの変数を全て消すには clear all コマンドを使います。
    これでwhoと打っても何も応答が無いはずです。

    > clear all;
    > who

  3. Mファイルはサブルーチンとして他の関数中で引用することができます。
    他から引用するときにメモリに変数が残っていると、変数名の重複などで
    初期値が設定されてしまう等、正しい結果が得られない場合があります。

    これを防ぐために、コマンドfunctionを用います。
    functionはサブルーチンを定義するコマンドです。returnで終了すると、
    サブルーチン内で定義される全変数のメモリが解放されます。

    次の内容を書いた、test2.mというMファイルを作成してください。

    function test2
    %
    %  test2.m
    %    by s025000
    %    4/13/2001
    %

    mon=4;
    day=13;

    fprintf('Month is %d, Day is %d\n',mon,day);

    return

  4. test1 と異なるのはfunction と return だけです。実行して who で変数を
    みて下さい。メモリに残っている変数はありませんね。

    > test2
    > who

  5. functionは引数を渡す機能があります。下記のコードをtest3.mとして
    保存してください。

    function test3(mon,day)
    %
    %  test3.m
    %    by s045000
    %    4/13/2001
    %

    fprintf('Month is %d, Day is %d\n',mon,day);

    return

  6. test3を実行するときに、月と日を引数として値を入力して下さい。test2と
    結果が同じになることを確かめて下さい。

    test3(4,13);


 


2.e 行列用の演算子

  MATLABは、配列や行列の演算が得意です。変数は、行列データと
して定義することが出来ます。


  変数が行列の場合に、乗算除算などの演算子が少し代わります。
次の演算子の使い方を覚えてください。

> a=100;
> b=3;
> c=[100,200,300 ];
> d=[1,2,3];
>
> e=a * b
> f=c .* d
>
>


MATLABの変数は特に指示しない限り行列や配列になります。したがって演算は
行列の演算になります。ただし、計算上、行列の要素同士の掛け算をしたいとき
があります。そのための特別な書き方がピリオドです。演算記号の前にピリオドを
おけば、行列の要素の演算となります。


2.f 参考 

更にMATLABについて勉強したい人のために、次のページを挙げておきます。



3 音入門


3.a 音の種類

音は、物理的に見て、次の2つの種類に分けることが出来ます。

  1. 周期信号 ------純音, 複合音
  2. 非周期信号

純音とは、単一の周波数から成る音で、サイン関数などを用いて
簡単に音を作成することが出来ます。複合音は、純音の組み合わせで
作ることが出来る音を指します。非周期信号の代表としては、雑音があります。
雑音の例として、夜間テレビ番組が終わった時にきこえる音を想像して下さい。

ではまず、純音と複合音を自分で作って聴いてみましょう。


3.b 純音の作成

 ここでは、サイン関数を使って純音を作って音を聴いてみましょう。
純音の例は、"昔の"携帯電話の着メロ(注:和音ですらない)の音や、
プッシュホン電話のボタンを押したときの音です。

操作手順

  1. 標本化周波数(1秒間に何個データを作るか)を決めます。ここでは、
    CDで採用されている標本化周波数、44100Hz(=44.1kHz)とします。

    > fs=44100;

  2. 時間軸データを作成します。0秒から1秒まで1/44100刻みでデータを作成します。

    > t=[0:1/fs:1];
  3. 純音の周波数を決めます。ここでは、1000Hzとします。

    > f=1000;
  4. サイン関数を使って純音データを作ります。piはMATLABであらかじめ
    定義されている変数で、円周率πのことです。値3.1415...が入っています。

    > y= sin( 2*pi*f*t );
  5. これで変数 y に純音データが入りました。soundscコマンドで音を聴いて
    きちんと出来ているかチェックしてみましょう。

    > soundsc(y,fs);
    >
  6. またグラフで波形をチェックしてみましょう。

    > plot(t,y);
  7. 1000Hzなので、時間軸が0から1秒目までだと 波形が細かすぎて様子が
    わかりません。次の様に軸の範囲指定コマンドaxisを使ってみて下さい。

    > plot(t,y);
    > axis([0 0.01 -1 1]);
    >

    0秒 から 0.01秒までが表示されますので、波形の様子が分かります。


3.c 純音の周波数を変える

  では、純音の周波数を変えて遊んでみましょう。

操作手順

  1. edit で 次のコードを作成する。名前はsinwave.m にして下さい。

    function sinwave(freq)

    fs=44100;
    t=[0:1/fs:1];

    y= sin( 2*pi*freq*t );
    soundsc(y,fs);

    return

  2. コマンド画面で作成したsinwave関数の引数を色々変えて実行
    してみてください。

    > sinwave(1000);   % 1000Hz
    > sinwave(500);    % 500Hz
    > sinwave(50);     % 50Hz

ポイント1人間に聴こえる周波数は、約20Hz--20000Hzです。20kHz以上
の人間の耳が捉えることの出来ない音は、超音波と呼ばれています。人間
には超音波はきこえませんが、コウモリはある帯域の超音波を用いて障害物
の位置を検知します。

超音波を出して聴いてみたいでしょうが、残念ながら現在市販のPCの
音再生デバイスでは、超音波のような高い周波数の音を再生する機能が
ついていません。

ポイント2年を取ると高い周波数の音が聞き取りにくくなり、特に8kHz以上
で耳年齢が出ます。

ポイント3パソコンの場合はスピーカの性能が 悪いので、単に高い音が
出ていない(注:低い音も)場合があります。本当に高い音が聞こえないか
どうかは、まずスピーカ出力も疑ってから結論を出して下さい。


3.d 複合音の作成

では、簡単な複合音を作成してみましょう。
操作手順

  1. edit で 次のコードを作成する。名前はcomwave.m にして下さい。

    function comwave(freq1,freq2,a1,a2)

    fs=44100;
    t=[0:1/fs:1];

    y1= sin( 2*pi*freq1*t );
    y2= cos( 2*pi*freq2*t );

    y3= (a1*y1) .* (a2*y2);

    soundsc(y3,fs);
    plot(t,y3);

    return



  2. 色々引数を変えて遊んでみましょう。

    > comwave(1000,5,1,1);
  3. 河原先生の音のデザインの「音の数理」の項目に色々なMATLABで作成した音が
    載っています。この音の数理の「時間構造と音色」に載っている音を作ってみましょう。


    edit で 次のコードを作成する。名前はcomwave2.m にして下さい。

    function comwave2(freq1,a1)

    fs=44100;
    t=[0:1/fs:1];

    y1= sin( 2*pi*freq1*t );

    y2= exp(-a1*t) .* y1;

    soundsc(y2,fs);
    plot(t,y2);

    return



    引数を色々変えて音の変化を見てください。

    > comwave2(1000,6);

4.音の録音・再生・分析

4.a 音のファイルフォーマット

 先ほどは、windowsでよく用いられるwavというファイルフォーマット
でデータを保存してもらいました。音のファイルには他にも色々な
ファイルフォーマットがあります。代表的なフォーマットを以下に記します。

フォーマット 主なプラットホーム(和大) 特徴
.wav microsoft windows 非圧縮 PCM, Microsoft ADPCM
.aiff , .aif apple mac, sgi O2 非圧縮 PCM
.aifc apple mac, sgi O2 .aiffのデータを圧縮したもの
.au sun java 非圧縮 PCM,  A-law・u-law圧縮

MATLABでは、デフォールトで wavread(wavファイルから音データの読み出し) 
や wavwrite(音データのwavファイルへの書き出し) 関数が用意されています
ので、この演習では音ファイルはwavファイルで取り扱うことにします。


4.b 音の録音・再生・保存

次に自分の声を録音して聴いてみましょう。

  1. MACの音入力部を「サウンド入力」か「内蔵マイク(iMac)」に切り替える。変更は赤丸の
    アイコンをクリックすると出来ます。
    
    
  2. 3秒間マイクからの音を録音するには、次をコマンド画面に入力します。
    
    >[y,fs]=recordsound(3);
    >
    
    リターンキーを押してから3秒間録音されます。
    ここでyに音データが、fsに標本化周波数が入ります(fs=44100Hz になる)。
  3. まず、データを目で見てみましょう。
    
    > plot(y);
    > 
  4. 次に音を再生してきちんと収録されたか確かめてみましょう。
    
    >soundsc(y,fs);% 
    >
    
    注: MATLABで音を出すには、ファイルからデータを読み込んで、
    sound か soundsc のコマンドを使います。今のところ、soundscコマンドを用いて下さい。
  5. 折角収録した音ですから、ファイルに保存しましょう。4.aで説明した通り、
    wavファイルフォーマットで保存しましょう。
    
    > wavwrite(y,fs,16,'voice.wav');
    
    ここでは、voice.wavというファイル名で保存していますが、自分の好きな名前でも構いません。
    

4.c 音の分析

 リアルタイムで音の分析をしてくれる、scopes7 を使って自分の声を
分析してみましょう。操作方法、画面の説明、分析の順で説明していきます。

操作方法

  1. MACの音入力部を「サウンド入力」か「内蔵マイク(iMac)」に切り替える。変更は赤丸の
    アイコンをクリックすると出来ます。


  2. MATLABのコマンド画面でまず変数などをクリアする。

    > clear all;   % 変数クリア
    > close all;  % 画像画面をクローズ
    >

  3. 次のコマンドを入力すると処理が開始する。

    > scopes7 initialize
    > scopes7 go


  4. scopes7 を止めるには、Ctrl-C( Ctrlキーを押しながらc )を押す。

 

画面の説明

  scopes7の画面は以下の様になっています。

スペクトログラムとは、周波数振幅の強さを色で表した図です。青色ほど
振幅値が小さく、赤色になるほど振幅値が大きいことを表します。
スペクトログラムのグラフ(図2)を見て下さい。これは、/a/と10秒ほど2回
発声したグラフです。
 図2

始めの2−18フレームの辺りに出ているのが、普通の声の高さで発声した
分です。振幅値が強い場所(赤色)が等間隔で出ていることが分かります。
これは、母音で特徴的に現れるもので、ある周波数の整数倍で振幅値が大きく
なり声の高さに関係することが知られています。この現象をピッチと呼び、最小
(1倍目)の周波数を基本周波数(F0)と呼びます。

では普通の声の高さのF0を求めてみましょう。赤い帯をF0から数えて4番目(第4
高調波と呼ぶ)は、およそ1000Hzの辺りにあります。1000Hzを4で割ると、250Hzです。
つまり、この人の普通の声のF0は約 250Hzであることが分かります。

一般にF0は、成人男性で約100--150Hz, 成人女性で約250--300Hzであることが
知られています。

ところで、後続の20--40フレームで発声した/ a /は、裏声を使って一番高い声で
収録したものです。(図3参照) この時の声のF0は何Hzでしょう? 1000Hz付近が
第2高調波なので、もうお分かりですね。普通の声の時の周波数に比べてかなり
大きな値ですね。

では、課題で自分のF0を調べてみましょう。

 図3


4.d 課題1-1

 scopes7で以下の自分の声の基本周波数を求め、何Hzかを答えなさい。
 答えは送信ボタンを押すと、wwwページに記入されます。

  1. 自分の平均的な声の高さのF0 
  2. 自分が出せる一番高い声の高さ(裏声)のF0

大きな声を出して計測してみましょう。