-module(mlx_fft_nif). %% FFT and signal processing NIF functions -export([ %% 1D FFT operations fft/2, ifft/2, rfft/2, irfft/2, %% 2D FFT operations fft2/2, ifft2/2, rfft2/2, irfft2/2, %% N-D FFT operations fftn/3, ifftn/3, rfftn/3, irfftn/3, %% FFT shift operations fftshift/2, ifftshift/2, %% Frequency utilities fftfreq/3, rfftfreq/3, %% Signal processing convolve/3, correlate/3, %% Window functions hann/1, hamming/1, blackman/1, bartlett/1, %% Spectral functions stft/4, istft/3 ]). %% Load the NIF library -on_load(init/0). -spec init() -> ok | {error, term()}. init() -> PrivDir = case code:priv_dir(mlx) of {error, _} -> EbinDir = filename:dirname(code:which(?MODULE)), AppPath = filename:dirname(EbinDir), filename:join(AppPath, "priv"); Path -> Path end, erlang:load_nif(filename:join(PrivDir, "mlx_fft_nif"), 0). %% NIF stubs - these will be replaced by the actual NIF implementations %% 1D FFT operations -spec fft(reference(), integer() | undefined) -> {ok, reference()} | {error, term()}. fft(_Input, _N) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec ifft(reference(), integer() | undefined) -> {ok, reference()} | {error, term()}. ifft(_Input, _N) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec rfft(reference(), integer() | undefined) -> {ok, reference()} | {error, term()}. rfft(_Input, _N) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec irfft(reference(), integer() | undefined) -> {ok, reference()} | {error, term()}. irfft(_Input, _N) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% 2D FFT operations -spec fft2(reference(), [integer()] | undefined) -> {ok, reference()} | {error, term()}. fft2(_Input, _S) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec ifft2(reference(), [integer()] | undefined) -> {ok, reference()} | {error, term()}. ifft2(_Input, _S) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec rfft2(reference(), [integer()] | undefined) -> {ok, reference()} | {error, term()}. rfft2(_Input, _S) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec irfft2(reference(), [integer()] | undefined) -> {ok, reference()} | {error, term()}. irfft2(_Input, _S) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% N-D FFT operations -spec fftn(reference(), [integer()] | undefined, [integer()] | undefined) -> {ok, reference()} | {error, term()}. fftn(_Input, _S, _Axes) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec ifftn(reference(), [integer()] | undefined, [integer()] | undefined) -> {ok, reference()} | {error, term()}. ifftn(_Input, _S, _Axes) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec rfftn(reference(), [integer()] | undefined, [integer()] | undefined) -> {ok, reference()} | {error, term()}. rfftn(_Input, _S, _Axes) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec irfftn(reference(), [integer()] | undefined, [integer()] | undefined) -> {ok, reference()} | {error, term()}. irfftn(_Input, _S, _Axes) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% FFT shift operations -spec fftshift(reference(), [integer()] | undefined) -> {ok, reference()} | {error, term()}. fftshift(_Input, _Axes) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec ifftshift(reference(), [integer()] | undefined) -> {ok, reference()} | {error, term()}. ifftshift(_Input, _Axes) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Frequency utilities -spec fftfreq(integer(), number(), atom()) -> {ok, reference()} | {error, term()}. fftfreq(_N, _D, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec rfftfreq(integer(), number(), atom()) -> {ok, reference()} | {error, term()}. rfftfreq(_N, _D, _Dtype) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Signal processing -spec convolve(reference(), reference(), atom()) -> {ok, reference()} | {error, term()}. convolve(_Input, _Kernel, _Mode) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec correlate(reference(), reference(), atom()) -> {ok, reference()} | {error, term()}. correlate(_Input, _Kernel, _Mode) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Window functions -spec hann(integer()) -> {ok, reference()} | {error, term()}. hann(_N) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec hamming(integer()) -> {ok, reference()} | {error, term()}. hamming(_N) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec blackman(integer()) -> {ok, reference()} | {error, term()}. blackman(_N) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec bartlett(integer()) -> {ok, reference()} | {error, term()}. bartlett(_N) -> erlang:nif_error({nif_not_loaded, ?MODULE}). %% Spectral functions -spec stft(reference(), reference(), integer(), integer()) -> {ok, reference()} | {error, term()}. stft(_Input, _Window, _NpFft, _HopLength) -> erlang:nif_error({nif_not_loaded, ?MODULE}). -spec istft(reference(), reference(), integer()) -> {ok, reference()} | {error, term()}. istft(_Stft, _Window, _HopLength) -> erlang:nif_error({nif_not_loaded, ?MODULE}).