{ "cells": [ { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "using FFTW" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dft (generic function with 1 method)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function dft(f)\n", " if ndims(f) == 1\n", " M = length(f)\n", " [sum([x * exp(-2im*pi*u * (idx - 1) / M ) for (idx, x) in enumerate(f)]) for u=0:M-1]\n", " elseif ndims(f) == 2\n", " M, N = size(f)\n", " [sum([f[x+1, y+1] * exp(-2im*pi*(u*x/M + v*y/M)) for x=0:M-1, y=0:N-1]) for u=0:M-1, v=0:N-1]\n", " else\n", " error(\"Wrong dimension\")\n", " end\n", "end " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "fft2d (generic function with 1 method)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function fft1d(array)\n", " #= https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm\n", " #\n", " # Xk = Ek + e^(-2pi*i/N * k) * Ok\n", " #\n", " # Ek = Event DFT\n", " # Ok = Odd DFT\n", " #\n", " =#\n", " N = size(array)[1]\n", " if N == 1\n", " return array\n", " elseif N % 2 != 0\n", " error(\"Wrong dimension\")\n", " end\n", "\n", " # people count from zero while julia counts from 1\n", " # either way, it should be the same name\n", " even = fft1d(array[1:2:end])\n", " odd = fft1d(array[2:2:end])\n", " w = exp.(-2im * pi / N * [i for i=0:N/2-1])\n", " half1 = even .+ (odd .* w)\n", " half2 = even .- (odd .* w)\n", " vcat(half1,half2)\n", "end\n", "\n", "function fft2d(matrix)\n", " if ndims(matrix) != 2\n", " error(\"I dont handle other than 2 dimension matrix\")\n", " end\n", " matrix_fft1 = hcat(fft1d.(eachrow(matrix))...)\n", " hcat(fft1d.(eachrow(matrix_fft1))...)\n", "end" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8-element Array{Complex{Float64},1}:\n", " 36.0 + 0.0im \n", " -4.0 + 9.65685424949238im \n", " -4.0 + 4.0im \n", " -4.0 + 1.6568542494923806im\n", " -4.0 + 0.0im \n", " -4.0 - 1.6568542494923806im\n", " -4.0 - 4.0im \n", " -4.0 - 9.65685424949238im " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "8-element Array{Complex{Float64},1}:\n", " 36.0 - 0.0im \n", " -4.0 + 9.65685424949238im \n", " -4.0 + 4.0im \n", " -4.0 + 1.6568542494923797im\n", " -4.0 + 0.0im \n", " -3.9999999999999996 - 1.6568542494923797im\n", " -3.9999999999999996 - 4.0im \n", " -3.9999999999999987 - 9.65685424949238im " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "8-element Array{Complex{Float64},1}:\n", " 36.0 - 0.0im \n", " -4.000000000000003 + 9.65685424949238im \n", " -4.000000000000002 + 3.9999999999999982im \n", " -4.0 + 1.656854249492386im \n", " -4.0 - 3.91886975727153e-15im\n", " -4.0000000000000115 - 1.6568542494923912im \n", " -4.000000000000018 - 4.000000000000005im \n", " -3.9999999999999725 - 9.656854249492369im " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "2×8 Array{Complex{Float64},2}:\n", " 72.0+0.0im -8.0+19.3137im -8.0+8.0im … -8.0-8.0im -8.0-19.3137im\n", " 0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "2×8 Array{Complex{Float64},2}:\n", " 72.0-0.0im -8.0+19.3137im -8.0+8.0im … -8.0-8.0im -8.0-19.3137im\n", " 0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im 0.0+0.0im " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "2×8 Array{Complex{Float64},2}:\n", " 72.0-0.0im -8.0-7.83774e-15im … -8.0-3.39081e-13im\n", " 0.0-4.40873e-15im 0.0+4.89859e-16im 0.0-1.87804e-13im" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(fft(1:8))\n", "display(fft1d(1:8))\n", "display(dft(1:8))\n", "\n", "\n", "display(fft([[1:8...] [1:8...]]'))\n", "display(fft2d([[1:8...] [1:8...]]'))\n", "display(dft([[1:8...] [1:8...]]'))\n" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.2.0-DEV", "language": "julia", "name": "julia-1.2" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.2.0" } }, "nbformat": 4, "nbformat_minor": 2 }