はてブロ3記事目にして、MATLABに手を出してしまった筆者について。
おはこんばんちは。
筆者は1記事目で取り上げたとおり、GNUのRを使っていつも統計処理等を行っていました。
大学の学部向けの授業でもこれを利用していることもあって修士の間はRのみでがんばっていくつもりでした・・・。
しかし、大学の教授や他の学生等はMATLABを使っており、他の人からもらうスクリプトはMATLAB用のものばかりでした。
筆者も、学部時代はRではなくMATLABと互換の高いGNUのoctaveという言語を利用していたので敷居も低く、今回導入しました。
(本当は無料のソフトウェアだけで研究をすることを目標にしていましたが、断念。)
さて、音を扱う研究を行っているので、オーディオ用の関数をよく使っています。
オーディオ用の関数で一番最初に使う関数として、wavread/wavwriteと言うものがあります。
これらはoctaveでも使える関数なのですが、MATLABでは色々な形式のオーディオファイルに対応するためにこの関数のサポートが終了し、新しい関数に置き換わっています。
(既に私が使っているR2015b版ではこれらの関数が入ったプログラムは動きません。)
と言うわけで、今回はaudioread/audioinfo/audiowriteについて解説します。
今までは、音声ファイル(WAVEファイル)を読み込むときは、以下のようなコードで読み込ませていました。
[x,fs,nbits] = wavread('hogehoge.wav');
しかし、僕の持っているR2015b版では以下のものを返してきます。
>> [x, fs, nbits] = wavread('hogehoge.wav'); Error using wavread (line 1) WAVREAD will be removed in a future release. Use AUDIOREAD instead.
will be removedと書いてありますが、R2014a版のときにWarmとなっていた扱いがR2015b版ではErrorsになっています。
リリース ノート: MATLAB - MATLAB & Simulink - MathWorks 日本
そして、ワークスペースには何も格納されないままです。wavreadも同様に使用できなくなっています。
そこで、代用する関数としてaudioreadを用いましょう。
[y,Fs] = audioread(filename)
audioreadの基本的な使い方はこうです。この時点で勘の良い方はある事に気付いているかと思います。
...そう!左辺にビット数がありません。
audioreadでは、各サンプルの値とサンプルレートのみが出るようになっており、ビット数はaudioinfoという別の関数を使わなければいけません。
info = audioinfo(filename)
infoの中身には以下のものが格納されます。
- Filename:絶対パス(フルパス)での拡張子を含めたファイル名
- CompressionMethod:圧縮方式。audioread等では、.wavの他に.ogg, .frac, .au, .mp3, .m4a, .mp4が読め、.mp4では動画付きのものからも音声を抽出できます。
- NumChannels:チャンネル数を表します。
- SampleRate:サンプルレートを表します。
- TotalSamples:オーディオの長さをサンプルで表します。
- Duration:オーディオの長さを秒で表します。
- BitsPerSample:ビット数を表します。
- Title:タイトルです。
- Artist:アーティストです。
- Comment:コメントです。
なので、先ほどのaudioreadに続けて
info = audioinfo('hogehoge.wav'); nbits = info.BitPerSample
という2行を追加することになります。大変です(笑)。
せっかくこの関数を使うので、TotalSamples等を有効活用出来ると良いかも知れませんね。
さて、今度はaudiowriteです。
今まで使っていたwavwriteと比較して見てみましょう。
wavwrite(y,Fs,N,filename) audiowrite(filename,y,Fs,Name,Value)
引数の順序に違いがあります。気をつけて下さい。
またもう一つ。こちらもビット数を引数として用意していません。
なので、Name,Value部にビット数を指定してあげなければいけません。
よって
audiowrite('hogehoge.wav', y, fs, BitsPerSample, nbits)
となります。
audioinfoの時に取得できる情報は書き込みの時にも使えます。
と言うわけで、audioread/audioinfo/audiowriteの使い方でした。