fortran66のブログ

fortran について書きます。

2010-01-01から1年間の記事一覧

同じタイトルのCDのマスタリング違いを平均音量(あるいは音圧)と標準偏差で比較します。

音量の大小の傾向は数値の通りで、また時代が下がるほど平均音量が上がってゆく傾向も見て取れます。 しかし、平均音量と標準偏差は主観的な評価とそれほど相関は無いようです。 またリマスター版が無条件に良いわけでもないようですし、海外生産CDが国産よ…

CDの音量、絶対聴覚閾値

CDには16bitのPCMの音声データが記録されているわけですが、それは一種の相対値であって再生時の絶対的な音量には任意性があります。それはCD再生機のボリュームつまみで音量を変えられることからわかります。MPEGの音声圧縮のためには、心理音響解析が必要…

狩野直喜『中国哲学史』

本来『支那哲学史』という題名になるべきものを、岩波とかアカのクズが支那の呼称を検閲して使わないので変な題名になっています。政治権力に安易におもねる態度で学問や言論の自由が守れるものでしょうか。コペル君もびっくり。支那人のコスプレをして喜ん…

wav file 読み取り ミニマル

前回は、Fortran2003の新機能TYPE,EXTENDSを無理に使おうとして、冗長になったので作り直しをば。 ■実行結果 入力データは、ネット上に落ちていた2kHzの信号ファイルに、info chunkを手動で入れてみたもの。 サンプリング・レートが44.1kHzなので、2kHzの信…

2^n3^m型のFFT

MPEG1/Layer2,3では1フレームあたりのデータ数が変わって、FFTにかけるデータ数も変わるので一般形にしておきます。Fortran2003には本来、パラメトリックTYPEというのがあって、TYPEの中の要素のKINDや定数をTYPEインスタンス生成のときに指定できるんですが…

2と3のべきの積の次数のFFT

昔書いたFFTをOOP風にしてみました。とりあえず、べきは固定になってますが、イニシャライズのところでパラメータをとるようにすればいいような気もしなくも無いです。まぁ将来直すということで。普通教科書に載っているFFTは2のべき乗のものですが、同じよ…

MPEG1用 MPEG定数 & Subband filter

チラシ裏の下書きメモ帖です。テストしてません。 ■ソース・コード 配列生成子のところで、[CHARACTER(LEN=nn):: ....]と明示的に指定することで、中のデータが自動的にその長さに調節されます。Fortran95までは、宣言長にそろえて空白を入れておかないと駄…

MPEG1用のCRC16ルーチン

CRCについてはNumerical Recipesの第二版以降にある、Less numerical Algorithmsの章にある原理の説明を読むのがよかろうかと思います。もう細部はすっかり忘れてしまいました。覚えているのは、1.割り算の余りを比較する。2.余りが違ければ元の数もちが…

OOP的にwav fileを読んでみる

16ビット整数のwav fileのデータを、倍精度実数にして吐き出すことを考えます。今はmpeg音声Layer 1を想定して、ファイル先頭の1チャンネルあたり384個のデータを読みこみ書き出します。 ■実行結果 ■ソース・プログラム F2003の新機能ASSOCIATEをあまり必然…

ハルヒ消失フィルム

またぞろ見に行ってフィルムを貰ってきました。 一応、長門さんが出たので当たりなんですが、改変前眼鏡無し長門で微妙?場面も思い出せず。 不平を言ってはネタフィルムの皆様に叱られるのでなんなんですが、願わくば眉毛が欲しかったw でも有り難く大切に…

自己記述プログラム

規格違反のもの。80文字に収まっていますが必殺のホレリス使用w CHARACTER*43 f/43H(18HCHARACTER*43 f/43Ha,15H/;PRINT f,f;END)/;PRINT f,f;END やや分かりやすくしたもの。 CHARACTER*46 f/46H(18HCHARACTER*46 f/46Ha,1H//9HPRINT f,f/3HEND)/ PRINT f,…

OOPの練習

Intel Fortran v.11.1は、まだ完全にFortran2003に対応していないのですが、ある程度オブジェクト指向がらみの機能が実装されているので、練習してみます。ここでは、WAVファイルのヘッダー情報を読むことを考えます。特に、WAVファイルのうちでもCDをリップ…

連分数展開でπその他

Numerical Recipes 2nd ed. §5.2の計算法を使って連分数展開の式を求めました。Fortran2003では、ALLOCATABLEな配列に、最初に確保した大きさとは異なる配列代入を行うと、自動的に新しい大きさにreallocateされます。これはバグの元になりそうな機能ですが…

Chudonovskyの公式

14桁ずつ数値が決まっていきます。 ■実行結果 収束の様子と真値との差を表示しています。最後に4*ATAN(1)で真値を書き出しています。 ■ソースコード MODULE m_pi IMPLICIT NONE INTEGER, PARAMETER :: kq = KIND(1.0q0) CONTAINS REAL(kq) ELEMENTAL FUNCTIO…

Borwein Pi 4次公式

参照:http://crd.lbl.gov/~dhbailey/dhbpapers/pi-quest.pdf ■実行結果 ■ソースコード MODULE m_pi IMPLICIT NONE INTEGER, PARAMETER :: kq = KIND(1.0q0) CONTAINS ELEMENTAL REAL(kq) FUNCTION pi_Borwein4(n) !P.Borwein : quartic INTEGER, INTENT(IN)…

部分配列の代入と、DO..LOOPの代入の微妙に異なる点

重なった領域をコピーする場合、部分配列の代入は単純なDO..LOOPとは動作が異なります。 ■実行結果 ■ソース・プログラム 配列生成子にF2003の[,]を使いました。F90の場合はそれぞれ(/,/)となります。 PROGRAM test IMPLICIT NONE INTEGER :: i, ia(10) ia = …

INT(NaN), INT(+inf), INT(-inf) および部分配列ははみ出しおk?

IEEE例外の数に対するINT()の定義がよくわかりません。文献等で見た記憶がありません。後でISOの規格を調べてみたいですが、面倒くさくて億劫だw INTEGERのOut of rangeは、負の絶対値最大数になっているようですが、Intelの独自実装なのでしょうか、ISOの…

しつこくShell sort

Win32で走らせると、4割がたスピードアップします。Quick sortの場合はx64とWin32で速さは変わらないのですが・・ ■実行結果 Win32では10**9個のデータを確保できませんでした。 x64の場合の結果 ■ソースプログラム bubble sortの代わりにinsertion sortを使…

Shell sortでTokudaのgap increment sequenceを使うとお得だw

この論文によると、Knuthのgap式よりも性能の良いものがいくつか提案されているようです。その中のTokudaの式を使うことにします。 ■実行結果 確かにKnuthのものより計算量が少なくなっていて、Quick sortと似たような要素数依存性(O(NlogN))を見せています…

Quick sortがShell sortに負けているので..

要素数10**8程度ではShell sortも健闘してQuick sortと計算時間が変わりません。しかし、今のプログラムではQuick sortは余計なメモリーを食いすぎてこれ以上の要素数を計算できません。ここではQuick sortの小手先改良を行います。先日、要素数が少なくなっ…

<del datetime="2010-02-24T23:43:13+09:00">Shell sort実行時間がO(N^2)で謎だった件</del>Shell sort かわいいよ Shell sort!の巻

動的に記憶領域を確保できなかったFORTRAN77時代に重宝していたShell Sortのプログラムを書いてみました。ギャップのとり方として、Knuthの数列[tex:\{g_{n+1}=3*g_n+1|2*g_ha102549)。しかし、実行時間をデータ数の関数としてみると大体O(N^2)に比例して…

Quick sort + Bubble sort

Quick sortは、要素数が少ないときはかえって遅いので、要素数が減ったところでBubble sortのような素朴な方法に切り替えたほうが効率がよくなります。ここではBubble sortそのものではないのですが(しいて言えば沈殿sort?)、同等なO(N^2)のSORTを要素数50…

IBM 7094 Emulator でFORTRAN II Compilerを動かして1958年のプログラムを走らせる。

Computer History Museumのサイトに、1958年に書かれたFORTRAN IIとおぼしきプログラムと実行結果があります。5*5のHilbert行列の逆行列を求めるものです(Matrix Inversion Order 5)。先日は、Intel Visual Fortran Ver.11.1で実行してみましたが、今回…

POINTERではなくALLOCATABLEで

ALLOCATABLEでやると、記憶領域の開放を自動でやってくれるのでやや楽だと思います。必要なコンパイラ・オプションは /assume:realloc_lhs /heap-arrays100000 です。Intel掲示板によると、来週早々にもIntelFortranの新しいupdateが出るようです。 ■ソース…

Quick Sort

Quick Sortプログラムをポインタを返す形式に書き直してみました。手動で割付しているので、開放忘れに注意が必要です。多分大丈夫だと思いますが。ヒープ領域に動的配列を割り付けることで、大きな配列にも適用できます。 ■実行結果 要素1個から10**8(1…

素数の個数の近似関数

Riemannによる素数の個数の式。 ここでLi(x)はGaussによる素数の個数の近似式です。(でも積分の下限が2なのか0なのかよく分からんw ただ計算結果からは、どちらでも大差無し)またμ(k)はメビウス関数です。 実行結果 ソースプログラム あまりまじめに考…

積分のRichardson extrapolation

『Extrapolateせよ』と言われると、ヒューゴー・ガーンズバックを思い出してしまう駄目刷り込み。今日も昨晩に続き、積分のRichardson補外(もしくは外挿)をば。ところでSFといえば映画『涼宮ハルヒの消失』を見てきました。そろそろ劇場も空いてる頃かなと…

GaussのLi(x)関数

Nまでの素数の個数の評価式として、ルジャンドルのやGaussのなどがあります。ここではガウスのLi(x)関数を数値積分で求めてみます。定義式のままでは積分範囲が広すぎるので、の変数変換を行い、さらに部分積分をしてみます。 これがベストなのか分かりませ…

Hilbert matrix 1958

[Fortran66] 1958年のプログラムがほとんど無修正で動く件 計算機歴史博物館のサイトにFortran関連の古文書が置かれているのですが、その中に1958年にFORTRANで書かれた、5*5のHilbert行列の逆行列を掃き出し法で求めるプログラムがありました。このプロ…

Obsolecent features

例外処理には便利なんですが、時代が存在を許さないw 実行結果 ソースコード MODULE m_mod IMPLICIT NONE CONTAINS SUBROUTINE alt(i, *, *) INTEGER, INTENT(IN) :: i SELECT CASE(i) CASE(1) RETURN 1 CASE(2) RETURN 2 CASE DEFAULT RETURN END SELECT E…