GitHub - wxLuaApp の件。デスクトップアプリを作ってみた。けっこう調子良くサクサク書ける。
高速フーリエ変換が必要だったので、Lua のライブラリを探した。実は、ベンチマークプログラムの SciMark for Lua の FFT が十分実用的だった。LuaJIT のウェブサイトの "Performance" ページでベンチマークに使われているもの。たったこれだけ。16384 点のフーリエ変換がほぼノータイムで完了する。
function fft_bitreverse(v, n)
local j = 0
for i=0,2*n-4,2 do
if i < j then
v[i+1], v[i+2], v[j+1], v[j+2] = v[j+1], v[j+2], v[i+1], v[i+2]
end
local k = n
while k <= j do j = j - k; k = k / 2 end
j = j + k
end
end
function fft_transform(v, n, dir)
if n <= 1 then return end
fft_bitreverse(v, n)
local dual = 1
repeat
local dual2 = 2*dual
for i=1,2*n-1,2*dual2 do
local j = i+dual2
local ir, ii = v[i], v[i+1]
local jr, ji = v[j], v[j+1]
v[j], v[j+1] = ir - jr, ii - ji
v[i], v[i+1] = ir + jr, ii + ji
end
local theta = dir * math.pi / dual
local s, s2 = math.sin(theta), 2.0 * math.sin(theta * 0.5)^2
local wr, wi = 1.0, 0.0
for a=3,dual2-1,2 do
wr, wi = wr - s*wi - s2*wr, wi + s*wr - s2*wi
for i=a,a+2*(n-dual2),2*dual2 do
local j = i+dual2
local jr, ji = v[j], v[j+1]
local dr, di = wr*jr - wi*ji, wr*ji + wi*jr
local ir, ii = v[i], v[i+1]
v[j], v[j+1] = ir - dr, ii - di
v[i], v[i+1] = ir + dr, ii + di
end
end
dual = dual2
until dual >= n
end
その後のグラフ表示も上の動画の通りで、何の問題もない。ああもちろん、16384 点のグラフを全部真面目に描画したら重くて大変なので、画面解像度に合わせて間引きはしています。LuaJIT 楽しい。
メモリは結構食っているようです。上の状態で、25 MB ぐらい占有している。double
型 16384×2 点を Lua の数値型で保持しているわけだから、オーバーヘッドはまあ大きいだろうな。ffi.new(double[])
みたいにすれば少し節約できるかもしれないけど、そこまでしなくてもいいかなと思う。二次元データを使うようになったら考えたほうがいいかも。