先日Juliaでフィルタの可視化をしたけれど、あの時点ではまだフィルタの設計はMatlabに頼っていた。今回はRobert Bristow-Johnson氏の名作をもとに、パラメトリックEQを作る。ただし、今日ここに紹介するのはピークフィルタのみ。
続きを読むMaxで使えるJavaのバージョンが8になっていた
Ableton/Cycling'74のMaxでは、いくつかの(Max以外の)プログラミング言語を使えるようになっています。Cycling'74が公式にサポートしているものにはJava、JavaScript、Luaがあり、エクスターナルを書くことを考えるとC/C++もあります。Max専用のDSLとしてGenExprもありますね。
Mac向けのMaxでは、Appleが用意していたJava 6だけがサポートされていて、Oracle版のJava 7以降はMaxでは使えないという状況が続いていました。Ableton/Cycling'74のユーザーフォーラムにも「Is installing Apple Java SE 6 unavoidable to use Max for Live on Mavericks?」などのスレッドが立っていて、セキュリティの心配があるJava 6を使わないといけないことへのJavaユーザの不満が綴られています。(Windowsではこの問題はなかったようで、新しいJavaへの対応は進んでいたようです)
そのスレッドに数ヶ月前、「Max 7.3ではOracle Javaの新版をサポートしたみたいだよ」とリンク(https://cycling74.s3.amazonaws.com/support/java_install.html)が張られました。Max 7.2.5とMax 7.3.0のリリースノートを読み比べると、Java対応に関しての記述が変更されています。このリンク先をザックリまとめると、
- Macでは
- 32 bit版を使っている人はAppleのJava 6を使う(Java for OS X 2015-001*1)
- 64 bit版を使っている人はOracleのJava 8を使う(Java SE Development Kit 8 - Downloads)
- Windowsでは
となっています。ただ、文書内のJavaバージョンは「jdk1.8.0_91」となっていて、macOS 10.13 High SierraならびにJava 9の登場前のドキュメントっぽいです。
ためしに、今日時点で入手できるJava 8の最新版JDK 8u151をmacOS 10.13にインストールして試してみました。
$ java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
で、/Application/Max.appについて「情報を見る」で「32ビットモードで開く」をオフにします。(下記スクリーンショットではオンになっています)
すると、ちゃんとmxj~のヘルプも動いてくれるようになりました。
ただ、64ビットモードにするといくつかのオブジェクトが動作しなくなる問題があります。また、Java 8で自作エクスターナルを作ったとしても、他の人に使ってもらうためにはJava 6への下位互換性を考慮して「javac -target」の指定をする必要がありそうです。
なお、Max 7のオンラインドキュメントにはmxjとmxj~のリファレンスが見つからない状態になっていますし、ローカルにインストールされているチュートリアルやドキュメントはMax 4時代から更新がなさそうで、今後のJava対応に関しては悲観的ではあります。ちなみにJava関連の一式は /Applications/Max.app/Contents/Resources/C74/packages/max-mxj にインストールされています。
本日の給油
給油日 | オドメーター (km) | 給油量 (L) | 単価 (円/L) | 燃費 (km/L) | 距離単価 (円/km) |
---|---|---|---|---|---|
2017-03-18 | 8559.6 | 2.76 | 125.72 | 45.94 | 2.74 |
2017-04-29 | 8703.9 | 2.77 | 127.80 | 52.09 | 2.45 |
2017-04-29 | 8905.9 | 3.21 | 128.97 | 62.93 | 2.05 |
2017-04-30 | 9032.5 | 2.20 | 131.82 | 57.55 | 2.29 |
2017-05-01 | 9190.3 | 2.70 | 127.04 | 58.44 | 2.17 |
2017-05-01 | 9325.7 | 2.52 | 128.97 | 53.73 | 2.40 |
2017-05-01 | 9469.7 | 2.17 | 129.03 | 66.36 | 1.94 |
2017-05-02 | 9625.3 | 3.71 | 133.96 | 41.94 | 3.19 |
2017-05-02 | 9787.8 | 2.81 | 125.98 | 57.83 | 2.18 |
2017-09-15 | 10004.7 | 3.09 | 123.96 | 53.03 | 2.34 |
2017-10-04 | 10152.2 | 2.08 | 125.96 | 70.91 | 1.78 |
2017-10-18 | 10314.9 | 3.42 | 125.73 | 47.57 | 2.64 |
JavaScriptではじめてのグラフ描画
環境にできるだけ依存せずにグラフを描いたりしたいとなるとHTML5かなぁと思い、はじめてのJavaScript。まだ配列の使い方を調べていないので、sinもcosも直に計算&描画してます。
使ったHTMLファイルは以下。
続きを読む本日の給油
給油日 | オドメーター (km) | 給油量 (L) | 単価 (円/L) | 燃費 (km/L) | 距離単価 (円/km) |
---|---|---|---|---|---|
2017-03-18 | 8559.6 | 2.76 | 125.72 | 45.94 | 2.74 |
2017-04-29 | 8703.9 | 2.77 | 127.80 | 52.09 | 2.45 |
2017-04-29 | 8905.9 | 3.21 | 128.97 | 62.93 | 2.05 |
2017-04-30 | 9032.5 | 2.20 | 131.82 | 57.55 | 2.29 |
2017-05-01 | 9190.3 | 2.70 | 127.04 | 58.44 | 2.17 |
2017-05-01 | 9325.7 | 2.52 | 128.97 | 53.73 | 2.40 |
2017-05-01 | 9469.7 | 2.17 | 129.03 | 66.36 | 1.94 |
2017-05-02 | 9625.3 | 3.71 | 133.96 | 41.94 | 3.19 |
2017-05-02 | 9787.8 | 2.81 | 125.98 | 57.83 | 2.18 |
2017-09-15 | 10004.7 | 3.09 | 123.96 | 53.03 | 2.34 |
2017-10-04 | 10152.2 | 2.08 | 125.96 | 70.91 | 1.78 |
燃費が良すぎて何かがおかしい気がする。長距離巡航だったけど、それにしても……。
MatlabのfreqzもどきをJuliaで
MatlabやOctaveにはfreqz
という関数があり、FIR/IIRフィルタの周波数特性・位相特性を計算しグラフ表示してくれます。PythonでもSciPy.signalに同名の関数があります。似たことをJuliaでやってみました。
今回は双二次フィルタを見てみましょう。標本化周波数44,100 Hz、中心周波数1,000 Hz、ゲイン12 dB、Q=2.0のピークフィルタを準備しました。
samprate = 44100; B = [1.1417, -1.9797, 0.8583]; A = [1.0356, -1.9797, 0.9644];
特性を見たい周波数範囲を設定し、それをzさらにsへと変換して使います。ここでは16 Hz〜ナイキスト周波数を256段階の対数分割してみました。
# calculate frequency # (using logspace since we are going to use semilogx for plotting) fL = 16; fH = samprate/2; f = logspace(log10(fL), log10(fH), 256); z = f / sampfreq * 2*pi; s = exp.(-1.0im * z); # convert from digital frequency
次に、各周波数での伝達関数の値を計算します。下の式に代入して計算するだけ。
# calculate transfer function H = (B[1] + B[2].*s + B[3].*s.*s) ./ (A[1] + A[2].*s + A[3].*s.*s);
Polynomialパッケージを使って汎用性を高めても良いのですが、僕の考えている使用用途は双二次フィルタだけなので、このままで。
さて、振幅特性をグラフにしてみましょう。abs.()
で絶対値を計算してからデシベルにします。
using PyPlot semilogx(f, 20*log10.(abs.(H))); grid(); xlabel("Frequency (Hz)"); ylabel("Gain (dB)"); savefig("freqz_abs.png")
次に位相特性もグラフにしてみましょう。今度はangle.()
で位相を抜き出し、ラジアンを角度に変換しています。
semilogx(f, angle.(H)*180/pi); grid(); xlabel("Frequency (Hz)"); ylabel("Phase (angle)"); savefig("freqz_phase.png")
Matlabのfreqz
のグラフと見比べてみましたが、だいたい同じ結果になっているようでした。Matlab版は横軸が線形になっているので見た目が違いますが。