LISP

Hann窓の実装

信号処理でよく出てくるHann窓(別名raised cosine)をCommon Lispで実装しました。例えば64点の窓が欲しいときにはx = [0...63]/63とやってあげて、w(x) = 0.5 - 0.5 cos(2πx)に突っ込んであげればOKです。簡単ですね。 (defun hann (n) "Hann window of le…

行列の転置(Common Lisp)

Common Lispで音を扱うときに、どのようなデータ構造で保持しておくのが良いのか少し考えました。 Matlabと同様にサンプル数×チャンネル数という2次元配列で保持することもできますし、例えば、1チャンネル分のサンプル列をvectorとしておき、それを複数あつ…

TSP信号の生成(Common Lisp)

インパルス応答 OATSPの数式 Common Lispで試す 時間領域にもっていく 関数にした インパルス応答 頭部伝達関数を測定したり、スピーカーの応答を測ったり、室内音響指標の計算に使ったり……インパルス応答が測定できると色々と便利です。すでにMatlab、R、Ju…

Common Lispで音の振幅スペクトルの計算

先月末「Common LispでFFTライブラリを使ってみる - 丸井綜研」を書きました。このエントリの最後に「関数化した上でWAVファイルを読み込んで分析してみたい」と書いていたので、今日はそれをやってみました。 WAVファイルを読み込むのには「Common Lispで音…

Common Lispで畳み込み演算

先日Common LispでFFTが使えるようになったので、それを使って畳み込みをします。畳み込みには環状畳み込み(円状畳み込みや循環畳み込みとも呼びます)と線形畳み込みの2種類がありますので、両方とも作ってみようと思います。 ちょっとした道具 実際の畳み…

Common Lispで音ファイルを読み込む

Lispで音をやろうと思ってもなかなか情報が出てこないのですが、OpenMusicのような大規模なシステムもCommon Lispで書かれているので無理なことはないはず。Google検索してみると、masatoiさんが音声合成関係の記事をいくつか書かれていたり、t-sinさんが発…

Common LispでFFTライブラリを使ってみる

Common Lispを使っていろいろと車輪の再実装を続けています。今回はフーリエ変換ライブラリを試してみます。Common Lispにはフーリエ変換のライブラリは入っていないので、Quicklispでfftをキーワードに探していきます。すると以下の4つがヒットしました。 C…

1/3オクターブ周波数のリストを得る

目次 標準数とは Common Lispでの実装 実行例 似たようなことをJuliaでやってみると…… 標準数とは 1/3オクターヴ幅での周波数リストが欲しい時があります。20, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315 Hz... というやつです。実はこのリスト、…

周波数から音名を得る (Common Lisp)

Common Lispの勉強をしていて、簡単なプログラムを再実装しています。数年前にJuliaで書いた「周波数を与えると音名・セント値が返ってくる関数」をLispに移植してみました。Julia版は以下の記事に書いてあります。 marui.hatenablog.com やっていることはJu…

Common Lispで統計関数を車輪の再発明(再訪)

だいぶ前に書いたCommon Lispのプログラムを発掘しました。 marui.hatenablog.com まだapplyやmapcarを知らなかったので、再帰だけを使って計算していました。たとえばベクトル(というか数値の入ったリスト)の和を計算するのにも、以下のように再帰を使っ…

SLIMEの設定をちょっと変えた

最近、自宅のWindowsマシンでCommon Lispの勉強をしています。IDEはEmacsとSLIMEを使っているのですが、ところどころ手になじまない部分があるので、ちょことだけカスタマイズしてみました。 ;; SLIME環境の設定 (unless (package-installed-p 'slime) (pack…

Land of Lisp第7章

Land of Lispを読んでいます。日本語版も英語版も英語電子版も持っているのに、読み終わる前に投げ出して、また最初から読み始めるということを何度も繰り返しています。以下、日本語版と英語Kindle版へのアフィリンクです。 本書で使用しているCommon Lisp…

carとcdrとcons

学生のときに受けた講義に「プログラミング」がありました。「プログラミングI」「同II」「同III」と半期の科目が3つあり、それぞれ「プログラミングI」は「基本のC言語」、「プログラミングII」は「色々経験するために、関数型言語(LISP)・論理型言語(Pr…

ANSI Common Lispの規格書(に近いもの)のPDFを入手する【改】

『ANSI Common Lispの規格書(に近いもの)のPDFを入手する』を自分の環境で試してみました(元記事に感謝!)。OS X 10.11.5、MacTeX 2016むけに、いくつか変更。ファイルのダウンロードにwgetではなくcurlを使用。PDF結合ツールとしてpdftkではなくpdfjamを…

FASLファイルの中身を見てみた

Practical Common Lisp (邦訳『実践Common Lisp』) を改めて読み直し中。第2章でLISPファイルのコンパイルについて書かれていたところがあったので、いくつかの処理系で試してみることに。 準備 まず以下のような簡単なプログラムを作り、hello.lispとしてフ…

正規分布の累積分布関数の近似式

昨日、Common Lispで正規分布の累積分布関数を作成しました。テイラー展開された式でいちいち計算するものですが、もっと単純で高精度な近似式があれば、そのほうが計算速度も向上します。ちょっと探してみたところ、以下のようなものがよく使われるとのこと…

Octaveでの実装を参考にCommon Lispで正規分布の累積分布関数を計算

正規分布の確率密度関数は定義通りに ;; Normal Distribution ;; (normpdf 2 0 1) => 0.05399096581690089 ;; (defun normpdf (x mu sigma) (* (/ 1 (* (sqrt (* 2 pi)) sigma)) (exp (- (/ (expt (- x mu) 2) (* 2 sigma sigma)))))) で計算できるのですが…

SICP Exercise 1.4

Structure and Interpretation of Computer Programsの練習問題1.4のコードを見て、一瞬とまどいました。 (define (a-plus-abs-b a b) ((if (> b 0) + -) a b)) bが0より大きければ加算、それ以外は減算が戻ってきて、それがaとbの計算に用いられます。単に…

初めての人のためのLISP

今年度はいろいろなところから仕事を頼まれたりして、このところ土日もずっと仕事しています。なのに面白そうな本があると手を出してしまって、買うだけ積ん読が多いので、読書への欲求不満がたまってしまいます。そんな現状を打破すべく、竹内郁雄『初めて…

R言語のどこにSchemeが入っているのか

日本語版WikipediaでR言語のことを調べると、「影響を受けた言語」という部分にS言語とSchemeが書かれています*1。S言語から大きく影響を受けたことはもちろんのことですが、なぜSchemeなのかと常々思っていました。プログラムを見てもSchemeのようなLISP族…

SBCLでUnicodeを試してみる

(position #\本 "日本語") => 1 (aref "日本語" 1) => #\U65E5 てな具合に、ちゃんとUnicodeがサポートされていました。これはいい。

mapcarでsum-of-squaresを書き直す

mapcarを覚えたので、sum-of-squaresを書き直してみました。こんな便利なものがあるんだったら早く使えば良かった・・・。 (defun sum-of-squares (x) (if (null x) 0 (+ (* (first x) (first x)) (sum-of-squares (rest x))))) 上記のコードがもともとのsum…

GUILEってSchemeだけじゃなかったの?

GUILEがJavaScriptに対応というニュースを読んで、(若干)のけぞってしまいました。GUILEって、Schemeインタプリタじゃなかったの!? 「GCCってC/C++だけじゃなかったの!?」と同じような衝撃。

Common Lispの関数の引数

C言語やJava言語にはないMatlabの使いやすい点としては、関数から複数戻り値が返せる機能です。例えば、配列を並べ替えるのに使われるsort関数の戻り値は「並び替えられた配列」と「それが元配列の何番目にあったか」の2つです。CやJavaでも戻り値を構造体や…

Common Lispで統計関数を車輪の再発明

Common Lispで統計関数を書いてみました。和・平均・標本分散・平方和くらいが計算できれば、まずは何かできるのでは、という感じです。

Clozure CLがなかなかいい

Common Lispの勉強をSlime+SBCLでやっていましたが、Clozure CLもなかなか良いです。2年ほど前のバージョンと比べ、IDEが標準で付属したり、自動的にアップデートをしてくれたり、様々な点が改良されています。将来的にはCocoaと接続して開発をやってみたい…

Common Lispの=、eq、eql、equalなど

先日のエントリに書いたCommon Lispでの等価判定なんですが、今読んでいる栗原正仁『対話によるCommon Lisp入門』にきれいに説明されていました。 関数名 備考 = 数の判定 eq シンボルの判定 eql アトムの判定 equal リストの判定 で、eq⊂eql⊂equalという関…

Common Lispのtrace

traceなんていう便利コマンドがあるのですね。 (defun my-gcd (m n) (if (= (mod m n) 0) n (my-gcd n (mod m n)))) があったときに、Common Lispのプロンプトから以下のようにして使えます。 * (trace my-gcd) (MY-GCD) * (my-gcd 18 30) 0: (MY-GCD 18 30)…

ハードウェア情報を返すCommon Lisp関数

上から順に、ハードウェア種別、OS、マシン名、実装系、そのバージョン、内部ストレージ情報。こんな関数も用意されていたのですね。 * (machine-type) "X86" * (software-type) "Darwin" * (machine-instance) "xxxxxxxx.xxxxxxxx.xx.jp" * (lisp-implement…

対話によるCommon Lisp入門

性懲りもなくLISP関連書籍を買い続けています。今度は「対話によるCommon Lisp入門」です。過去に出版されていた書籍だったのですが、復刊ドットコム経由でPOD版として生まれ変わったという、ファンに支持されるCommon Lisp書籍なのだそうです。良い意味でジ…