Portál AbcLinuxu, 8. května 2025 04:19

Dotaz: fast fourier v Lua

25.4.2022 10:33 martin
fast fourier v Lua
Přečteno: 584×
Odpovědět | Admin
Ahoj, Potřebuji využít v jedné aplikaci FFT.
Něco jsem našel na Rosetta code.
FFT funguje ale inverzní FFT vrací něco jiného.
help needed :(
díky
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:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Gréta avatar 25.4.2022 19:48 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: fast fourier v Lua
Odpovědět | | Sbalit | Link | Blokovat | Admin

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

Zelená energetická soustava založená na obnovitelnejch zdrojích energie versus realnej svět 🤡🇪🇸
Gréta avatar 25.4.2022 19:49 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: fast fourier v Lua

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

25.4.2022 22:33 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: fast fourier v Lua
Čísla ináč zapísané. Viď: Vědecký zápis čísel.
debian.plus@protonmail.com
26.4.2022 02:56 .
Rozbalit Rozbalit vše Re: fast fourier v Lua
On nemluví o zápisu, ale o hodnotě, hňupe.
Řešení 1× (Gréta)
26.4.2022 05:44 martin
Rozbalit Rozbalit vše Re: fast fourier v Lua
Ahoj, nějak se mi tu potratil muj další příspěvek
Nebo jsem dal jen náhled a pak ho neodeslal :/
co jsem psal hned po tom.
Bylo to ve spěchu takže jsem si nevšiml že číslo končí
s e-017. Ve své slepotě jsem viděl jen -5,587543235696549
To je celé.
Díky za reakce.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.