Portál AbcLinuxu, 30. října 2025 06:08
complex = {__mt={} }
function complex.new(r, i)
local new={real=r, imaginary=i or 0}
setmetatable(new,complex.__mt)
return new
end
function complex.__mt.__add(c1, c2)
return complex.new(c1.real + c2.real, c1.imaginary + c2.imaginary)
end
function complex.__mt.__sub(c1, c2)
return complex.new(c1.real - c2.real, c1.imaginary - c2.imaginary)
end
function complex.__mt.__mul(c1, c2)
return complex.new(c1.real * c2.real - c1.imaginary * c2.imaginary,
c1.real * c2.imaginary + c1.imaginary * c2.real)
end
function complex.expi(i)
return complex.new(math.cos(i),math.sin(i))
end
function complex.__mt.__tostring(c)
return "("..c.real..","..c.imaginary..")"
end
--[[---------------------------------------------------------------------
Cooley–Tukey Fast Fourier Transformation -
Zdroj: https://en.wikipedia.org/wiki/Cooley-Tukey_FFT_algorithm -
]]-----------------------------------------------------------------------
function FFT(vect)
local n=#vect
if n<=1 then return vect end
local odd,even={},{}
for i=1,n,2 do
odd[#odd+1]=vect[i]
even[#even+1]=vect[i+1]
end
FFT(even)
FFT(odd)
for k=1,n/2 do
local t=even[k] * complex.expi(-2*math.pi*(k-1)/n)
vect[k] = odd[k] + t
vect[k+n/2] = odd[k] - t
end
return vect
end
--[[-----------------------------------------------------------------------
Inverse Fast Fourier Transformation -
]]-------------------------------------------------------------------------
function IFFT(amplitudes)
local N = #amplitudes
local input = 1 / N
local i=nil
for i=1, N do
amplitudes[i].imaginary = -amplitudes[i].imaginary
end
FFT(amplitudes)
for i=1, N do
amplitudes[i].imaginary = -amplitudes[i].imaginary
amplitudes[i].real = amplitudes[i].real * input
amplitudes[i].imaginary = amplitudes[i].imaginary * input
end
return amplitudes
end
function toComplex(vector)
vect={}
for r,i in ipairs(vector) do
vect[r]=complex.new(i)
end
return vect
end
-- test
data = toComplex{1, 1, 1, 1, 0, 0, 0, 0}
print("orig:", unpack(data))
print("fft :", unpack(FFT(data)))
print("ifft:", unpack(IFFT(data)))
Řešení dotazu:
neumim dělat lulu :D :D :D :D ale ten tvuj lulu zdrojáček mi vrací
orig: (1,0) (1,0) (1,0) (1,0) (0,0) (0,0) (0,0) (0,0) fft : (4,0) (1,-2.4142135623731) (0,0) (1,-0.41421356237309) (0,0) (1,0.41421356237309) (0,0) (1,2.4142135623731) ifft: (1,-0) (1,-5.5511151231258e-17) (1,2.4894981252574e-17) (1,-5.5511151231258e-17) (5.5511151231258e-17,0) (5.5511151231258e-17,5.5511151231258e-17) (0,-2.4894981252574e-17) (5.5511151231258e-17,5.5511151231258e-17)
noa to é na mínus sedmnáctou (jako nakalkulačce hele :O ;D) sou tak děsně mrňavý čísla že je asi jako mužem považovat za nuly takže to máš asi jako dobře :D ;D
joa ty mrňavý čisilka se při výpočtech berou z nepřesnosti s děláním s floatama/číslama s plovoucí desetinou tečkou hele :O ;D
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.