目次

Octave

GNU Octave はプログラミング環境。 matlab 互換を目指している(?)ソフトウェア。

Ubuntu Linux で Octave

octave 3.0 の wavread

Ubuntu 9.04 では octave 3.0 が使える。

octave 3.0.0 / 3.0.1 で wavread が wav ファイルを読み込めない(ことがある)。

http://www-old.cae.wisc.edu/pipermail/bug-octave/2009-February/008042.html

Ver 3.2.2 が 22 July 2009 にリリースされている。

3.2.2 を build するのは面倒そうなので、 octave-3.2.2.tar.gz から scripts/audio/wavread.m を取り出して Ubuntu 9.04 の octave 3.0.1 から 呼び出したら一応動いている。

octave-audio パッケージ

wavread と同じ機能の auload が octave-audio パッケージにある。

http://octave.sourceforge.net/audio/overview.html

インストールは sudo aptitude install octave-audio すればよい。

octave-signal パッケージ

matlab の signal processing ツールボックスぽいものが octave-signal パッケージにある。

http://octave.sourceforge.net/signal/overview.html

インストールは sudo aptitude install octave-signal すればよい。

octave-signal を入れると specgram が使える。

[data, fs] = wavread('A01.wav');
specgram(data);

Ubuntu 9.10 および Ubuntu 10.04

パッケージをインストールする際に octave3.0 と octave3.2 を選ぶことができる。

Shellからoctaveを呼び出す

getwavlen.m に function があるとすると

octave -q --eval 'printf("%f", getwavlen("filename.wav"));'

のような感じで呼び出せる。

octave プロセスを起動するオーバヘッドが大きいので、 複数のファイルを処理したいときはバッチ処理の m ファイルを作る方がよさそうだ。

#!/bin/bash
rm -f _do_make_wavlen.m
for i in $( ls out/*.wav ); do
    n=`basename $i .wav`
    echo 'printf("'$n' %f\n", getwavlen("'$i'"));' >> _do_make_wavlen.m
done
octave -q _do_make_wavlen.m > _wavlen.txt

Windows で Octave

情報源 http://www40.atwiki.jp/gnuoctavejp/pages/16.html

インストール:

http://octave.sourceforge.net/

から

Octave-3.2.3-2_i686-pc-mingw32_gcc-4.4.0_setup.exe

をダウンロードして実行。octaveforge のオプションは全部を選択してみた。 (octave-audioやoctave-signalも入った)

コマンドプロンプトで動くアプリケーション。

edit hoge.oct を実行すると notepad++ が開く。

doc spegram などとやると info が動く。

a = -1:0.01:1; plot(a); などとやると gnuplot が動く。

Mac Ports で Octave

since 2012-03-27

macports

sudo port install octave octave-audio octave-signal
$ octave
GNU Octave, version 3.2.4
Copyright (C) 2009 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "i386-apple-darwin10.8.0".

playaudio とか record とか試してみたが /dev/dsp を叩けないというエラー。

/usr/bin/afplay を呼び出すしかなさそう。 http://www.sonasphere.com/blog/?p=40

Octave プログラミング

記号

...  行継続 
()   配列要素のインデックス付け、関数の呼び出し
%    コメント
#    コメント(matlabでは利用できない?)
''   文字列
""   文字列

行列の操作

matlab同じことを試してみる。

> A=magic(4)
A =
 
   16    2    3   13
    5   11   10    8
    9    7    6   12
    4   14   15    1
 
> A(4,2)
ans =  14
> A(1:4,4)
ans =
 
   13
    8
   12
    1
 
> sum(A(1:4,4))
ans =  34

線形インデックスで非連続要素に代入

> B=A
B =
 
   16    2    3   13
    5   11   10    8
    9    7    6   12
    4   14   15    1
 
> B(1:3:16)=-10
B =
 
  -10    2    3  -10
    5   11  -10    8
    9  -10    6   12
  -10   14   15  -10

キーワード end を使う

> B(1:3:end)=-20
B =
 
  -20    2    3  -20
    5   11  -20    8
    9  -20    6   12
  -20   14   15  -20

シングルコロン

行または列のすべての要素を指定する

> A=magic(4)
A =
 
   16    2    3   13
    5   11   10    8
    9    7    6   12
    4   14   15    1
 
> A(:,2)
ans =
 
    2
   11
    7
   14
 
> A(:)
ans =
 
   16
    5
    9
    4
    2
   11
    7
   14
    3
   10
    6
   15
   13
    8
   12
    1

論理インデックス

ポイント

> A=[1 2 3;4 5 6;7 8 9]
A =
 
   1   2   3
   4   5   6
   7   8   9
 
> B=logical([0 1 0;1 0 1;0 0 1])
B =
 
   0   1   0
   1   0   1
   0   0   1
 
> A(B)
ans =
 
   4
   2
   6
   9

ちなみに logical() を使わないと?

> C=[0 1 0;1 0 1;0 0 1]
C =
 
   0   1   0
   1   0   1
   0   0   1
 
> A(C)
error: subscript indices must be either positive integers or logicals.

論理インデックスの例

> A=rand(5,1)
A =
 
   0.24645
   0.36111
   0.79097
   0.68693
   0.58270
 
> B = A > 0.5
B =
 
   0
   0
   1
   1
   1
 
> A(B)=10
A =
 
    0.24645
    0.36111
   10.00000
   10.00000
   10.00000

これを省略するとこんな記法になる

> A=rand(5,1)
A =
 
   0.45720
   0.42199
   0.87452
   0.92106
   0.75541
 
> A(A>0.5)=10
A =
 
    0.45720
    0.42199
   10.00000
   10.00000
   10.00000

論理インデックスの別の例

> A=magic(3)
A =
 
   8   1   6
   3   5   7
   4   9   2
 
> B=isprime(A)
B =
 
   0   0   0
   1   1   1
   0   0   1
 
> A(~B)=0
A =
 
   0   0   0
   3   5   7
   0   0   2
 
> find(B)
ans =
 
   2
   5
   8
   9

ちなみに find() は非ゼロの値を探して、そのインデックスを行列にして返す。

ところで最初の例で代入しないで A(B) だと??

> A=rand(5,1)
A =
 
   0.934888
   0.094090
   0.864036
   0.473364
   0.015756
 
> B=A>0.5
B =
 
   1
   0
   1
   0
   0
 
> A(B)
ans =
 
   0.93489
   0.86404

グラフ

http://www.inaba-lab.org/modules/bwiki/index.php?Octave%C6%FE%CC%E7

http://en.wikibooks.org/wiki/MATLAB_Programming/Plot

> h = figure;
> x = [0:0.001:10];
> y=sin(x);
> title('sine wave')
> plot(x,y)
> print(h,"test.eps","-deps2")
% 下記でもよい
> print -deps2 test2.eps

help print すると説明が出てくる。

print() の最初の引数 h を省略すると current figure になる。

matlab だとfigureのハンドルを saveas すればよい。

ラベルのフォントの大きさを変える:

> xlabel('xlabel','fontsize',20);

軸のフォントの大きさを変える:

> h = figure;
> a = axes();
> set(a,'fontsize', 30);

音声波形のプロット

横軸を sec. にして音声波形を plot する。

[Y,FS] = wavread("filename.wav");
X=(1:length(Y))/FS;
plot(X,Y);

複数の波形を上下に並べる

> subplot(2,1,1); plot(Speech)
> subplot(2,1,2); plot(Noisy_Speech)

Emacs octave-mode

Ubuntu 9.04 の emacs-snapshot にて ~/.emacs.el に下記を追加。

参考 http://blog.livedoor.jp/rakkyoo/archives/1883260.html

;; octave mode
(autoload 'octave-mode "octave-mod" nil t)
(setq auto-mode-alist
           (cons '("\\.m$" . octave-mode) auto-mode-alist))
(add-hook 'octave-mode-hook
               (lambda ()
                 (abbrev-mode 1)
                 (auto-fill-mode 1)
                 (if (eq window-system 'x)
                     (font-lock-mode 1))))

対話型環境

ファイルに書かれたコマンドをバッチで実行するには

source "myscript.m"

あるいは

myscript

で実行できる。

ちなみに load はデータを変数に読み込むコマンド。

require とか include とか import とかいうコマンドはない。

カレントディレクトリ

カレントディレクトリの概念がある。

> pwd
> dir
> cd

wavread("sample.wav") などはカレントディレクトリでファイルを探す。

参考書

<html>

<hr>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/095461206X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41ai44OhCDL._SL160_.jpg" alt="GNU Octave Manual Version 3" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/095461206X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">GNU Octave Manual Version 3</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/095461206X/r4wh-22/ref=nosim/" title="GNU Octave Manual Version 3" target="_blank">amazlet</a> at 10.12.23</div></div><div class="amazlet-detail">John W. Eaton David Bateman Soren Hauberg <br />Network Theory Ltd <br />売り上げランキング: 10978<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/095461206X/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<hr>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4563067369/r4wh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/418GWA7BSRL._SL160_.jpg" alt="MATLABマルチメディア信号処理〈下〉音声・画像・通信" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4563067369/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">MATLABマルチメディア信号処理〈下〉音声・画像・通信</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4563067369/r4wh-22/ref=nosim/" title="MATLABマルチメディア信号処理〈下〉音声・画像・通信" target="_blank">amazlet</a> at 10.12.23</div></div><div class="amazlet-detail">池原 雅章 真田 幸俊 島村 徹也 <br />培風館 <br />売り上げランキング: 386059<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4563067369/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<hr>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4563067350/r4wh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/G/09/icons/books/comingsoon_books.gif" alt="MATLABマルチメディア信号処理〈上〉ディジタル信号処理の基礎" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4563067350/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">MATLABマルチメディア信号処理〈上〉ディジタル信号処理の基礎</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4563067350/r4wh-22/ref=nosim/" title="MATLABマルチメディア信号処理〈上〉ディジタル信号処理の基礎" target="_blank">amazlet</a> at 10.12.23</div></div><div class="amazlet-detail">池原 雅章 島村 徹也 <br />培風館 <br />売り上げランキング: 578136<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4563067350/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

</html>