FreeMatで16点DCTの実装と近況報告

こんばんは。更新しようにもネタがない状態でしばらく放置してました。
私のことなので、今後も月一程度のマイペースな更新になりそうです。

近況報告

最近は卒研や課題の処理に明け暮れる日々です。卒研は研究で使おうとしているFORTRANで書かれたSPH法のシミュレーションプログラムをC言語のソースに変換する作業は一通り終わって、今はプログラム中に出てくる数式のTeX化やプログラムがまだ思うように動いてくれないのでデバッグ作業を中心に行っています。
CUDAへの並列化までにはまだしばらく時間がかかりそうです…

FreeMatで16点離散コサイン変換(DCT)を実装してみた

「信号処理とメディア通信」という講義で離散コサイン変換(DCT)を扱ったので自習の間隔で寮の学習時間帯(21:00〜23:00)の半分ほどをこれに費やしてました。

授業はいつもMATLABを使いながら進めているのですが、自分の個人ノートPCにMATLABは入れられないので代替としてFreeMat*1というフリーソフトを使っています。

ところが、今日FreeMatを使っていてDCTがないことが分かり、PBL課題も控えているのにこれは不便だなぁ…と感じて思い切って実装してみることに。

ソースコードはこんな感じになりました。

% 16点DCT
function dct = dct16(x)
    N=16;
    n=0:N-1;
    
    dct=zeros(N,1);
    
    %基底ベクトルを算出
    p=zeros(N,N);
    p(1,:)=1*cos(pi/(2*N)*(2*n+1)*0);
    
    for l=2:N
        p(l,:)=sqrt(2)*cos(pi/(2*N)*(2*n+1)*(l-1));
    end
    
    %信号xのDCT
    dct=p*x/N;

※DCTの定義式は『やり直しのための信号数学―DFT、FFT、DCTの基礎と信号処理応用 (ディジタル信号処理シリーズ)』に掲載されているものに基づく。

今日はこれで満足してしまったので、今度はN点DCTやIDCTの実装も試みてみたいところです。