U
    qh                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlm	Z
 d dlmZ d ddd	Zd
d ZdddddZdddddZG dd deZdS )    )annotationsN)OpRun)_concat_from_sequence)_cfft)_sliceaxisc                 G  s   t j|| dS )Nr   )npZconcatenate)r   args r   >/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/op_stft.py_concat   s    r   c                 C  sp   zt j| |dW S  tk
rj   t|dkrFt j| t|d d Y S t|D ]}t j| |d} qN|  Y S X d S )Nr      r   )r	   expand_dims	TypeErrorlentuplereversed)ar   xr   r   r   
_unsqueeze   s    r   Fint)
fft_lengthc                 C  s:  t | jd }dg}dg}|jd }	g }
t|D ]}|| }||	 }t| t|gt|g|}|jdd }|	|d  f}|jdd | |jdd  }tj|| jd}t||dd}t	||}|

| q0t|
ddd	}|j}|dd }td
d |D }||	df}t||}|| }t||||dd}|S )zApplies one dimensional FFT with window weights.

    torch defines the number of frames as:
    `n_frames = 1 + (len - n_fft) // hop_length`.
    r   r   Ndtyper   r   Znew_axisc                 s  s   | ]
}d V  qdS )r   Nr   ).0_r   r   r   	<genexpr>A   s     z_stft.<locals>.<genexpr>F)onesided	normalize)r   shaperanger   r	   arrayzerosr   r   r   appendr   r   reshape_dft)r   r   
hop_lengthn_frameswindowr"   Z	last_axisr   Zaxis2Zwindow_sizeseqfsbeginendZsliced_xZnew_dimmissingZ	new_shapeZcstZpad_sliced_xZun_sliced_xZnew_xZshape_xZshape_x_shortZshape_x_short_oneZwindow_shapeweightsZweighted_new_xresultr   r   r   _stft   s>    
 
    r5   c           5      C  s  dg}dg}dg}dg}| j d }	|||	d   }
g }g }g }t|	D ]}|}|d }tjt| t|gt|g||d d}t||d|dd}t|j }|d }t|t|t||g}tj||d}tj|j d| j	d	| }|j d
d }|| }|j d }|
||  }||f}||f}tj
|| j	d}tj
|| j	d}t|||dd} t|||dd}!t|t|t||g}tj||d}"t||"|dd}#|t| dd |t|#dd |t|!dd qFt|ddd}$t|ddd}%t|ddd}&|$jddd}'|%jddd}(|&jddd})|'|) }*|(|) }+tj|*dd},tj|+dd}-t|,|-dd}.|.j }/|.d}0t|0d}1|/dd
 }2t|2|dd}3|1|3}4|4S )zReverses of `stft`.r   r      r   r   r   T)r   r"   r#   )Z
fill_valuer   Nr   r   )r   Zkeepdims)r6   r   )r   r   )r$   r%   r	   Zsqueezer   r&   r*   r   fullr   r'   r   r(   r   r   sumr   r)   Z	transpose)5r   r   r+   r-   r"   ZzeroZoneZtwoZaxisfr,   Zexpected_signal_lenZseqrZseqiZseqcr/   r0   r1   Zframe_xZiftZn_dimsZn_dims_1ZslicedZytmpZctmpZshape_beginZn_leftsizeZn_rightZ
left_shapeZright_shaperightleftyZycZitmpyiZredrZrediZredcZresrZresiZrescrrriZrr0Zri0ZconcZresult_shapeZreshaped_resultZ
transposedZother_dimensionsZfinal_shapefinalr   r   r   _istftM   sp    






rA   c                   @  s   e Zd ZdddZdS )STFTNc           	      C  s|   |d kr&|d kr|j d }n
|j d }|}|d krDtj|f|jd}d|j d | |  }t||||||d}||jfS )Nr   r   r   r   )r"   )r$   r	   Zonesr   r5   Zastype)	selfr   Z
frame_stepr-   Zframe_lengthr"   r+   r,   resr   r   r   _run   s    
z	STFT._run)NNN)__name__
__module____qualname__rE   r   r   r   r   rB      s   rB   )F)F)
__future__r   Znumpyr	   Zonnx.reference.op_runr   Z*onnx.reference.ops.op_concat_from_sequencer   Zonnx.reference.ops.op_dftr   r*   Zonnx.reference.ops.op_slicer   r   r   r5   rA   rB   r   r   r   r   <module>   s   /Q