投稿

ホワイトノイズを生成する

イメージ
最近まで、ホワイトノイズを作るには、一様乱数を使えばよいと思っていた。 たしかに一様乱数でも、ちゃんと周波数特性が均一なホワイトノイズになる。シンセやAudacity等でホワイトノイズを生成すると、たいてい一様乱数が出てくる。 しかし、信号処理の世界では 正規乱数 (値が正規分布的に分布する乱数)を使うほうが一般的らしい。 正規乱数によるホワイトノイズのことを「ホワイトガウシアンノイズ」と呼ぶこともある。 なぜ一般的な信号処理で「正規乱数によるノイズ信号」(ガウシアンノイズ)を使いがちなのかというと、正規乱数は「最も平均的なノイズ信号」といえるからだ。 あらゆる雑音信号をたくさん集めて平均していくと、集めれば集めるほど正規乱数に近づいていく(これは 中心極限定理 から言える)。 また、ガウシアンノイズは数学的に扱いやすい性質がいろいろとあり(ここでは詳細は省く)、数式上の利便性もある。 調べたところ、正規乱数のメジャーな生成方法には、おおよそ3種類があるらしい。 1. 一様乱数を12回足して6を引く(近似) 中心極限定理をそのまま利用した方法。 一様乱数を たくさん足し合わせて平均 すれば、正規乱数に近いものが得られる。 近似なので精度は高くないが、ちょっとした用途ならこれで十分かもしれない。 また、乱数を1つ作るのにループを要するため、大量に生成する場合には遅いという話も聞く。 亜種として「16回足して8を引く」実装もある(例: Web上で音声合成ができる  PinkTrombone )。 要するに $2N$ 回足して $N$ を引けばよい。 2. ボックス・ミュラー法 2つの一様乱数 $ 0 < a, b < 1 $ をもとに、2つの正規乱数 $ x, y $ を生成する方法。 $ x = \sqrt{-2 \log a} \cos 2 \pi b $ $ y = \sqrt{-2 \log a} \sin 2 \pi b $ おそらく最も教科書的でよく知られている方法で、実装も簡単。 三角関数・対数・平方根といった数学関数を使うことになるので、オーディオ信号生成のように大量の乱数が必要な用途ではもっと高速化したくなるケースがあるかもしれない。 3. ジッグラト・アルゴリズム 超ざっくりいうと、ルックアップテーブルを使う方法。

環境構築メモ: Julia 1.0.0 on Windows 10

Julia 1.0.0 環境を構築するとき、(おもに PyPlot.jl まわりで)少しハマったので、最終的にうまくいったやり方をメモとして残しておく。 既存の ナントカconda がある場合 以下では Miniconda 3 を C:\Miniconda3 へインストールしたものとする。 あらかじめ numpy と matplotlib を導入しておく。 Julia 1.0.0 のインストール julialang.org/downloads からインストーラをダウンロード、実行する。 インストール先ディレクトリは、わかりやすい場所にしておくと便利。 ここでは C:\Julia-1.0.0 に設定した。 環境変数 Julia を起動するまえに、以下の環境変数をセットした。 (a) JULIA_BINDIR=C:\Julia-1.0.0\bin (b) JULIA_PKGDIR=C:\Julia-1.0.0\Pkg (c) PYTHON=C:\Miniconda3\python.exe (d) CONDA_JL_HOME=C:\Miniconda3 (e) MPLBACKEND=qt4agg あとは Julia の実行ファイルへのパスも通しておくと便利。 また、Julia 0.6 以前のユーザは、環境変数 JULIA_HOME を削除しておいたほうがよい(これは Julia 0.7 で 廃止された 環境変数)。 環境変数の解説 (a) Julia のバイナリがあるディレクトリ。 (b) Julia のパッケージを管理するディレクトリ。 これらは自分で設定しなくても、自動で設定してくれる。 カスタムしたいひと向け。 (c), (d) PyPlot.jl を導入する際、既存の Python を使わせたい場合に設定しておく。 手持ちの conda 環境がなければ、スルーして問題ない。 これら (c), (d) を設定しなければ、勝手に Miniconda がインストールされる。 conda で仮想環境を切りわけている場合は、(c)に構築先の python.exe, (d)に構築先ディレクトリを指定すればOK。 (e) PyPlot.jl を使う場合に、これを設定しておくと動作が安定する。

MATLAB版WORLD を GNU Octave で使う

イメージ
音声分析合成システム  WORLD  を GNU Octave 上で動かしてみる。 WORLDにはC++版とMATLAB版がある。ふと思い立って試作するには、C++ よりも MATLAB のほうがはるかにラクだ。しかし MATLAB は高価なので、個人で手を出すのは難しい。そこで MATLAB 互換のオープンソースソフトウェア Octave を使うことにした。 この記事では MATLAB版WORLD を Octave で動かすときの注意点と、WORLD で声をこねくりまわして遊ぶためのメモを書き連ねていく。 注 : この記事のとおりにOctaveで動作させると、 C++版や本物のMATLABで実行したときと結果が一致しない (原因はおそらくビルトイン関数の結果が微妙に異なるため)。一応それらしい結果になるし、単に「動いたら面白いな」という程度なので、ここでは問題ないと考えて割り切っている。正しい結果が必要なときは Julia  の  WORLD.jl パッケージ  を利用したほうがよいとおもう。 WORLD の使い方は、おもに森勢先生の公演スライドとPDF資料をベースにしている(URLを記事の最後に載せてある)。とてもわかりやすい資料なので、目を通しておくべし。 環境 Windows 10 (x64) GNU Octave  4.2.1 WORLD  v0.2.1_4 (Matlab) WORLD を使う準備 Matlab版WORLD  のZIPファイルをダウンロードして解凍しておく。 基本的に Octave は MATLAB 互換なので、普通はこのまま動作できる。 ところが、Octave には実装されていないMATLABの関数が存在する。 今回使った WORLD v0.2.1_4 (Matlab) で使われている rng関数 と interp1q関数 は、現時点では Octave に実装されていない。 というわけで、埋めあわせ用の関数を用意した。 rng.m function rng(x) randn('seed', x) rand('seed', x) end interp1q.m function yi = interp1q(x, y, xi)

自分のツイートを word2vec で学習させて遊ぶ

イメージ
全ツイートの内容を word2vec に放り込んで遊んだ。 数年前から word2vec はスゴいらしいという話を聞いていたが、なんとなくスルーしていた。 Python の gensim パッケージで手軽に word2vec を使えるようなので、試してみた。 今回使った環境 Windows 10 (64bit) Python 3.6.0 (Anaconda 4.3.0) MeCab 0.996 word2vec は、2014年に Google で開発された自然言語処理の手法。比較的計算量が少ないところが特徴らしい。 ざっくりとした流れ word2vec という名前の由来は、おそらく "word to vector" の略だと思う(出典はない)。単語 (word) からベクトル (vector) を学習する。 word2vec は、大量の文章を渡されると、単語の前後関係から、各単語をよく表すn次元のベクトルを学習する。 一見すると機械的な方法だが、なぜか単語どうしの意味的な関連性まで学習できてしまう(ことがある)らしい。 ベクトルの次元数 n は、自由に設定できる。ネット上のサンプルを見ていると n=100 くらいに設定していることが多かった。 細かい話 学習には2層のニューラルネットワーク (入力層、隠れ層、出力層からなる。ふつう出力層はカウントしないので2層といっている) を使っているらしい。意外と少ない! 学習時の「前後の単語を見る」処理として、 CBOW (Continuous Bag-of-words) と skip-gram の2種類が提案されている。どちらを使うかによって、NNの構造がすこし異なる。 Python の gensim パッケージではどちらも使えるが、今回は性能が良いらしい skip-gram を使うことにする。 参考: Word2vec - Wikipedia 絵で理解するWord2vecの仕組み 【論文シリーズ】CBOWとSkip-gramについて データの準備 さて、word2vec の学習には、大きめの文章データが必要となる。 なにか良さそうなものはないかと考えて、約12万ツイートある  mogesystem の投稿内容を使う

MSYS2 の設定メモ

個人的な設定のメモ。 何年も  元祖MinGW  を使ってきたが、64ビットのバイナリを出力したくなったので  MSYS2 を導入した。 1. 導入 msys2.github.io からダウンロードした最新のインストーラ(執筆時点では msys2-x86_64-20160205.exe )を実行する。 デフォルトでは、MSYS2一式は C:\msys64\* にインストールされる。 msys2-shell.bat を開く (古いMSYS2ではシェルの初回起動時に各種設定をしていたようだが、新しいインストーラでは自動でやってくれるっぽい。) パッケージマネージャ pacman を更新する 最新版を導入した直後であれば、おこなう必要はない。 pacman -Sy pacman このコマンドの実行が終わったら、更新を反映させるために一旦MSYS2を閉じて、また起動する。 インストール済みのパッケージを更新する こちらは最新版をインストールした直後でも、あとからアップデートされていることがあるのでやっておく。 pacman -Syu これでひととおり最新の状態になった。 2. mintty の設定をいじる 元祖 MinGW とは異なり、MSYS2 は mintty というターミナルエミュレータ上で動いている。 コマンドプロンプトと比べて細かなカスタマイズができるので、いろいろ触ってみるとおもしろい。 デフォルトのフォントは Consolas に設定されている。 当初は Inconsolata に日本語表示用の MeiryoKe をフォントリンクしたものを使っていた(参考: Windowsで最高のターミナルを構築する方法 )。 しかし、個人的には統一感がないように見えてあまり気に入らなかったので、最近は VLゴシック に設定している。 mintty のウィンドウを右クリックして Options... を開くと、設定ウィンドウが出てくる。 フォントは Text タブで変更できる。 また、Looks タブ → Transparency=Low に設定している(ちょっと背景が透けてカッチョよくなる)。 3. 開発系パッケージを追加する MSYS2 の初期状態は、必要最低限のシステムしか用意されていない。

PortAudio を VS2010 Express でビルドする

PortAudio を Visual C++ から利用しようと思ったのだが、導入に手こずってはまりかけた。 環境: Windows 8.1 (x64), Visual Studio 2010 Express, CMake 3.2.2 使ったソースは pa_stable_v19_20140130.tgz。 このなかにある build/msvc 以下のファイルは、VS2010で開くとプロジェクト変換に失敗してしまう。 検索してみると VS2008 ならうまくプロジェクト変換できるという情報( PortAudioでリアルタイム入出力制御 (1) )もあったが、今回のPortAudioのためだけに環境を構築しなおすのはあまりにも面倒くさすぎるので試さなかった。 最終的には、CMake を使ってVisualStudioプロジェクトを生成したところ、うまくビルドできた。 詳しいことはPortAudioのCMakeに関するドキュメント( Creating MSVC Build Files via CMake )に書いてある。 以下にざっくりと手順を書いておく。 CMake 2.8以降をインストール する。 PortAudio から ASIO を利用したい場合は ASIOSDK をダウンロード 。フォルダ名を「ASIOSDK2.3」から「ASIOSDK」にして src/hostapi/asio にコピーする。 CMake GUI を起動 。「Where is the source code」には CMakeLists.txt があるディレクトリ、「Where to build the binaries」にはVS2010プロジェクトを作るディレクトリを指定する。 「Configure」をクリック 。ドロップボックスからVisualC++のバージョンを選ぶ。 必要に応じて PA_USE_ASIO などのオプションをいじる(オプションを変更する場合、再度Configureする必要がある)。 「Generate」をクリック 。指定ディレクトリにVC++プロジェクトが生成される。 いままでほとんどCMakeを使ってこなかったけれど、思った以上に便利で感動した。

謹賀新年

あけましておめでとうございます しばらく更新が途絶えてしまいましたが生きております! 気づけば MOGESYSTEM HP も5年目。早いものだなあ。 本年もよろしくお願いいたします。