Skip to content

Commit 6234d53

Browse files
committed
FEAT: Adding new functions: inplace, r2c and c2r ffts.
1 parent 0f63dbd commit 6234d53

File tree

2 files changed

+404
-6
lines changed

2 files changed

+404
-6
lines changed

arrayfire/signal.py

Lines changed: 371 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,6 @@ def ifft2(signal, dim0 = None, dim1 = None , scale = None):
301301

302302
dims = signal.dims()
303303

304-
if (len(dims) < 2):
305-
return ifft(signal)
306-
307304
if dim0 is None:
308305
dim0 = dims[0]
309306

@@ -359,9 +356,6 @@ def ifft3(signal, dim0 = None, dim1 = None , dim2 = None, scale = None):
359356

360357
dims = signal.dims()
361358

362-
if (len(dims) < 3):
363-
return ifft2(signal)
364-
365359
if dim0 is None:
366360
dim0 = dims[0]
367361

@@ -379,6 +373,377 @@ def ifft3(signal, dim0 = None, dim1 = None , dim2 = None, scale = None):
379373
ct.c_longlong(dim0), ct.c_longlong(dim1), ct.c_longlong(dim2)))
380374
return output
381375

376+
def fft_inplace(signal, scale = None):
377+
"""
378+
In-place Fast Fourier Transform: 1D
379+
380+
Parameters
381+
----------
382+
383+
signal: af.Array
384+
A 1 dimensional signal or a batch of 1 dimensional signals.
385+
386+
scale: optional: scalar. default: None.
387+
- Specifies the scaling factor.
388+
- If None, scale is set to 1.
389+
390+
"""
391+
392+
if scale is None:
393+
scale = 1.0
394+
395+
safe_call(backend.get().af_fft_inplace(signal.arr, ct.c_double(scale)))
396+
397+
def fft2_inplace(signal, scale = None):
398+
"""
399+
In-place Fast Fourier Transform: 2D
400+
401+
Parameters
402+
----------
403+
404+
signal: af.Array
405+
A 2 dimensional signal or a batch of 2 dimensional signals.
406+
407+
scale: optional: scalar. default: None.
408+
- Specifies the scaling factor.
409+
- If None, scale is set to 1.
410+
411+
"""
412+
413+
if scale is None:
414+
scale = 1.0
415+
416+
safe_call(backend.get().af_fft2_inplace(signal.arr, ct.c_double(scale)))
417+
418+
def fft3_inplace(signal, scale = None):
419+
"""
420+
In-place Fast Fourier Transform: 3D
421+
422+
Parameters
423+
----------
424+
425+
signal: af.Array
426+
A 3 dimensional signal or a batch of 3 dimensional signals.
427+
428+
scale: optional: scalar. default: None.
429+
- Specifies the scaling factor.
430+
- If None, scale is set to 1.
431+
"""
432+
433+
if scale is None:
434+
scale = 1.0
435+
436+
output = Array()
437+
safe_call(backend.get().af_fft3_inplace(signal.arr, ct.c_double(scale)))
438+
439+
def ifft_inplace(signal, scale = None):
440+
"""
441+
Inverse In-place Fast Fourier Transform: 1D
442+
443+
Parameters
444+
----------
445+
446+
signal: af.Array
447+
A 1 dimensional signal or a batch of 1 dimensional signals.
448+
449+
scale: optional: scalar. default: None.
450+
- Specifies the scaling factor.
451+
- If None, scale is set to 1.0 / (signal.dims()[0])
452+
"""
453+
454+
if scale is None:
455+
dim0 = signal.dims()[0]
456+
scale = 1.0/float(dim0)
457+
458+
safe_call(backend.get().af_ifft_inplace(signal.arr, ct.c_double(scale)))
459+
460+
def ifft2_inplace(signal, scale = None):
461+
"""
462+
Inverse In-place Fast Fourier Transform: 2D
463+
464+
Parameters
465+
----------
466+
467+
signal: af.Array
468+
A 2 dimensional signal or a batch of 2 dimensional signals.
469+
470+
scale: optional: scalar. default: None.
471+
- Specifies the scaling factor.
472+
- If None, scale is set to 1.0 / (signal.dims()[0] * signal.dims()[1])
473+
"""
474+
475+
dims = signal.dims()
476+
477+
if scale is None:
478+
dim0 = dims[0]
479+
dim1 = dims[1]
480+
scale = 1.0/float(dim0 * dim1)
481+
482+
safe_call(backend.get().af_ifft2_inplace(signal.arr, ct.c_double(scale)))
483+
484+
def ifft3_inplace(signal, scale = None):
485+
"""
486+
Inverse In-place Fast Fourier Transform: 3D
487+
488+
Parameters
489+
----------
490+
491+
signal: af.Array
492+
A 3 dimensional signal or a batch of 3 dimensional signals.
493+
494+
scale: optional: scalar. default: None.
495+
- Specifies the scaling factor.
496+
- If None, scale is set to 1.0 / (signal.dims()[0] * signal.dims()[1] * signal.dims()[2]).
497+
"""
498+
499+
dims = signal.dims()
500+
501+
if scale is None:
502+
dim0 = dims[0]
503+
dim1 = dims[1]
504+
dim2 = dims[2]
505+
scale = 1.0 / float(dim0 * dim1 * dim2)
506+
507+
safe_call(backend.get().af_ifft3_inplace(signal.arr, ct.c_double(scale)))
508+
509+
def fft_r2c(signal, dim0 = None , scale = None):
510+
"""
511+
Real to Complex Fast Fourier Transform: 1D
512+
513+
Parameters
514+
----------
515+
516+
signal: af.Array
517+
A 1 dimensional signal or a batch of 1 dimensional signals.
518+
519+
dim0: optional: int. default: None.
520+
- Specifies the size of the output.
521+
- If None, dim0 is calculated to be the first dimension of `signal`.
522+
523+
scale: optional: scalar. default: None.
524+
- Specifies the scaling factor.
525+
- If None, scale is set to 1.
526+
527+
Returns
528+
-------
529+
530+
output: af.Array
531+
A complex af.Array containing the non-redundant parts of the full FFT.
532+
533+
"""
534+
535+
if dim0 is None:
536+
dim0 = 0
537+
538+
if scale is None:
539+
scale = 1.0
540+
541+
output = Array()
542+
safe_call(backend.get().af_fft_r2c(ct.pointer(output.arr), signal.arr, ct.c_double(scale), ct.c_longlong(dim0)))
543+
return output
544+
545+
def fft2_r2c(signal, dim0 = None, dim1 = None , scale = None):
546+
"""
547+
Real to Complex Fast Fourier Transform: 2D
548+
549+
Parameters
550+
----------
551+
552+
signal: af.Array
553+
A 2 dimensional signal or a batch of 2 dimensional signals.
554+
555+
dim0: optional: int. default: None.
556+
- Specifies the size of the output.
557+
- If None, dim0 is calculated to be the first dimension of `signal`.
558+
559+
dim1: optional: int. default: None.
560+
- Specifies the size of the output.
561+
- If None, dim1 is calculated to be the second dimension of `signal`.
562+
563+
scale: optional: scalar. default: None.
564+
- Specifies the scaling factor.
565+
- If None, scale is set to 1.
566+
567+
Returns
568+
-------
569+
570+
output: af.Array
571+
A complex af.Array containing the non-redundant parts of the full FFT.
572+
573+
"""
574+
if dim0 is None:
575+
dim0 = 0
576+
577+
if dim1 is None:
578+
dim1 = 0
579+
580+
if scale is None:
581+
scale = 1.0
582+
583+
output = Array()
584+
safe_call(backend.get().af_fft2_r2c(ct.pointer(output.arr), signal.arr, ct.c_double(scale),
585+
ct.c_longlong(dim0), ct.c_longlong(dim1)))
586+
return output
587+
588+
def fft3_r2c(signal, dim0 = None, dim1 = None , dim2 = None, scale = None):
589+
"""
590+
Real to Complex Fast Fourier Transform: 3D
591+
592+
Parameters
593+
----------
594+
595+
signal: af.Array
596+
A 3 dimensional signal or a batch of 3 dimensional signals.
597+
598+
dim0: optional: int. default: None.
599+
- Specifies the size of the output.
600+
- If None, dim0 is calculated to be the first dimension of `signal`.
601+
602+
dim1: optional: int. default: None.
603+
- Specifies the size of the output.
604+
- If None, dim1 is calculated to be the second dimension of `signal`.
605+
606+
dim2: optional: int. default: None.
607+
- Specifies the size of the output.
608+
- If None, dim2 is calculated to be the third dimension of `signal`.
609+
610+
scale: optional: scalar. default: None.
611+
- Specifies the scaling factor.
612+
- If None, scale is set to 1.
613+
614+
Returns
615+
-------
616+
617+
output: af.Array
618+
A complex af.Array containing the non-redundant parts of the full FFT.
619+
620+
"""
621+
if dim0 is None:
622+
dim0 = 0
623+
624+
if dim1 is None:
625+
dim1 = 0
626+
627+
if dim2 is None:
628+
dim2 = 0
629+
630+
if scale is None:
631+
scale = 1.0
632+
633+
output = Array()
634+
safe_call(backend.get().af_fft3_r2c(ct.pointer(output.arr), signal.arr, ct.c_double(scale),
635+
ct.c_longlong(dim0), ct.c_longlong(dim1), ct.c_longlong(dim2)))
636+
return output
637+
638+
def _get_c2r_dim(dim, is_odd):
639+
return 2 *(dim - 1) + int(is_odd)
640+
641+
def fft_c2r(signal, is_odd = False, scale = None):
642+
"""
643+
Real to Complex Fast Fourier Transform: 1D
644+
645+
Parameters
646+
----------
647+
648+
signal: af.Array
649+
A 1 dimensional signal or a batch of 1 dimensional signals.
650+
651+
is_odd: optional: Boolean. default: False.
652+
- Specifies if the first dimension of output should be even or odd.
653+
654+
scale: optional: scalar. default: None.
655+
- Specifies the scaling factor.
656+
- If None, scale is set to 1 / (signal.dims()[0]).
657+
658+
Returns
659+
-------
660+
661+
output: af.Array
662+
A real af.Array containing the full output of the fft.
663+
664+
"""
665+
666+
667+
if scale is None:
668+
dim0 = _get_c2r_dim(signal.dims()[0], is_odd)
669+
scale = 1.0/float(dim0)
670+
671+
output = Array()
672+
safe_call(backend.get().af_fft_c2r(ct.pointer(output.arr), signal.arr, ct.c_double(scale), is_odd))
673+
return output
674+
675+
def fft2_c2r(signal, is_odd = False, scale = None):
676+
"""
677+
Real to Complex Fast Fourier Transform: 2D
678+
679+
Parameters
680+
----------
681+
682+
signal: af.Array
683+
A 2 dimensional signal or a batch of 2 dimensional signals.
684+
685+
is_odd: optional: Boolean. default: False.
686+
- Specifies if the first dimension of output should be even or odd.
687+
688+
scale: optional: scalar. default: None.
689+
- Specifies the scaling factor.
690+
- If None, scale is set to 1 / (signal.dims()[0] * signal.dims()[1]).
691+
692+
Returns
693+
-------
694+
695+
output: af.Array
696+
A real af.Array containing the full output of the fft.
697+
698+
"""
699+
dims = signal.dims()
700+
701+
if scale is None:
702+
dim0 = _get_c2r_dim(dims[0], is_odd)
703+
dim1 = dims[1]
704+
scale = 1.0/float(dim0 * dim1)
705+
706+
output = Array()
707+
safe_call(backend.get().af_fft2_c2r(ct.pointer(output.arr), signal.arr, ct.c_double(scale), is_odd))
708+
return output
709+
710+
def fft3_c2r(signal, is_odd = False, scale = None):
711+
"""
712+
Real to Complex Fast Fourier Transform: 3D
713+
714+
Parameters
715+
----------
716+
717+
signal: af.Array
718+
A 3 dimensional signal or a batch of 3 dimensional signals.
719+
720+
is_odd: optional: Boolean. default: False.
721+
- Specifies if the first dimension of output should be even or odd.
722+
723+
scale: optional: scalar. default: None.
724+
- Specifies the scaling factor.
725+
- If None, scale is set to 1 / (signal.dims()[0] * signal.dims()[1] * signal.dims()[2]).
726+
727+
Returns
728+
-------
729+
730+
output: af.Array
731+
A real af.Array containing the full output of the fft.
732+
733+
"""
734+
dims = signal.dims()
735+
736+
if scale is None:
737+
dim0 = _get_c2r_dim(dims[0], is_odd)
738+
dim1 = dims[1]
739+
dim2 = dims[2]
740+
scale = 1.0/float(dim0 * dim1 * dim2)
741+
742+
output = Array()
743+
safe_call(backend.get().af_fft3_c2r(ct.pointer(output.arr), signal.arr, ct.c_double(scale), is_odd))
744+
return output
745+
746+
382747
def dft(signal, odims=(None, None, None, None), scale = None):
383748

384749
"""

0 commit comments

Comments
 (0)